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