Swift/개념 & 응용

[Swift] 구조체와 클래스의 Property Observer 동작 차이 (짧은글)

유정주 2023. 9. 16. 14:41
반응형

Property Observer

Property observers observe and respond to changes in a property’s value. Property observers are called every time a property’s value is set, even if the new value is the same as the property’s current value.

Property Observer는 프로퍼티의 "값"이 변하면 호출됩니다.

여기서 "값"의 의미때문에 구조체와 클래스의 프로퍼티 옵저버 동작 차이가 발생합니다.

 

struct StructA {
    var value: Int = 0
}

class ClassA {
    var value: Int = 0
}

var structA = StructA() {
    didSet {
        print("[struct] didSet")
    }
}
var classA = ClassA() {
    didSet {
        print("[class] didSet")
    }
}

구조체와 클래스 프로퍼티를 하나씩 만들었고,

그 프로퍼티에 didSet을 달았습니다.

 

structA.value = 10
classA.value = 10

// [struct] didSet

 

위 코드를 실행하면 struct의 didSet만 호출됩니다.

 

structA = StructA()
classA = ClassA()

// [struct] didSet
// [class] didSet

하지만 위 코드는 구조체와 클래스 모두 didSet이 호출됩니다.

 

무슨 차이인지 감이 오시나요?

 

프로퍼티 옵저버는 "값"의 변화를 감지합니다.

클래스는 참조 타입이기 때문에 value를 참조만 하고 있습니다.

그래서 classA의 value가 변해도 값이 변한 게 아니기 때문에 didSet이 호출되지 않고,

새로운 객체를 넣어야 저장된 주소값이 바뀌어서 didSet이 호출되게 됩니다.

 

Swift에서 "값"이 중요하다는 것을 다시 한 번 느꼈네요.

왜 안 되지? 버근가?라고 생각되면 제가 잘못한 거라는 것도 다시 한 번 깨달았습니다 ㅋㅋ

 

감사합니다.

 

참고

https://docs.swift.org/swift-book/documentation/the-swift-programming-language/properties/#Property-Observers


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형