[iOS_Swift] mutating에 대하여

2022. 2. 3. 10:20Programming/iOS_Swift

  오늘은 구조체와 열거형에서 사용되는 mutating 키워드에 대해 다뤄보려고 한다. 먼저 늘 그렇듯 문서부터 살펴보자!

  중요 부분만 해석해보면, 기본적으로 클래스가 아닌 구조체나 열거형은 값 타입이므로 인스턴스 메서드 내에서 구조체나 열거형의 프로퍼티들을 수정할 수 없다. 그런데 만약 사용자가 구조체나 열거형의 특정 인스턴스 메서드를 통해 어떤 프로퍼티의 값을 수정할 필요가 있다면 수정할 수 있게 만들 수 있다! 라고 설명하고 있다. 그걸 가능하게 해주는 것이 바로 mutating 키워드이다. 간단한 예시를 통해 보자.

  군인 구조체의 인스턴스 메서드 하드트레이닝을 통해서 skill 프로퍼티를 1씩 증가시켜주려고 했다. 그런데 위와 같은 컴파일 에러가 발생한다. 구조체는 값 타입이기 때문에 기본적으로 모든 프로퍼티(self 프로퍼티 포함)가 immutable이기 때문이다. 여기서 구조체의 프로퍼티 self를 mutable로 만들어주는게 바로 mutating 키워드이다.

mutating 키워드를 추가해줬다.

  mutating 키워드를 추가해주니 에러가 사라졌다.

  

 mutating 메서드 내에서 self 프로퍼티를 활용하면 인스턴스를 완전히 새로운 인스턴스로 바꿔줄 수도 있다.

    기존에 스킬이 1이었던 군인이 하드 트레이닝을 통해 완전히 새로운 인스턴스인 스킬 5짜리 군인으로 재탄생한 것을 확인할 수 있다.

 

mutating의 특징

1. mutating 키워드를 사용하는 구조체나 열거형의 인스턴스는 반드시 변수여야 한다.

  당연한 얘기지만 프로퍼티 값을 변화시켜주려면 상수가 아닌 변수여야 한다.

상수로 인스턴스를 만들면 바로 에러가 뜨는걸 확인할 수 있다.

2. mutating 키워드는 값 타입에서만 사용할 수 있다.

  참조타입인 클래스에서는 mutating 키워드를 사용할 수 없다!

  억지로 써보려고 하면 이렇게 바로 클래스의 인스턴스 메서드에서는 쓸 수 없다고 에러를 뱉어버린다.