Swift

❓ 타입 프로퍼티

_yunie 2024. 6. 7. 09:10

바로 지난 글에서는 저장 프로퍼티에 대해 알아봤었던 거 기억하시나요?

프로퍼티에는 저장, 타입, 연산 프로퍼티로 총 세 가지 종류가 있다고 했었는데, 이번 글에서는 타입 프로퍼티에 대해 다뤄보도록 하겠습니다!

 

❓ 타입 프로퍼티

타입 프로퍼티는 프로퍼티답게 클래스, 구조체, 열거형에서 사용됩니다

그리고 타입 프로퍼티는 저장 타입 프로퍼티, 연산 타입 프로퍼티 두 가지로 나뉠 수 있습니다

이전 글들을 통해서 저장 프로퍼티, 연산 프로퍼티에 대해 알아봤으니 두 프로퍼티가 어떤 역할을 하는지, 어떻게 생겼는지는 알 수 있을 겁니다

그런데 이 둘에게 타입이 붙으면 어떤 점이 다른 걸까요?

코드로 살펴볼게요!

struct Student {
	static var name: String = "yunie"
	static let age: Int = 1
	static var desc: String {
		return "\\(name)은 \\(age)살입니다"
	} 

 

혹시 ‘static’이라는 이전 글들에서는 보지 못한 키워드가 보이지 않으신가요?

이렇게 static을 붙여준 name 또는 age, desc를 각각 저장 타입 프로퍼티, 연산 타입 프로퍼티라고 부릅니다

즉, static이 붙어있다면 단순하게 ‘아, 타입 프로퍼티구나~’라고 생각해 주시면 될 것 같아요

 

 

⭐️ 타입 프로퍼티의 특징

타입 프로퍼티는 클래스, 구조체, 열거형에 사용가능하다 이외에도 lazy 하게 동작한다는 것선언 당시에 꼭 값이 초기화되어있어야 한다 특징이 있습니다

만약 타입 프로퍼티 선언 시, 초기화를 해주지 않는다면 바로 아래와 같이 초기값을 지정해 주거나 타입 연산 프로퍼티로 생성해!라는 의미의 에러가 발생합니다

 

 

🧐 그렇다면 선언과 동시에 초기화를 해야 하는 이유는 무엇일까요?

 

우선, 타입 프로퍼티가 어떻게 동작하는지부터 알아봅시다

 

타입 프로퍼티는 인스턴스가 생성될 때마다 함께 메모리에 올라가는 여타 프로퍼티와 달리 한 번 호출된 이후에는 메모리에서 제거되지 않습니다!

이는 곧 첫 번째 호출 이후 다음 몇 번을 호출하든 프로퍼티가 계속해서 생성되는 것이 아닌 하나의 프로퍼티를 공유하는 형태로 사용한다는 의미입니다

주로 그 타입의 모든 인스턴스가 공통적으로 사용하는 값이거나 모든 인스턴스에서 공용으로 사용할 수 있을 때 유용하게 사용한다고 하네요!

그리고 이는 마치 전역변수 같은 개념이라고들 하죠😉

 

따라서 인스턴스의 초기화와 관계가 없기 때문에 만약 초기화를 해주지 않는다면 이후에 초깃값을 넣어줄 방법이 없기 때문에 선언과 동시에 초기화가 이루어져야 합니다!

 

 

🧐 타입 프로퍼티는 var / let 모두 사용가능하다?

 

방금 전 타입 프로퍼티의 특징 중에서 타입 프로퍼티는 lazy 하게 작동한다고 말씀드렸습니다

그럼 lazy처럼 상수로는 선언을 못하겠네? 싶겠지만 타입 프로퍼티는 변수와 상수 모두 사용가능합니다

 

지연 저장 프로퍼티의 경우부터 생각해 볼게요

지연 저장 프로퍼티는 인스턴스가 생성될 때 초기화가 되는데, 호출되기 이전에는 값이 없음 상태로 초기화가 진행됩니다

그리고 호출이 되면 선언 시 함께 넣어준 값으로 초기화가 일어납니다

결국 값이 없다가 있는 상태가 되니까 let을 사용해 줄 수는 없는 거죠

 

이와 반대로, 저장 타입 프로퍼티는 인스턴스의 생성 및 이니셜라이저와 상관없이 동작하기 때문에 해당 프로퍼티가 호출되기 전까지는 초기화가 되지 않습니다

그러므로 값이 없음 상태로 초기화될 일이 없고 실제 사용될 때 초기화가 일어나기 때문에 let으로 선언해 주어도 되는 거예요

 

 

❗️ 다중 스레드 환경에서의 초기화 보장

lazy와 타입 프로퍼티의 차이를 하나 더 알아보겠습니다

바로, 다중 스레드 환경에서의 초기화가 보장되느냐 인데요

 

lazy는 호출할 때마다 초기화가 새로이 진행되므로 다중 스레드 환경에서 초기화가 여러 번 일어날 수 있습니다

 

하지만 타입 프로퍼티는 딱 한 번 메모리에 올라간 이후 새로운 호출이 없다고 말씀드렸습니다!

이러한 이유 때문에 타입 프로퍼티는 lazy 하게 작동하지만 조금 다르게 다중 스레드 환경에서도 여러 번의 초기화가 일어나지 않음을 보장합니다

 

 

⭐️ 타입 프로퍼티 사용법

 

이제 간단하게 타입 프로퍼티가 어떻게 사용되는지 알아보고 글을 마무리해 볼게요!

 

타입 프로퍼티는 메모리에 올라간 상태에서 모두 같은 데이터를 공유하는 것이기 때문에 타입 자체의 이름에서. 을 통해 접근해야 합니다

타입 자체.타입 프로퍼티명

이런 식으로요!

 

개발 시, 흔히 사용하는 UIColor의 .systemRed 같은 것들을 이러한 형태로 불러오는 것을 보신 적 있으실 텐데 이러한 것들이 모두 타입 프로퍼티라고 생각해 주시면 됩니다 ☺️

 

코드를 예로 살펴보면 다음과 같습니다

import UIKit

struct Student {
    static var name: String = "yunie"
    static let age: Int = 1
    static var desc: String {
        return "\\(name)은 \\(age)살입니다"
    }
}

let yunie = Student()
// 타입 자체.타입 프로퍼티명으로 접근
print(Student.name) // yunie
Student.name = "옹?"
print(Student.name) // 옹?

 

 

✏️ 오늘의 요약

