Swift & iOS

[Swift] 프로퍼티 (Properties)

hammii 2022. 6. 15. 16:31
728x90
반응형

프로퍼티란?

클래스, 구조체, 열거형 등에 관련된 값이다.

저장 프로퍼티, 연산 프로퍼티, 타입 프로퍼티에 대해 알아보자.

 

1. 저장 프로퍼티

  • 인스턴스의 변수 또는 상수를 의미한다.
  • 변수나 상수로 선언된 클래스나 구조체의 일부분으로 저장되는 것
  • 인스턴스가 상수(let)로 선언되었다면, 구조체 내에 저장 프로퍼티는 변경 불가능하다.
    • 구조체가 값 타입이고, 구조체 내부의 프로퍼티들이 모두 상수가 되기 때문
    • But, 클래스는 참조 타입이어서 인스턴스를 상수로 선언해도 프로퍼티의 값을 변경할 수 있다.
struct Dog {
    var name: String
    let gender: String
}

var dog = Dog(name: "iku", gender: "Male")
dog.gender = "Female" // 에러 - 프로퍼티가 상수이기 때문에

let dog2 = Dog(name: "mojji", gender: "Male") 
dog2.name = "nara" // 에러 - 인스턴스가 상수이기 때문에

 

2. 연산 프로퍼티

  • 값을 직접적으로 저장하지 않는 대신, getter와 setter를 사용해 다른 프로퍼티에 직접적으로 접근한다.
    • 인스턴스 내,외부의 값을 연산해서 적절한 값을 돌려주는 접근자 역할이나
    • 내부의 프로퍼티의 값을 간접적으로 설정하는 설정자 역할을 할 수 있다.
  • set 말고 get 만 쓰면 읽기 전용 프로퍼티가 된다.
  • set 매개변수를 설정해주지 않으면 디폴트로 newValue로 값이 설정된다.
struct Stock {
    var averagePrice: Int
    var quantity: Int
    
    var purchasePrice: Int {
        get {
            return averagePrice * quantity
        }
        set(newPrice) {
            averagePrice = newValue / quantity
        }
    }
}

var stock = Stock(averagePrice: 2300, quantity: 3)

 

3. 타입 프로퍼티

인스턴스 생성 없이 객체 내에 프로퍼티에 접근을 가능하게 하는 것

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
}

SomeStructure.computedTypeProperty
SomeStructure.storedTypeProperty

 

4. 프로퍼티 옵저버

  • 프로퍼티의 값의 변화를 관찰하고 반영한다.
  • 새로운 값이 기존 값과 같더라도 프로퍼티 옵저버는 호출된다.
  • 프로퍼티가 set 될 때마다 호출된다고 생각하면 된다.

 

willSet 옵저버

  • 새로 저장될 프로퍼티의 값을 상수 매개변수로 전달한다.
  • 이 값을 willSet 구문 안에서 사용할 수 있고, 지정하지 않으면 디폴트로 newValue로 사용한다.

didSet 옵저버

  • 프로퍼티의 기존 값이 상수 매개변수로 전달된다.
  • 이 변수를 didSet 구문안에서 사용할 수 있으며, 지정하지 않으면 디폴트로 oldValue로 사용한다.
class Account {
    var credit: Int = 0 {
        willSet {
            print("잔액이 \(credit)원에서 \(newValue)원으로 변경될 예정입니다.")
        }
        didSet {
            print("잔액이 \(oldValue)원에서 \(credit)원으로 변경되었습니다.")
        }
    }
}

var account = Account()
account.credit = 1000	
// Prints "잔액이 0원에서 1000원으로 변경될 예정입니다."
// Prints "잔액이 0원에서 1000원으로 변경되었습니다."

 

 

출처: [패스트캠퍼스] 30개 프로젝트로 배우는 iOS 앱 개발 with Swift 초격차 패키지 Online.

 

728x90
반응형