Mutating
❓struct
사용할 때 mutating 키워드를 많이 사용하지만 이것을 왜 붙여야하는 것일까?
- value type(값 타입)에서는 property는 메서드에 의해서 변경될 수 없다.
- 이 문제를 해결하기 위해
mutating
을 사용한다.
그렇다면 왜 값 타입 내부의 메서드는 property를 수정할 수 없을까?
이것을 알기 위해선 일단 값 타입의 COW(copy-on-write)에 대해서 알아야한다.
COW
- COW는 데이터를 복사하고자 할 때, 동일한 값을 참조하고 있다가 데이터가 변경될 때 비로소 실제로 복사해 값을 변경하는 방법이다.
- 다시 말해 1) 값을 참조 ➡️ 2) 변경이 일어나면 그때 복사 ➡️ 3) 변경 값 저장
- 이해하기 어려우니 예제 코드로 이해해보자.
struct의 COW(copy-on-write)
값 타입중 struct를 기준으로 말해본다면...
- struct에서 대입연산(또는 할당, = )을 한다면 모든 값이 복사되어야한다. 그 과정에서 모든 값이 복사되어야한다.
- 만약 struct를 데이터 모델로 사용하고 그 덩치가 커진다면 수정하지 않는 데이터를 복사해둬야하는 쓸데 없는 비용이 발생한다.(같은 값인데 굳이 다 복사해야한다.)
- 때문에 이 문제를 해결하기 위해서 COW라는 개념이 도입됐다.
Mutating의 이유
- swift는 값이 변경될 때 COW로 최적화를 진행한다.
- 만약 struct의 property 값이 변경된다면, var 키워드로 인해 컴파일러는 값이 변경될 것을 예상하고있고, 직관적으로 알 수 있다.
- 하지만 메서드가 property를 변경하려고 한다면 값 복사를 언제해야하는지 알 수가 없다.(앞서 거론한 것처럼 값을 복사하는 것은 값이 변경될 때이다.)
- 때문에 mutating 키워드를 사용함으로써 해당 메서드는 property를 변경해줄 것이라는 것을 컴파일러에게 알려주고 값이 복사되는 것을 예상하게끔 한다.