  • 클래스, 구조체, 열거형에 사용된다
  • 타입 프로퍼티는 저장/연산 프로퍼티에 static을 붙인 형태이다
  • 인스턴스의 생성과 관계없이 딱 한 번 메모리에 올라간다
    • 그러므로 선언 시 초기화가 함께 이루어져야 한다
    • 다중 스레드 환경에서 여러 번 초기화가 이루어지지 않는다
  • 타입자체를 통해 접근할 수 있다
    • ex) Student.name
  • 변수/상수 모두 사용가능하다

 

📚 참고

https://seolhee2750.tistory.com/120

 

[Swift] 프로퍼티 개념 정리 (3); 타입 프로퍼티

이제 프로퍼티 마지막 종류인 타입 프로퍼티에 대해 정리해보려고 한다. 어떻게 보면 저장 프로퍼티, 연산 프로퍼티에 포함되는 내용으로 볼 수도 있겠다. 📎 타입 프로퍼티 (Type Properties) 타입

seolhee2750.tistory.com

https://babbab2.tistory.com/120

 

Swift) 프로퍼티 정복하기 (3/4) - 타입 프로퍼티(Type Property)

안녕하세요 :) 소들입니다!!! 휴~~~ 먼저 오랜만이란 말을 하고 싶네요...!! 실로 포스팅이 오랜만이기도 하고,,, 한 5일간 저에겐 많은 사건이 있었거든요...하하;; 제가 식중독에 걸렸었어요 흑흑

babbab2.tistory.com

 

'Swift' 카테고리의 다른 글

❓ 접근 제어(Access Control)  (0) 2024.06.17
❓ Delegate와 DataSource의 차이  (1) 2024.06.10
❓ 연산 프로퍼티  (0) 2024.06.05
❓ 저장 프로퍼티  (0) 2024.05.31
❓final  (0) 2024.05.27