Dev/Swift

Swift: 타입 프로퍼티(Type property)

두넌 2023. 5. 15.

DAY 17

타입 프로퍼티(Type property)

 

타입 프로퍼티란?


일반적으로 우리가 사용하는 instance property는 새로운 인스턴스를 생성할 때마다 각기 다른 메모리 공간을 갖는다 (다른 인스턴스와 분리된 고유한 속성 값 집합)

하지만 type property는 인스턴스 수에 관계 없이 하나의 공간만 가지고 있다

C의 static constant(정적 상수) 또는 static variable(정적 변수, 전역 변수)와 같은 유형으로 사용되는 것

Type properties are useful for defining values that are universal to all instances of a particular type, such as a constant property that all instances can use (like a static constant in C), or a variable property that stores a value that’s global to all instances of that type (like a static variable in C).
Swift 공식 문서 - Properties

 

클래스, 구조체, 열거형에서 사용되며 저장 타입 프로퍼티연산 타입 프로퍼티가 존재한다

이전에 stored propertycomputed property 에 대해서 공부했었는데, 이런 저장 & 연산 프로퍼티 앞에 static 키워드를 붙이면 저장 타입 프로퍼티와 연산 타입 프로퍼티가 되는 것

 

저장 타입 프로퍼티 (Stored type property)


저장 타입 프로퍼티(stored type property)는 항상 초기값을 가져야 한다

스크린샷 2022-02-04 시간: 00 48 10

이는 static으로 선언되는 저장 타입 프로퍼티의 경우 초기화할 때 값을 할당할 이니셜라이저가 없기 때문이다

Type property는 인스턴가 생성될 때마다 매번 생성되는 기존 property와는 다르게 한번 호출될 때 메모리에 올라가고, 그 뒤로는 생성되지 않으며 전역변수처럼 어디서든 이 타입 프로퍼티에 접근할 수 있게 됨

 

스크린샷 2022-02-04 시간: 00 48 35

만약 초기값을 지정해주지 않으면, 다음과 같은 오류가 발생한다

 

type property인 name에 접근하기 위해서는 반드시 타입 이름을 통해서만 접근이 가능하다

Man.name

또한 위와 같이 name 프로퍼티를 최초 호출하기 전까진, 초기화 되지 않는다

이는 stored type property의 기본 속성인 lazy 때문이라고 하는데, 애플 Swift 공식문서에 따르면

A lazy stored property is a property whose initial value is not calculated until the first time it is used

라고 하는 것을 알 수 있습니다

 

lazy

  1. 반드시 var와 함께 쓰여야 한다
  2. struct, class에서만 사용할 수 있다
  3. Computed property에는 사용할 수 없다

너무 나간것 같지만, 앞서 stored type property의 기본 속성이 lazy라고 했었는데, lazy에서 반드시 var와 함께 쓰여야 한다고 적혀있는데

stored type propertyvarlet 모두 사용이 가능했다 이유가 무엇일까?

 

조금 이해하기 어렵고 아직 100% 이해하진 못했지만, 구글링 하다가 괜찮은 답변이 있어서 가져와봤다

static이 아닌 저장 프로퍼티는 인스턴스 프로퍼티로, init 함수가 불리는 시점에 모든 값이 초기화가 되어야 합니다 (직접 값을 지정하든, 옵셔널 타입으로 설정하여 nil로 초기화 되든!)

근데 lazy의 경우엔 초기화 단계에서 값이 없음으로 설정 되었다가, 실제 해당 프로퍼티가 불릴 때 원하는 값으로 초기화가 됩니다.

따라서 lazy 프로퍼티를 let으로 선언할 경우, 초기화 단계에서 값이 없음으로 설정되어버리면 이후 실제 사용 시 값을 설정할 수 없어서 let으로 선언하지 못한 것입니다.

그럼 static, 즉 타입 프로퍼티의 경우 왜 let이 가능할까요?

타입 프로퍼티는 인스턴스 프로퍼티처럼 초기화 구문의 영향을 받지 않습니다! 인스턴스가 초기화 즉 init 함수가 불리든 말든 타입 프로퍼티와는 상관이 없습니다.

따라서 타입 프로퍼티의 경우 초기화 구문에서 값이 없음으로 초기화 되지 않고, 실제 사용할 때 값이 초기화 되기 때문에 let으로 선언해도 문제가 없는 것입니다

출처 : 개발자 소들이 블로그

 

연산 타입 프로퍼티 (Computed type property)


  • class : 오버라이딩이 가능한 연산 타입 프로퍼티
  • static : 오버라이딩이 불가능한 연산 타입 프로퍼티

 

연산 타입 프로퍼티는 항상 var로 선언되어야 한다

여기서 앞서 언급했었던 class 키워드에 대해 알수 있었다

이는 연산 타입 프로퍼티(Computed type property)로 오버라이딩이 가능한 연산 타입 프로퍼티를 나타내는 것을 알 수 있었다

댓글