속성 감시자(Property Observer)
- 속성 감시자(Property Observer)는 저장 속성의 값이 변경되는 것을 감지하고, 시점마다 특정 코드를 실행하도록 하는 기능이다
- 저장 속성의 값이 변경되기 전과 후에 각각 코드를 실행할 수 있다
속성 감시자의 종류
willSet 감시자: 값이 저장되기 직전에 호출된다
didSet 감시자: 값이 저장된 직후에 호출된다
속성 감시자 선언 방법
var someProperty: Type = initialValue {
willSet(newValue) {
}
didSet(oldValue) {
}
}
newValue와 oldValue는 생략할 수 있으며, 자동으로 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
속성 감시자가 필요한 이유
- 값의 변경을 추적하거나 기록해야 할 때
- 값의 변경에 따라 UI 업데이트 또는 다른 작업을 수행해야 할 때
- 값의 변경을 자동으로 반영해야 하는 상황
- 예를 들어, 은행 잔액, 사용자 상태 메시지, 설정 값 변경 등을 추적할 때 유용하다
속성 감시자의 적용 범위
- 저장 속성 (Stored Property)
- 기존 저장 속성에는
willSet과 didSet을 추가할 수 있다 (상속 포함)
- 계산 속성 (Computed Property)
- 원래 계산 속성에는 속성 감시자를 추가할 수 없다
- 다만, 상속 후 재정의(Overriding) 하는 경우에는 추가할 수 있다 (실제 속성 감시자가 아닌
set 블록에서 감지)
let(상수) 속성에는 적용 불가
- 상수는 값이 변경되지 않으므로 감시할 필요가 없다
- 지연 저장 속성 (
lazy)에는 적용 불가
- 하지만, Swift 5.3 이후부터는 지연 저장 속성에도 속성 감시자 구현이 가능하다
속성 감시자와 메모리 구조
- 속성 감시자는 메모리에 직접적인 영향을 주지 않는다
- 값이 저장되거나 계산될 때마다 코드를 실행하는 트리거 역할만 한다
요약
- 속성 감시자(Property Observer): 속성 값이 변경될 때 특정 코드를 실행하게 해주는 기능
- 종류:
willSet (값 변경 직전), didSet (값 변경 직후)
- 사용 용도: 값의 변경을 추적하거나, 특정 상황에서 추가 작업을 수행하기 위해 사용
- 사용 가능 대상: 저장 속성, 상속된 계산 속성 (일반 계산 속성에는 불가)
- 파라미터 생략:
newValue / oldValue 로 자동으로 접근 가능
- 지연 저장 속성(
lazy)에도 사용 가능 (Swift 5.3 이후)