Property Series - Type Property

이원희·2020년 12월 27일
1

 🐧 Swift

목록 보기
9/32
post-thumbnail

프로퍼티 시리즈의 마지막 타입 프로퍼티에 대해서 알아보자.

Type Property

Type Property타입 프로퍼티라고 한다.
static 키워드를 사용해서 선언할 수 있다.

이전 포스팅에서 살펴봤던 Stored Property, computed Property타입을 정의하는 프로퍼티인스턴스 프로퍼티라고 한다.

인스턴스 프로퍼티는 해당 타입의 인스턴스가 생성되었을때 사용할 수 있다.
인스턴스 프로퍼티는 인스턴스를 새로 생성할때마다 초기값에 해당하는 값이 프로퍼티의 값이 된다.
즉, 인스턴스마다 다른 값을 갖는게 가능하다.

타입 프로퍼티는 각각의 인스턴스가 아닌 타입 자체에 속하는 프로퍼티이다.

타입 프로퍼티는 타입 자체에 영향을 미치는 프로퍼티이다.
인스턴스 생성 여부와 상관없이 하나의 타입에 타입 프로퍼티의 값은 하나이다.
하나의 타입에 타입 프로퍼티의 값은 하나이므로 그 타입의 모든 인스턴스가 공통으로 사용하는 값이다.
모든 인스턴스에서 공용으로 접근하고 값을 변경할 수 있는 변수이다.


종류

Type Property에는 저장 타입 프로퍼티연산 타입 프로퍼티가 있다.

기존의 인스턴스 저장 프로퍼티var, let을 선언할 수 있듯 저장 타입 프로퍼티에도 varlet을 선언할 수 있다.
기존의 인스턴스 연산 프로퍼티var만 선언할 수 있듯 연산 타입 프로퍼티에도 var만 선언할 수 있다.

인스턴스에 접근할 필요없이 타입 이름만으로도 프로퍼티를 사용할 수 있다.

Stored Type Property(저장 타입 프로퍼티)

인스턴스 저장 프로퍼티와 다르게 저장 타입 프로퍼티는 반드시 초기값을 설정해줘야한다.
타입 자체에는 초기화할때 저장 타입 프로퍼티에 값을 할당할 이니셜라이저가 없기 때문에 초기값을 설정해줘야한다.

저장 타입 프로퍼티는 처음 엑세스 할때는 lazily initialized한다.
따라서 다수의 thread가 동시에 엑세스해도 한번만 초기화되는 것을 보증한다.
lazy 키워드는 필요하지 않다.

Computed Type Property(연산 타입 프로퍼티)

class 타입에 대한 연산 타입 프로퍼티class 키워드를 사용하여 subClasssuperClass의 구현을 override할 수 있다.


코드로 이해해보자

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
}

static 키워드를 사용했으므로 타입 프로퍼티임을 알 수 있다.
storedTypeProperty타입 저장 프로퍼티이므로 초기값을 반드시 설정해줘야한다.
computedTypeProperty연산 타입 프로퍼티로 무조건 var로 선언해줘야한다.

enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 6
    }
}

이전 포스팅에서 저장 프로퍼티class, struct에서만 사용 가능하다고 했다.
그렇다면 저장 타입 프로퍼티Enum에서도 사용이 가능한가보다!

class SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 27
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}

코드를 보면 익숙한 static 키워드뿐만 아니라 classa 키워드가 붙은 프로퍼티가 보인다.

class 타입에 대한 연산 타입 프로퍼티class 키워드를 사용하여 subClasssuperClass의 구현을 override할 수 있다.

overrideableComputedTypePropertyclass 키워드가 붙었으므로 연산 타입 프로퍼티임을 알 수 있다.
subClass에서 override 할 수 있다는데 코드로 확인해보자.

class SomeClass {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 27
    }
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}
class ChildSomeClass: SomeClass {
    override class var overrideableComputedTypeProperty: Int {
        return 2222
    }
}

someClass를 상속받는 childSomeClass를 만들고 overrideableComputedTypePropertyoverride해줬다.

타입 프로퍼티 액세스

인스턴스에 접근할 필요없이 타입 이름만으로도 프로퍼티를 사용할 수 있다.

타입 프로퍼티는 타입 이름만으로도 프로퍼티에 접근할 수 있다는데 어떻게 접근할 수 있을까?

이처럼 인스턴스의 생성 없이 TypeName.propertyName으로 접근 가능하다.


참고

private var namePrefix = "이름 : "
private var agePrefix = "나이 : "

UILabel에 표시될 Prefix를 namePrefix, agePrefix라는 전역 변수로 선언했다.
해당 코드에 아래와 같은 코드로 바꿔보는건 어떻냐는 리뷰가 달렸다.

private enum Prefix {
    static let name = "이름 : "
    static let age = "나이 : "
}

static 키워드가 붙었으므로 name, age타입 프로퍼티임을 알 수 있다.
타입 프로퍼티이므로 name, age는 해당 타입 Prefix에 하나씩만 존재한다.
타입 프로퍼티이므로 인스턴스를 생성하지 않아도 Prefix.name처럼 액세스 할 수 있다.


마무리

타입 프로퍼티를 끝으로 프로퍼티에 대한 포스팅이 끝났다.
정리를 하니 좀 더 각각의 차이가 명확해졌다.
앞으로 프로퍼티에 대해 잘 생각하고 나만의 기준을 세워나가야겠다.
그럼 이만👋

0개의 댓글