본문 바로가기

Swift

mutating

728x90

mutating을 본격적으로 공부하기 위해서는 구조체에 대해서 제대로 알고 있어야 합니다.

 

Swift에서 클래스는 참조 타입이고 구조체, 열거형은 값 타입입니다. 값 타입인 구조체에서는 인스턴스 메소드 내에서 프로퍼티들을 수정할 수 없게 되어 있습니다. 따라서, 이러한 프로퍼티들은 구조체 안의 메소드에서 수정을 해주기 위해 mutating이라는 키워드를 사용하게 됩니다. 

mutating

특정 메소드 내에서 구조체 또는 열거형의 프로퍼티들을 수정해야 하는 경우, 해당 메소드의 동작을 변경하도록 하는 것

 

간단한 코드를 통해서 알아보도록 하겠습니다.

struct Person {
    let name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name.uppercased()
        self.age = age
    }
    
    func changeAge() { 
        age = 10       // Error
    }
}

위와 같이 Person이라는 구조체를 만들어보았습니다.

Person이라는 구조체는 name과 age를 프로퍼티로 갖고 있고 changeAge()라는 메소드를 갖고 있습니다. 그리고 init을 통해 초기화도 해주었습니다. 보기에는 정상적인 코드인 것 같지만 바로 에러가 뜨는 것을 확인할 수 있습니다. 

 

에러의 이유는 다음과 같습니다.

Cannot assign to property: 'self' is immutable

이런 에러는 바로 값 타입인 구조체에서는 메소드 안의 값을 수정할 수 없기 때문에 일어나는 것입니다.

 

struct Person {
    let name: String
    var age: Int
    
    init(name: String, age: Int) {
        self.name = name.uppercased()
        self.age = age
    }
    
    mutating func changeAge() {
        age = 20
    }
}

var man = Person(name: "SOKYTE", age: 25)
man.changeAge()

print(man.age)

mutating 키워드를 추가하면 초기화에서는 25살로 되지만, changeAge() 메소드를 통해서 age가 20으로 바뀐 것을 확인할 수 있습니다.

 

'Swift' 카테고리의 다른 글

some  (0) 2022.04.29
Any/AnyObject  (0) 2022.04.29
Generic  (0) 2022.04.29
atomic VS nonatomic  (0) 2022.04.26
Initialization - 구조체/클래스 초기화  (0) 2022.04.21