프로퍼티는 구조체, 클래스, 열거형에서 타입과 관련된 값을 표현할 때 사용한다.
물론 외부에 위치한 함수, 클로저, 타입 등에 전역/지역변수로 모두 사용 가능한다.
- 저장 프로퍼티 / 연산 프로퍼티
- 인스턴스 프로퍼티 / 타입 프로퍼티
// 인스턴스 저장 프로퍼티
var name: String = ""
// 타입 저장 프로퍼티
static var job: String = "학생"
저장 프로퍼티는 단순히 값을 저장한다!
인스턴스 프로퍼티는 가변 프로퍼티라면 어떤 인스턴스로든 변경 가능하고, 타입 프로퍼티는 타입 자체로만 참조 및 변경이 가능하다.
연산 프로퍼티는 단순히 값을 저장하는 것이 아니라 저장하고 사용할 때 특정 연산을 수행할 수 있다.
struct Student{
var koreanAge = 0
var westernAge: Int{
get{
return koreanAge - 1
}
set(inputValue){
koreanAge = inputValue + 1
}
}
}
var jim: Student = Student()
jim.koreanAge = 10
// jim.westernAge == 9
연산 프로퍼티는 get-set으로 이루어지는데 get은 읽는 부분으로 해당 프로퍼티를 불러올 때 작동하고 set은 쓰는 부분으로 프로퍼티를 저장할 때 수행한다.
위에서 koreanAge만 설정해줬지만 westernAge를 불러오면 get 연산을 통해 [ koreanAge - 1 ]인 9를 불러오게 된다.
반대로 westernAge를 10으로 설정하면 set 연산을 통해 koreanAge는 자동으로 11로 저장된다.
여기서 inputValue로 새로 들어올 값 이름을 지정해줬는데 매개변수 이름을 지정을 해주지 않는다면 암시적으로 newValue로 사용한다.
연산 프로퍼티는 get만 구현된 읽기 전용 연산 프로퍼티도 가능한다.
하지만 set만 구현된 쓰기 전용 프로퍼티는 불가능하다!
var selfIntroduction: String {
get {
return "저는 \(self.class)반 \(name)입니다"
}
}
읽기 전용 프로퍼티로 매개변수와 반환 값이 없는 메서드를 대체할 수 있다.
프로퍼티가 변하는지 계속 지켜보는 감시자 역할을 하는 것이다 😎
- willSet - 값이 변경되기 직전에 호출
- didSet - 값이 변경된 직후에 호출
- willSet, didSet 중 하나만 구현해도 가능
- 변하는 값이 기존 값과 동일하더라도 실행
- 연산자 프로퍼티에는 프로퍼티 감시자를 구현 불가
- 연산 프로퍼티처럼 외부에 있는 프로퍼티에도 구현 가능
struct Money{
var dollar: Double = 0{
willSet(newDollar){
print("\(dollar)달러에서 \(newDollar)달러로 변경될 예정입니다")
}
didSet(oldDollar){
print("\(oldDollar)달러에서 \(dollar)달러로 변경되었습니다.")
}
}
}
프로퍼티 감시자 역시 매개변수 이름을 지정해서 사용할 수 있지만 괄호 없이 아무런 매개변수를 지정하지 않아도 암시적 매개변수를 이용할 수 있다.
- willSet의 암시적 매개변수 = newValue
- didSet의 암시적 매개변수 = oldValue