8.2.4 타입 프로퍼티
앞에서 학습한 저장 프로퍼티나 연산 프로퍼티는 클래스 또는 구조체 인스턴스를 생성한 후 이 인스턴스를 통해서만 참조할 수 있는 프로퍼티였습니다. 이는 이들 프로퍼티가 인스턴스에 관련된 값을 저장하고 다루므로 인스턴스 프로퍼티라고 부릅니다. 하지만 인스턴스에 관련된 값이 아니라 클래스나 구조체, 또는 열거형과 같은 객체 자체에 관련된 값을 다루어야 할 때도 있는데, 이때는 인스턴스를 생성하지 않고 클래스나 구조체 자체에 값을 저장하게 되며 이를 타입 프로퍼티라고 부릅니다.
타입 프로퍼티는 인스턴스를 생성하지 않고 클래스나 구조체 자체에 저장하게 되며, 저장된 값은 모든 인스턴스가 공통으로 사용할 수 있습니다. 이 값은 복사된 값이 아니라 실제 하나의 값이므로 하나의 인스턴스에서 값을 변경하면 나머지 인스턴스들이 일괄적으로 변경된 값을 적용받습니다. 따라서 모든 인스턴스들이 공유해야 하는 값을 정의할 때 유용합니다.
타입 프로퍼티를 선언하는 방법은 클래스와 구조체에서 같습니다. 사용할 프로퍼티 앞에 static 키워드만 추가하면 됩니다. 타입 프로퍼티를 정의하는 또 다른 키워드인 class는 클래스에서 연산 프로퍼티에만 붙일 수 있는 키워드입니다. 이 키워드를 사용하여 타입 프로퍼티를 선언하면 상속받은 하위 클래스에서 재정의할 수 있는 타입 프로퍼티가 됩니다.
static let/var 프로퍼티명 = 초기값
또는
class let/var 프로퍼티명 : 타입 {
get {
return 반환값
}
set {
}
}
타입 프로퍼티는 인스턴스 생성 과정에서 초기값을 할당할 수 없으므로 반드시 초기값을 할당해야 합니다. 자세한 예시를 보겠습니다
struct Foo {
// 타입 저장 프로퍼티
static var sFoo = "구조체 타입 프로퍼티값"
// 타입 연산 프로퍼티
static var cFoo: Int {
return 1
}
}
class Boo {
// 타입 저장 프로퍼티
static var sFoo = "클래스 타입 프로퍼티값"
// 타입 연산 프로퍼티
static var cFoo: Int {
return 10
}
// 재정의가 가능한 타입 연산 프로퍼티
class var oFoo: Int {
return 100
}
}
하나 설명할 점은 class 키워드를 사용하여 정의한 oFoo는 Boo 클래스를 상속받는 하위 클래스에서 재정의할 수 있는 타입 프로퍼티라는 점이 cFoo와 다른 점입니다. 이렇게 선언된 타입 프로퍼티들은 인스턴스 생성 없이 사용 가능하고, 클래스나 구조체 자체에 점 구문을 이용하여 타입 프로퍼티를 참조하면 됩니다
print(Foo.sFoo)
// 구조체 타입 프로퍼티값
Foo.sFoo = "새로운 값"
print(Foo.sFoo)
// 새로운 값
print(Boo.sFoo)
// 클래스 타입 프로퍼티값
print("Boo.cFoo)
// 10
타입 프로퍼티는 인스턴스에 속하지 않으므로 만약 인스턴스를 생성한 다음 점 구문을 이용하여 타입 프로퍼티를 읽으려고 하면 선언되지 않은 프로퍼티라는 오류가 발생합니다. 타입 프로퍼티는 반드시 클래스나 구조체, 또는 열거형 자체와 함께 사용해야 합니다.
Last updated