azhy의 iOS 이야기

[iOS] get, set, didSet, willSet 본문

iOS

[iOS] get, set, didSet, willSet

azhy 2024. 11. 12. 20:26

2022년 7월 8일에 작성됨

get, set

get, set이라고 하면 흔히 생각이 들고 자주 봤었던 getter, setter라고 생각할 수 있습니다.

사용하는 방법과 이유가 거의 유사합니다. swift에서는 get, set을 묶어 연산 프로퍼티라고 부르죠. 사용법을 간단히 먼저 알아봅시다.

class Demo {
    // get, set을 사용하기 위해서는 그 연산된 값을 저장할 변수가 반드시 있어야한다.
    var _value : Int = 1 

    // value의 역할은 _value에 대해서 값을 연산하여 value에 할당하거나 리턴하는 역할만 한다.
    var value: Int { 
        get {
            return _value
        }
        set(newValue) {
            _value = newValue * 2
        }
    }
}

 

코드를 보면 따로 get, set 에 사용하는 값을 _value라는 따로 변수를 만들었습니다.

만약 get, set 에 따로 변수를 만들어서 사용하지 않고 value로 접근하면 xcode 에서 경고창을 띄웁니다.

그래서 우리는 사용할 때 따로 변수를 하나 만들어서 사용하도록 합시다.

didSet, willSet

사실 이번 글을 쓰는 목적이자 개인적으로 신기했던 친구입니다. didSet과 willSet은 프로퍼티 값의 변경 직전과 직후를 감지하여 그 시점에 작업을 진행할 수 있게 해주는 굉장한 기능을 가졌습니다.

그래서 보통 model에서의 변경사항을 view에 반영해야하는 일이 있으면 자주 쓰입니다.

예를 들어 어떤 모델에 대한 값을 변경하고 그 값을 label에 세팅해 주는 과정을 거친다고 생각해 봅시다.

var tempValue = "값 변경 전"

tempValue = "값 변경 후"
label.text = tempValue

 

이렇게 진행해도 아무 문제는 없습니다. 하지만 이런 과정들이 하나 둘 늘어나면 코드도 길어지고 복잡해지는 건 분명하죠.

var tempValue: String = "값 변경 전" {
    willSet (newValue) {
        print("willSet, \(tempValue) -> \(newValue) , 변경 예정")
    }

    didSet (oldValue) {
        print("didSet, \(oldValue) -> \(tempValue) , 변경 완료")

        // view 갱신에 관한 코드를 willSet, didSet 본인이 필요한 곳에 넣어주면 된다.
        label.text = tempValue
    }
}

tempValue = "값 변경 후"

// willSet, 값 변경 전 -> 값 변경 후 , 변경 예정
// didSet, 값 변경 전 -> 값 변경 후 , 변경 완료

 

이렇게 작성하면 didSet과 willSet을 이용하면 값이 변경하는 그 순간을 감지하기 때문에 View에 관한 갱신하는 작업을 따로 할 필요가 없습니다.

 

willSet: 프로퍼티의 값이 변경되기 직전에 호출되는 옵저버

프로퍼티 값이 변경되기 전에 처리해야 하는 일이 있으면 willSet을 이용해서 처리하면 됩니다.

 

didSet: 프로퍼티의 값이 변경된 직후에 호출되는 옵저버

프로퍼티 값이 변경된 후에 처리해야 할 일이 있으면 didSet을 이용해서 처리하면 됩니다.