Property(프로퍼티)
프로퍼티의 종류
- 저장 프로퍼티
- 연산 프로퍼티
- 타입 프로퍼티
저장 프로퍼티
저번에 클래스의 인스턴스는 참조타입이고 구조체의 인스턴스는 값타입이라고 했었는데 때문에 클래스는 클래스의 인스턴스가 상수로 선언되어도 클래스 내의 프로퍼티가 변수로 선언되었다면 값을 변경할 수 있지만, 구조체는 구조체의 인스턴스가 상수로 선언되면 구조체의 인스턴스 내의 프로퍼티가 변수로 선언되어도 값을 변경할 수 없다.
구조체 예시
struct Dog {
var name: String // 저장 프로퍼티
let gender: String
}
var dog = Dog(name: "Woo", gender: "Male")
print(dog)
dog.name = "Dooboo"
let dog2 = Dog(name: "Woo", gender: "Female")
dog2.name = "Dooboo" // 에러
클래스 예시
class Cat {
var name: String
let gender: String
init(name: String, gender: String) {
self.name = name
self.gender = gender
}
}
let cat = Cat(name: "json", gender: "Male")
cat.name = "Woo"
print(cat.name)
연산 프로퍼티 저장 프로퍼티는 클래스나 구조체에서만 사용 가능했지만 연산 프로퍼티는 클래스, 구조체, 열거형에서 사용 가능하다. 연산 프로퍼티는 값을 직접적으로 저장하지 않는 대신에 getter와 setter를 사용해서 다른 프로퍼티와 값들에 직접적으로 접근할 수 있다. (getter만 쓰고 setter를 쓰지 않으면 읽기 전용 프로퍼티로 사용할 수 있다.)
struct Stock {
var averagePrice: Int
var quantity: Int
var purchasePrice: Int {
get {
return averagePrice * quantity
}
set(newPrice) { // 매개변수 이름을 쓰지 않으면 default로 설정되어 있는 매개변수 이름인 newValue로 사용할 수 있다.
averagePrice = newPrice / quantity
}
}
}
var stock = Stock(averagePrice: 2300, quantity: 3)
print(stock)
stock.purchasePrice // 6900
stock.purchasePrice = 3000
stock.averagePrice // 1000 purchasePrice의 변경으로 averagePrice가 변경됨
프로퍼티 옵저버 프로퍼티 옵저버는 프로퍼티 값의 변화를 감지하고 반영한다. 새로운 값이 기존 값과 같아도 프로퍼티 옵저버는 호출된다. 프로퍼티 옵저버는 세가지 경우에만 사용 가능하다.
- 저장 프로퍼티
- 오버라이딩된 저장, 연산 프로퍼티
프로퍼티 옵저버 사용 예시
class Account {
var credit: Int = 0 {
// 소괄호 이름 지정
willSet {
print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
}
didSet {
print("잔액이 \(oldValue)원에서 \(credit)원으로 변경되었습니다.")
}
}
}
var account = Account()
account.credit = 1000
willSet은 값이 변경되기 직전에 실행되는 코드를 작성할 수 있고 didSet은 값이 변경된 후에 실행되는 코드를 작성할 수 있다.
타입 프로퍼티
struct SomeStructure {
static var storedTypeProperty = "Some value." // 스토어
static var computedTypeProperty: Int { //컴퓨티드
return 1
}
}
SomeStructure.storedTypeProperty
SomeStructure.computedTypeProperty
타입 프로퍼티는 위와 같이 저장 프로퍼티와 연산 프로퍼티에서 사용 가능하며 static 키워드를 사용합니다. 타입 프로퍼티는 인스턴스를 생성하지 않아도 프로퍼티에 접근하여 사용할 수 있다. 변경도 가능하다.