TIL: 속성 감시자(Property Observer)

Royce·2025년 3월 22일

Swift 문법

목록 보기
28/63

속성 감시자(Property Observer)

  • 속성 감시자(Property Observer)는 저장 속성의 값이 변경되는 것을 감지하고, 시점마다 특정 코드를 실행하도록 하는 기능이다
  • 저장 속성의 값이 변경되기 전과 후에 각각 코드를 실행할 수 있다

속성 감시자의 종류

  • willSet 감시자: 값이 저장되기 직전에 호출된다
  • didSet 감시자: 값이 저장된 직후에 호출된다

속성 감시자 선언 방법

var someProperty: Type = initialValue {
    willSet(newValue) {
        // 새로운 값이 저장되기 직전에 실행되는 코드
    }
    didSet(oldValue) {
        // 새로운 값이 저장된 직후에 실행되는 코드
    }
}
  • newValueoldValue는 생략할 수 있으며, 자동으로 newValue, oldValue 라는 이름으로 접근할 수 있다

예제 코드

class BankAccount {
    var owner: String
    var balance: Double {
        willSet {  // 값이 저장되기 직전 호출
            print("\(owner)의 계좌에 \(balance)원이 있었으나 \(newValue)원으로 변경될 예정입니다.")
        }
        didSet {  // 값이 저장된 직후 호출
            if balance > oldValue {
                print("\(owner)의 계좌 잔액이 \(oldValue)원에서 \(balance)원으로 증가했습니다.")
            } else {
                print("\(owner)의 계좌 잔액이 \(oldValue)원에서 \(balance)원으로 감소했습니다.")
            }
        }
    }
    
    init(owner: String, initialBalance: Double) {
        self.owner = owner
        self.balance = initialBalance
    }
}

let account = BankAccount(owner: "Royce", initialBalance: 1000)
account.balance = 1500    // 입금
account.balance = 800     // 출금

속성 감시자가 동작하는 방식(메커니즘)

  • willSet은 값이 저장되기 직전에 실행된다
  • didSet은 값이 저장된 직후에 실행된다
  • 속성 감시자는 값이 변경되면 무조건 호출된다
  • 값이 기존 값과 동일하더라도 호출된다

속성 감시자의 두 가지 종류 - willSet / didSet

1. willSet (새 값이 저장되기 직전에 호출)

  • 새로운 값이 저장되기 직전에 호출되는 메서드이다
  • 변경될 새로운 값은 매개변수로 전달된다 (기본 이름: newValue)

2. didSet (새 값이 저장된 직후에 호출)

  • 새로운 값이 저장된 직후에 호출되는 메서드이다
  • 변경되기 전의 값은 매개변수로 전달된다 (기본 이름: oldValue)

파라미터 생략 - newValue / oldValue

  • willSet의 매개변수 이름을 생략하면 자동으로 newValue 사용
  • didSet의 매개변수 이름을 생략하면 자동으로 oldValue 사용
class BankAccount2 {
    var owner: String
    var balance: Double {
        willSet {
            print("계좌 잔액이 \(balance)원에서 \(newValue)원으로 변경될 예정입니다.")
        }
        didSet {
            print("계좌 잔액이 \(oldValue)원에서 \(balance)원으로 변경되었습니다.")
        }
    }
    
    init(owner: String, initialBalance: Double) {
        self.owner = owner
        self.balance = initialBalance
    }
}

let account2 = BankAccount2(owner: "Royce", initialBalance: 2000)
account2.balance = 3000  // 입금
account2.balance = 1000  // 출금

속성 감시자가 필요한 이유

  1. 값의 변경을 추적하거나 기록해야 할 때
  2. 값의 변경에 따라 UI 업데이트 또는 다른 작업을 수행해야 할 때
  3. 값의 변경을 자동으로 반영해야 하는 상황
  4. 예를 들어, 은행 잔액, 사용자 상태 메시지, 설정 값 변경 등을 추적할 때 유용하다

속성 감시자의 적용 범위

  1. 저장 속성 (Stored Property)
    • 기존 저장 속성에는 willSetdidSet을 추가할 수 있다 (상속 포함)
  2. 계산 속성 (Computed Property)
    • 원래 계산 속성에는 속성 감시자를 추가할 수 없다
    • 다만, 상속 후 재정의(Overriding) 하는 경우에는 추가할 수 있다 (실제 속성 감시자가 아닌 set 블록에서 감지)
  3. let(상수) 속성에는 적용 불가
    • 상수는 값이 변경되지 않으므로 감시할 필요가 없다
  4. 지연 저장 속성 (lazy)에는 적용 불가
    • 하지만, Swift 5.3 이후부터는 지연 저장 속성에도 속성 감시자 구현이 가능하다

속성 감시자와 메모리 구조

  • 속성 감시자는 메모리에 직접적인 영향을 주지 않는다
  • 값이 저장되거나 계산될 때마다 코드를 실행하는 트리거 역할만 한다

요약

  • 속성 감시자(Property Observer): 속성 값이 변경될 때 특정 코드를 실행하게 해주는 기능
  • 종류: willSet (값 변경 직전), didSet (값 변경 직후)
  • 사용 용도: 값의 변경을 추적하거나, 특정 상황에서 추가 작업을 수행하기 위해 사용
  • 사용 가능 대상: 저장 속성, 상속된 계산 속성 (일반 계산 속성에는 불가)
  • 파라미터 생략: newValue / oldValue 로 자동으로 접근 가능
  • 지연 저장 속성(lazy)에도 사용 가능 (Swift 5.3 이후)
profile
iOS 개발자 지망생

0개의 댓글