[iOS / Swift] Swift 문법을 알아보자! - 18편 : mutating

프린스송·2021년 7월 13일
5

Swift 문법

목록 보기
18/21
post-thumbnail
post-custom-banner

안녕하세요~~ 오늘은 mutating에 대해서 공부를 해보겠습니다. 이것 역시 저번 포스팅에서 다룬 extension처럼 그렇게 어려운 문법이 아니므로 힘들지 않게 공부를 하고 넘어가겠습니다. 그럼 더 자세히 알아보죠~


mutating

mutating을 본격적으로 공부하기 위해서는 일단 구조체를 다시 복습을 해야됩니다!! 제가 포스팅했던 곳으로 가서 한번 읽고 오도록 하죠!

스위프트에서 클래스는 참조타입이고 구조체와 열거형은 값 타입입니다. 값 타입인 구조체에서는 인스턴스 메소드 내에서 프로퍼티들을 수정할 수 없게 되어 있습니다. 따라서 이러한 프로퍼티들을 구조체 안의 메소드에서 수정을 해주기 위해 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       //에러!
    }
}

다음과 같은 간단한 구조체를 생성하였습니다. Person이라는 구조체는 name과 age를 프로퍼티로 가지고 changeAge()라는 메소드도 가지고 있습니다. 그리고 init을 통해 초기화도 해주었습니다. 보기에는 완벽한 코드인 것 같지만 바로 에러가 뜨는 것을 확인할 수 있습니다.
Cannot assign property라는 에러를 발견했네요. 이것이 바로 값 타입인 구조체에서는 메소드안의 값을 수정할 수 없기 때문에 일어나는 것입니다.

그렇다면 changeAge() 메소드 앞에 mutating을 붙여서 값 타입 프로퍼티를 수정할 수 있게 해보겠습니다.

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

var man = Person(name: "Song", age: 24)
man.changeAge()
print(man.age)

man이라는 인스턴스를 생성하고 메소드에 접근해보며 실행을 해보겠습니다.
초기화에서는 24를 넣었지만 changeAge()메소드를 통해 age가 10으로 잘 바뀐것을 확인할 수 있었습니다.


오늘은 mutating에 대해 공부를 해보았습니다. 매우 간단한 키워드지만 구조체나 열거형을 쓸때는 정말 중요한 키워드이므로 꼭 잘 숙지를 하고 넘어가야겠습니다. 그럼 오늘 하루도 수고 많으셨습니다.

profile
[iOS / Swift] [React Native]
post-custom-banner

0개의 댓글