저장 프로퍼티(Stored Property)
- 인스턴스의 변수 또는 상수를 의미
- 구조체와 클래스에서만 사용 가능
- var, let 키워드 사용
지연 저장 프로퍼티(Lazy Stored Property)
- 호출이 있어야 값을 초기화하는 프로퍼티
- lazy 키워드 사용
- let 선언 불가: Constant property인 let은 인스턴스가 완전히 생성되기 전에 초기화해야 하므로 사용할 수 없음
- property의 초깃값이 인스턴스의 초기화가 완료될 때까지 알 수 없는 외부 요인에 의존할 때 사용
- property의 초깃값에 복잡하거나 계산 비용이 많이 드는 설정이 필요할 때 or 모든 저장 프로퍼티를 사용할 필요가 없을 때 사용
- 불필요한 성능 저하나 공간 낭비를 줄일 수 있음
- 주의※: 다중 스레드 환경에서 지연 저장 프로퍼티에 동시다발적으로 접근할 때 한 번만 초기화된다는 보장이 없음, 여러 번 초기화될 수 있다는 점
프로퍼티 감시자(Property Observer)
- 프로퍼티의 값이 변할 때 값의 변화에 따른 특정 작업을 실행함
- 저장 프로퍼티에 적용할 수 있으며 부모 클래스로부터 상속받을 수 있음
- willSet(newValue), didSet(oldValue)
ex. 저장 프로퍼티에 프로퍼티 감시자 구현
struct Account {
var credit: Int = 0 {
willSet {
print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
}
didSet {
print("잔액이 \(oldValue)원에서 \(credit)원으로 변경되었습니다.")
}
}
}
var account = Account(credit: 1000)
account.credit = 5000
연산 프로퍼티(Computed Property)
- 실제로 값을 저장하지 않고 간접적으로 다른 property를 연산하여 getter, setter 제공
- 클래스, 구조체, 열거형에서 사용
- set에 따로 이름을 지정하지 않을 경우 newValue로 대체 가능
- get만 사용해서 읽기 전용 구현 가능
ex. 읽기 전용 프로퍼티
ex. set 사용 시 newValue로 매개변수 이름 대체 가능
타입 프로퍼티(Type Property)
- 각각의 인스턴스가 아닌 타입 자체에 속하는 프로퍼티
- static 키워드 사용
- 인스턴스의 생성 여부와 상관없이 타입 프로퍼티의 값은 하나
- 저장 타입 프로퍼티는 반드시 초깃값을 설정해야 하며 지연 연산된다.
- lazy와 달리 다중 스레드 환경이라고 하더라도 단 한 번만 초기화된다는 보장을 받음
ex. 저장 타입 프로퍼티와 연산 타입 프로퍼티
struct TypePropertyEX {
// 저장 타입 프로퍼티
static var typeProperty: Int = 0
// 연산 타입 프로퍼티
static var typeComputedProperty: Int {
get {
return typeProperty
}
set {
typeProperty = newValue
}
}
}
// 인스턴스 생성 없이 사용 가능
print(TypePropertyEX.typeProperty) // 0
TypePropertyEX.typeComputedProperty = 100
print(TypePropertyEX.typeProperty) // 100
'Study > Swift' 카테고리의 다른 글
[Swift] 고차함수(1) - map, flatMap, compactMap (0) | 2022.09.18 |
---|---|
[Swift] RunLoop.Mode (0) | 2022.08.01 |
[Swift] Run Loop (0) | 2022.07.25 |
[Swift] Initializer 심화 (2) (0) | 2022.07.20 |
[Swift] Initializer 심화 (1) (0) | 2022.07.19 |