오늘은 어제에 이어서 남은 타입 속성 프로퍼티와 속성 감시자에 대해서 공부해보았다.
타입 프로퍼티는 타입 자체에 속한 프로퍼티로, 클래스나 구조체, 열거형의 모든 인스턴스가 공유하는 프로퍼티이다. 즉, 특정 인스턴스에 속하는게 아닌 타입 전체에 속한다.
모든 인스턴스가 같은 타입 프로퍼티에 접근할 수 있으며, 그 값이 변경되면 모든 인스턴스에서 공유가 된다.
내/외부에서 접근이 가능하며, 인스턴스를 생성하지 않아도 타입 이름으로 바로 접근할 수 있다.
-> Type.property
로 접근해야한다.
두가지의 타입이 존재하는데 하나는 저장 타입 속성, 다른 하나는 계산 타입 속성이 있다.
저장 타입 속성
: 타입에 속하며 초기값이 저장되고 이후 필요에 따라 수정할 수 있다.
static
키워드를 사용해서 선언let, var 선언이 둘다 가능
하고, 항상 기본값(초기값)을 할당해줘야 한다.계산 타입 속성
: 계산된 결과를 반환하며, 항상 최신 상태의 값을 제공한다.
static
키워드 또는 class
키워드를 사용해서 선언 (class 키워드는 subClass에서 재정의 할 수 있다.)var만 사용이 가능
하다 (계산 속성이기에)
프로퍼티의 값이 변경되는지 관찰하고 응답한다. 프로퍼티 관찰자는 프로퍼티의 현재 값이 새로운 값과 같더라도 프로퍼티의 값이 설정될 때 호출된다. 즉, 저장 프로퍼티의 값이 변경될 때 실행되는 코드 블록이다.
var로만 선언 가능
하다. -> let은 관찰할 필요가 없고, 지연저장 속성은 관찰이 안되기 때문이다.willSet
newValue
라는 매개변수로 전달된다.didSet
oldValue
는 매개변수로 전달된다.lazy 저장 프로퍼티
에서는 관찰자를 사용할 수 없다.(값이 설정되기 전까지 초기화되지 않기 때문)willSet, didSet
을 호출되지 않는다. didSet
은 값이 변경된 후에 호출을 하기에 변경된 값을 기반으로 작업을 하기에 값을 강제로 원래 상태로 되돌리거나, 에러르 던지는 작업에 적합하지 않는다. willSet
은 값이 변경되기 직전에 가능하지 않을까 했지만, 조건을 검사하고 특정 동작을 하게 해줄 순 있지만 이미 값은 변경이 되어서 되돌릴 수가 없기 때문에 부적절하다.
오... 스테틱,, 아직도 스테틱이랑 private 볼 때마다 낯설어요