TIL: 타입 속성(Type Properties)

Royce·2025년 3월 22일

Swift 문법

목록 보기
27/63

타입 속성(Type Properties)

  • 타입 속성(Type Properties)는 인스턴스가 아닌 타입 자체에 속산 속성이다
  • 인스턴스를 생성하지 않고도 접근할 수 있으며, 모든 인스턴스가 공유하는 값을 저장하거나 계산된 값을 제공할 때 사용한다
  • 저장 타입 속성(Stored Type Properties)과 계산 타입 속성(Computed Type Properties)으로 나뉜다

타입 속성 선언 방법

  • 저장 타입 속성: static 키워드를 사용하여 선언한다
  • 계산 타입 속성: static 또는 class 키워드를 사용하여 선언한다(class는 상속 시 재정의 가능)

저장 타입 속성(Stored Type Properties)

  • 값을 저장하는 속성이지만, 인스턴스가 아닌 타입 자체에 저장되는 속성이다
  • 모든 인스턴스가 동일하게 공유하는 값이기 때문에 인스턴스를 생성하지 않고도 접근할 수 있다

특징

  1. 선언 시 기본값이 필요
    • 인스턴스를 만들 때 초기화되는 것이 아니기 때문에 반드시 기본값이 설정되어야 한다
  2. 모든 인스턴스가 공유
    • 타입 속성은 인스턴스가 아닌 타입에 종속되므로, 모든 인스턴스가 동일한 값을 사용한다
  3. 지연 초기화(Lazy Initialization)
    • 메모리에 바로 저장되지 않고, 처음 접근할 때 메모리에 저장된다
    • lazy 키워드를 사용할 필요가 없지만, 자동으로 lazy 특성을 가진다
    • Thread-Safe : 여러 스레드에서 접근해도 안전하게 초기화된다
  4. 상속 불가
    • 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)  // 출력: 1

let employee2 = Employee(name: "Steve", position: "Developer")
print(Employee.totalEmployees)  // 출력: 2

계산 타입 속성(Computed Type Properties)

  • 실제 값을 저장하지 않고, 계산된 값을 반환하는 속성이다
  • 다른 속성을 이용해 값이 계산될 때 사용한다

특징

  1. 저장 공간을 사용하지 않는다
    • 메모리에 값이 저장되지 않고, 필요할 때마다 계산해서 반환한다
  2. 읽기 전용 또는 읽기 - 쓰기 가능
    • get 블록만 존재하면 읽기 전용 속성
    • getset 블록을 모두 구현하면 읽기 - 쓰기 속성
  3. 상속 가능
    • 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)  // 출력: 7000.0

저장 타입 속성과 계산 타입 속성의 차이점

저장 타입 속성(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)     // 출력: 기술 회사 정보

타입 속성을 선언해야 하는 경우

  1. 모든 인스턴스가 동일하게 공유해야 하는 값이 있을 때
  2. 타입과 관련된 전역 설정 값 또는 공통된 정보를 제공할 때
  3. 클래스 계층 구조에서 공통적으로 사용되며, 재정의할 수 있는 속성을 제공할 때

요약

  • 타입 속성: 인스턴스가 아닌 타입 자체에 속하는 속성
  • 저장 타입 속성: 값을 저장하며, 인스턴스를 생성하지 않고도 접근 가능(static)
  • 계산 타입 속성: 값을 저장하지 않고, 필요할 때마다 계산해서 반환(static 또는 class)
  • 상속과 재정의: class 키워드를 사용하면 재정의 가능
  • 지연 초기화: 저장 타입 속성은 자동으로 지연 초기화
  • 모든 인스턴스가 공유: 타입 자체에 종속되므로 모든 인스턴스가 공유하게 된다
profile
iOS 개발자 지망생

0개의 댓글