타입 속성(Type Properties)
- 타입 속성(Type Properties)는 인스턴스가 아닌 타입 자체에 속산 속성이다
- 인스턴스를 생성하지 않고도 접근할 수 있으며, 모든 인스턴스가 공유하는 값을 저장하거나 계산된 값을 제공할 때 사용한다
- 저장 타입 속성(Stored Type Properties)과 계산 타입 속성(Computed Type Properties)으로 나뉜다
타입 속성 선언 방법
- 저장 타입 속성:
static 키워드를 사용하여 선언한다
- 계산 타입 속성:
static 또는 class 키워드를 사용하여 선언한다(class는 상속 시 재정의 가능)
저장 타입 속성(Stored Type Properties)
- 값을 저장하는 속성이지만, 인스턴스가 아닌 타입 자체에 저장되는 속성이다
- 모든 인스턴스가 동일하게 공유하는 값이기 때문에 인스턴스를 생성하지 않고도 접근할 수 있다
특징
- 선언 시 기본값이 필요
- 인스턴스를 만들 때 초기화되는 것이 아니기 때문에 반드시 기본값이 설정되어야 한다
- 모든 인스턴스가 공유
- 타입 속성은 인스턴스가 아닌 타입에 종속되므로, 모든 인스턴스가 동일한 값을 사용한다
- 지연 초기화(Lazy Initialization)
- 메모리에 바로 저장되지 않고, 처음 접근할 때 메모리에 저장된다
lazy 키워드를 사용할 필요가 없지만, 자동으로 lazy 특성을 가진다
- Thread-Safe : 여러 스레드에서 접근해도 안전하게 초기화된다
- 상속 불가
static 키워드로 선언된 저장 타입 속성은 상속할 수 없다
class Employee {
static var totalEmployees: Int = 0
var name: String
var position: String
init(name: String, position: String) {
self.name = name
self.position = position
Employee.totalEmployees += 1
}
}
let employee1 = Employee(name: "Royce", position: "Manager")
print(Employee.totalEmployees)
let employee2 = Employee(name: "Steve", position: "Developer")
print(Employee.totalEmployees)
계산 타입 속성(Computed Type Properties)
- 실제 값을 저장하지 않고, 계산된 값을 반환하는 속성이다
- 다른 속성을 이용해 값이 계산될 때 사용한다
특징
- 저장 공간을 사용하지 않는다
- 메모리에 값이 저장되지 않고, 필요할 때마다 계산해서 반환한다
- 읽기 전용 또는 읽기 - 쓰기 가능
get 블록만 존재하면 읽기 전용 속성
get과 set 블록을 모두 구현하면 읽기 - 쓰기 속성
- 상속 가능
class 키워드로 선언하면 하위 클래스에서 재정의할 수 있다
class Company {
static var totalRevenue: Double = 0.0
static var totalExpenses: Double = 0.0
static var profit: Double {
return totalRevenue - totalExpenses
}
static func addRevenue(amount: Double) {
totalRevenue += amount
}
static func addExpense(amount: Double) {
totalExpenses += amount
}
}
Company.addRevenue(amount: 10000)
Company.addExpense(amount: 3000)
print(Company.profit)
저장 타입 속성과 계산 타입 속성의 차이점
| 저장 타입 속성(Stored Type Properties) | 계산 타입 속성(Computed Type Properties) |
|---|
| 값을 저장한다 | 값을 저장하지 않고 매번 계산한다 |
| 선언 시 기본값이 필요하다 | 선언 시 초기값이 필요하지 않다 |
static 키워드로 선언한다 | static 또는 class 키워드로 선언한다 |
| 모든 인스턴스가 공유한다 | 모든 인스턴스가 동일하게 계산된 값을 반환한다 |
| 메모리에 저장된다 | 메모리에 저장되지 않는다 |
| 상속과 재정의가 불가능하다 | class 키워드를 사용하면 재정의 가능하다 |
상속과 타입 속성(Overriding Type Properties)
class BaseCompany {
class var description: String {
return "기본 회사 정보"
}
}
class TechCompany: BaseCompany {
override class var description: String {
return "기술 회사 정보"
}
}
print(BaseCompany.description)
print(TechCompany.description)
타입 속성을 선언해야 하는 경우
- 모든 인스턴스가 동일하게 공유해야 하는 값이 있을 때
- 타입과 관련된 전역 설정 값 또는 공통된 정보를 제공할 때
- 클래스 계층 구조에서 공통적으로 사용되며, 재정의할 수 있는 속성을 제공할 때
요약
- 타입 속성: 인스턴스가 아닌 타입 자체에 속하는 속성
- 저장 타입 속성: 값을 저장하며, 인스턴스를 생성하지 않고도 접근 가능(
static)
- 계산 타입 속성: 값을 저장하지 않고, 필요할 때마다 계산해서 반환(
static 또는 class)
- 상속과 재정의:
class 키워드를 사용하면 재정의 가능
- 지연 초기화: 저장 타입 속성은 자동으로 지연 초기화
- 모든 인스턴스가 공유: 타입 자체에 종속되므로 모든 인스턴스가 공유하게 된다