본문 바로가기
👨‍💻 프로그래밍/🍎 iOS 개발

🍎 Swift의 mutating 알아보기 (feat. Cannot assign to property: 'self' is immutable)

by 개발자 진개미 2024. 9. 1.
반응형

Swift에서 struct

Swift에는 classstruct으로 객체를 표현합니다. struct은 SwiftUI의 기본이 되기도 하고, 현대 프로그래밍의 개념들에 영향을 많이 받은 단위입니다. 

현대 프로그래밍의 개념들이라 하면 흔히 아래와 같은 특징들을 말합니다.

  • 최대한 변하지 않게 한다
  • 유용한 문법 설탕을 많이 제공한다
  • 명시적이다

 

struct도 비슷하게 

  • value type이라 주고받을 때 새로운 값을 만들고,
  • Computed Property로 개념상으로는 property인데 내부적인 계산을 해야 하는 값을 property처럼 다룰 수 있게 하고,
  • 내부 property를 변화시키는 건 명시적으로 mutating을 붙이도록 돼 있습니다.

 

여기서 3번째 mutating에 대해 자세히 알아 보겠습니다!


struct은 기본적으로 Property를 변경하지 않아야 한다. 하지만 해야 한다면?

평범한 Swift struct를 만들어 보겠습니다.

struct Point {
    var x: Int
    var y: Int
}

 

여기에 평범해 보이는 moveHorizontal이라는 함수를 추가해 보겠습니다.

struct Point {
    var x: Int
    var y: Int
    
    func moveHorizontal(size: Int) {
        x += size
    }
}

 

하지만 이 코드는 컴파일 에러가 납니다.

 

왜냐하면 moveHorizontal이라는 함수는 Point의 instance property를 변경하기 때문에 mutating을 붙여야 합니다. Swift의 struct에서는 모든 property를 변경하는 함수에 mutating을 붙이지 않으면 컴파일 에러가 나게 돼 있습니다.

 

struct Point {
    var x: Int
    var y: Int
    
    mutating func moveHorizontal(size: Int) {
        x += size
    }
}

Swift Compiler는 사실 다 알고 있다

보통 이런 keyword는 컴파일러의 Type Checking에 도움을 주거나, 성능 최적화 때문에 쓰는 경우가 많습니다. 예를 들면 Swift의 @fronzen이나 final, Kotlin의 tailrec은 모두 성능 최적화에 쓰입니다.

하지만 mutating은 그렇지 않습니다. 사실 Compiler는 특정 함수가 mutating 함수인지 아닌지 아주 잘 알고 있습니다. 그렇지 않다면 mutating인 함수에 mutating을 쓰지 않았을 때 바로 잘 알려 줄 수가 없겠죠? mutating은 컴파일러가 아닌 프로그래머를 위해 있다고 합니다. 특정 함수가 mutating 함수인지 그렇지 않은 함수인지 직접 지정해 줘야 하면...

  • 함수를 정의할 때 이게 mutating이어야 할까 다시 1번 생각해 보게 됨
  • 함수를 쓸 때 부수효과에 대해 1번 더 생각해 보게 됨

 

이런 효과가 있기 때문에 mutating이 있습니다!


반응형