본문 바로가기
카테고리 없음

8. 프로퍼티와 프로퍼티 옵저버

by swifttt 2025. 3. 31.

 

 

Swift에서 프로퍼티(Property)는 클래스나 구조체, 열거형에 포함된 값(데이터)을 저장하거나 계산하는 데 사용되는 변수 또는 상수입니다.
Swift는 세 가지 종류의 프로퍼티를 제공합니다: 저장 프로퍼티(stored property), 계산 프로퍼티(computed property), 그리고 프로퍼티 옵저버(property observer)입니다.

프로퍼티는 객체의 상태를 표현하며, 프로퍼티 옵저버를 통해 값의 변경을 감지하고 이에 따른 반응을 정의할 수 있습니다.

1. 저장 프로퍼티 (Stored Property)

저장 프로퍼티는 인스턴스의 일부 데이터를 저장하는 변수 또는 상수입니다.
구조체 또는 클래스 정의 내부에 선언하며, 인스턴스를 만들 때마다 새로운 저장 공간이 생성됩니다.

struct User {
    var name: String
    var age: Int
}

let user1 = User(name: "지민", age: 28)
print(user1.name)  // 지민

User 구조체는 nameage라는 두 개의 저장 프로퍼티를 가지고 있습니다.

2. 계산 프로퍼티 (Computed Property)

계산 프로퍼티는 실제 값을 저장하지 않고, 특정 계산 결과를 반환하거나 설정하는 데 사용됩니다. getset을 통해 정의합니다.

struct Rectangle {
    var width: Double
    var height: Double

    var area: Double {
        return width * height
    }
}

let rect = Rectangle(width: 5.0, height: 3.0)
print("면적: \(rect.area)")  // 면적: 15.0

계산 프로퍼티는 연산된 값을 반환하므로, 상태를 직접 저장하지 않고도 속성처럼 사용할 수 있습니다.

3. 읽기 전용 계산 프로퍼티

계산 프로퍼티는 get만 구현하여 읽기 전용으로 만들 수도 있습니다.

struct Circle {
    var radius: Double

    var diameter: Double {
        get {
            return radius * 2
        }
    }
}

또는 get 키워드를 생략할 수도 있습니다.

4. 프로퍼티 옵저버 (willSet, didSet)

저장 프로퍼티에 값을 설정할 때마다 특정 동작을 실행하고 싶다면 프로퍼티 옵저버를 사용할 수 있습니다.
옵저버는 willSetdidSet 두 가지로 구성됩니다.

class StepCounter {
    var steps: Int = 0 {
        willSet {
            print("곧 steps가 \(newValue)로 바뀝니다.")
        }
        didSet {
            print("steps가 \(oldValue)에서 \(steps)로 변경되었습니다.")
        }
    }
}

let counter = StepCounter()
counter.steps = 10
counter.steps = 20

출력 결과:

곧 steps가 10로 바뀝니다.
steps가 0에서 10로 변경되었습니다.
곧 steps가 20로 바뀝니다.
steps가 10에서 20로 변경되었습니다.

willSet은 값이 설정되기 직전에 호출되며, newValue를 사용할 수 있습니다.
didSet은 값이 설정된 직후에 호출되며, 이전 값을 oldValue로 참조할 수 있습니다.

5. 초기값 없는 저장 프로퍼티

초기값이 없는 저장 프로퍼티는 생성자(init)를 통해 반드시 초기화되어야 합니다.

struct Profile {
    var nickname: String
    var age: Int
}

이 경우 Profile(nickname:age:) 생성자가 자동으로 생성되며, 인스턴스 생성 시 값을 전달해야 합니다.

마무리

프로퍼티는 객체 내부 상태를 구성하는 핵심 요소이며, 계산 프로퍼티를 통해 동적인 값을 만들 수 있고, 옵저버를 통해 상태 변화에 반응하는 로직을 구현할 수 있습니다. Swift의 프로퍼티 시스템은 코드의 명확성과 안정성을 높이는 데 큰 역할을 합니다.