드디어 프로퍼티 마지막!
수업들을 때 진짜진짜진짜 이해 안됐던 개념 중 하나...
왜 프로퍼티가 있는데 타입 프로퍼티도 있는거지? 하면서 개념을 읽고 또 읽어도 이해가 안됐삼,,
일단 공식 개념부터 살펴보자면,
타입 자체에 속하는 프로퍼티로, 어느 한 인스턴스에 속하는 것이 아님.
지금까지 봐왔던 저장 프로퍼티나 계산 프로퍼티는 어떤 타입의 인스턴스에 속하는 거였음.
그니까
let myNumber: Int = 10
var myString: String = "수입푸드 조아요"
여기서 선언한 myNumber
, myString
은 각각 Int
, String
타입의 인스턴스에 속하는 것들이다.
Int
, String
자체의 값이 아님!
근데 타입 프로퍼티는 그 타입 자체의 프로퍼티임. 이 타입으로 돼 있는 건 다 내가 설정한 값으로 유지돼야 하는, 약간 전역변수같은 개념인듯?
요 값은 이 타입의 인스턴스들이 공통으로 사용하는 값임!
저장 타입 프로퍼티
는 상수나 변수로 선언 가능하지만,
계산 타입 프로퍼티
는 무적권 변수로만!!
저장 타입 프로퍼티
는 무조건 초기값을 줘야함!
글구 lazy 형태로 초기화돼서 여러 스레드에서 접근해도 딱 한번만 초기화됨.
타입 프로퍼티 만드는 건 쉬움! static
키워드를 프로퍼티 앞에 붙여주면 됨!
C처럼 전역 static 변수로 만들어지는 건 아니고, outer 중괄호에서만 효력이 있음.
요런식으로 쓰면 됨.
struct SomeStructure {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 1
}
}
enum SomeEnumeration {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 6
}
}
class SomeClass {
static var storedTypeProperty = "Some value."
static var computedTypeProperty: Int {
return 27
}
class var overrideableComputedTypeProperty: Int {
return 107
}
}
만약에 static
키워드 대신 class
를 넣어 계산 타입 프로퍼티를 만들었다면 해당 프로퍼티를 오버라이딩 할 수 도 있음!
overrideableComputedTypeProperty
계산 타입 프로퍼티는 subclass에서 오버라이딩이 가능하다!
class SubClass: SomeClass {
override class var overrideableComputedTypeProperty: Int {
return 109
}
}
이런식으로 subclass에서 오버라이딩 할 수 있음!
근데 static으로 선언된 계산 타입 프로퍼티는 오버라이딩이 불가능!!
접근은 어떻게 하죠??
print(SomeStructure.storedTypeProperty)
// Prints "Some Value"
이렇게 그냥 .(dot) syntax를 쓰면 되지만!!
인스턴스를 만들어서 접근하는 게 아니고 타입 이름으로 접근해야 한다는 걸 명심해야 됨!