- Property는 변수의 다른 이름입니다.
- 클래스, 구조체, 열거 등 전체적으로 사용되는 변수를 프로퍼티라고 부릅니다.
- Property의 종류에는 저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티가 있습니다.
- 순서대로 하나씩 알아보겠습니다.
저장 프로퍼티
- 저장 프로퍼티는 가장 일반적인 프로퍼티로써, 값을 저장하는 용도로 사용됩니다.
- 초기값을 설정 할 수 있고, 클래스 구조체에서는 인스턴스와 연관된 값을 저장합니다.
let name = "Hohyeon Moon"
var age = 25
지연 저장 프로퍼티
- 지연 저장 프로퍼티는 프로퍼티가 처음으로 사용되기 전까지 초기값이 계산되지 않는 특성을 갖고 있습니다.
- lazy 키워드를 선언 앞에 작성해서 사용할 수 있고, let은 지연 저장 프로퍼티로 사용할 수 없습니다.
class Position {
lazy var point: CoordinatePoint = CoordinatePoint()
}
연산 프로퍼티
- 실제로 값을 저장하지는 않고, get과 set 키워드로 값을 간접적으로 설정하거나 받는 프로퍼티입니다.
var wallet: Int = 10000
var counter: Int {
get {
return wallet
}
set(money) {
wallet += money
}
}
타입 프로퍼티
- 타입 프로퍼티로는 인스턴스의 속성이 아닌, 타입에 따른 속성을 정의할 수 있습니다.
- static 키워드를 사용해서 값 타입에서 타입 프로퍼티를 설정할 수 있고,
- class 키워드를 사용해서 클래스 타입에서 타입 프로퍼티를 설정할 수 있습니다.
- 값을 가져올때는 클래스의 이름을 통해서 가져올 수 있습니다.
struct AudioChannel {
static let level = 10
static var maxLevel = 0
}
print(AudioChannel.level)
print(AudioChannel.maxLevel)
프로퍼티 옵저버
- Property Observers는 프로퍼티의 값이 변경 될 때 지정된 코드를 실행해줍니다.
- Lazy 프로퍼티에는 사용 될 수 없고, 저장 프로티에서만 사용이 가능합니다.
- Property의 값이 변경되기 직전에 willSet이 호출되고, 변경된 직후에는 didSet이 호출됩니다.
- willSet에서는 newValue가, didSet에서는 oldValue가 자동으로 전달됩니다.
class Account {
var credit: Int = 0 {
willSet {
print("잔액이 \(credit)에서 \(newValue)원으로 변경될 예정입니다.")
}
didSet {
print("잔액이 \(oldValue)에서 \(credit)으로 변경되었습니다.")
}
}
}
let myAccount = Account()
myAccount.credit = 1000