본문 바로가기
Swift/기본

프로퍼티

by 밤새는탐험가 2024. 4. 3.

프로퍼티 

클래스, 구조체, 열거형과 연관된 값이다.

타입과 관련된 값을 저장 및 연산이 가능하다. 

 

프로퍼티의 종류

  • 인스턴스 저장 프로퍼티 
  • 타입 저장 프로퍼티 
  • 인스턴스 연산 프로퍼티 
  • 타입 연산 프로퍼티 
  • 지연 저장 프로퍼티 

 

정의와 사용

열거형 내부에서는 연산 프로퍼티만 가능 

 

연산 프로퍼티는 "var"로만 선언 가능 

 

연산 프로퍼티는 읽기 전용으로는 구현 가능

쓰기 전용으로는 구현 불가능 

 

읽기 전용으로 구현할 경우 get 블럭만 작성

(이 때, get 블럭은 생략 가능)

 

읽기, 쓰기 모두 가능하게 하기 위해서는 get 블럭, set 블럭 모두 구현 

 

set 블럭에는 암시적 매개변수 newValue 사용 가능

 

struct FruitInfo {
    
    // 인스턴스 저장 프로퍼티
    var name: String = "Not Select"
    var title: String = ""
    var price: Double = 0
    
    
    // 인스턴스 연산 프로퍼티
    var priceToDollar: Double {
        get {
            return price / 1000
        }
        
        set(inputPrice) {
            price = inputPrice
        }
    }
    
    
    // 타입 저장 프로퍼티
    static var typeInfo: String = "과일"
    
     /*
    // 인스턴스 메서드
    func selfIntroduce() {
        print("과일 이름: \(self.name), 과일 소개: \(self.title), 과일 가격: \(self.price)")
    }
     */
    
    
    
    // 읽기 전용 인스턴스 연산 프로퍼티로 위의 selfIntroduce() 메서드 대체 가능
    
    var selfIntroduce: String {
        get {
            return "과일 이름: \(self.name), 과일 소개: \(self.title), 과일 가격: \(self.price)"
        }
    }
    
    
    /*
    // 타입 메서드
    static func selfIntroduction() {
        print("과일 타입입니다.")
    }
     */
    
    
    // 읽기 전용 타입 연산 프로퍼티에서는 get 블럭 생략
    static var selfIntroduction: String {
        return "과일 타입입니다."
    }
}

 

 

// 타입 연산 프로퍼티 사용
print(FruitInfo.selfIntroduction)    // 과일 타입입니다.


// 인스턴스 생성
var apple: FruitInfo = FruitInfo()
apple.name = "사과"
apple.title = "맛있는 청송 사과"
apple.price = 2000

print(apple)   // FruitInfo(name: "사과", title: "맛있는 청송 사과", price: 2000)

var appleInfo = apple.selfIntroduce
print(appleInfo)   // 과일 이름: 사과, 과일 소개: 맛있는 청송 사과, 과일 가격: 2000


print("\(apple.name)의 달러 가격: \(apple.priceToDollar)")  // 사과의 달러 가격: 2.0

 

 

응용

won 이라는 연산 프로퍼티를 보면

won 이라는 연산 프로퍼티에 값을 넣고

dollar를 출력하면 set 블럭이 동작하여 값을 반환한다.

 

dollar에 값을 넣고, won을 출력하면 get 블럭이 동작하여 값을 반환한다. 

struct Money {
    var currencyRate: Double = 1100
    var dollar: Double = 0
    var won: Double {
        get {
            return dollar * currencyRate
        }
        set {
            dollar = newValue / currencyRate
        }
    }
}


var myMoney = Money()
myMoney.won = 110000
print(myMoney.dollar)  // 100.0

myMoney.dollar = 20
print(myMoney.won)     // 22000.0

 

 

지역변수 및 전역변수 

저장 프로퍼티와 연산 프로퍼티의 기능은 함수, 메서드, 클로저, 타입 등의 

외부에 위치한 지역/전역 변수에도 사용 가능 

 

var a: Int = 100
var b: Int = 200
var sum: Int {
    return a + b
}

print(sum) // 300

 

 

 

프로퍼티 감시자

프로퍼티 감시자를 통해 프로퍼티 값이 변경될 때마다 동작을 수행할 수 있다. 

 

값이 변경되기 직전 ▶️ willSet 블럭

값이 변경된 직후 ▶️ didSet 블럭

 

wiilSet 블럭 또는 didSet 블럭 둘 중에 하나만 구현도 가능하다.

 

값이 변경 전, 후 차이가 없고 같더라도 프로퍼티 감시자는 동작한다. 

 

willSet 블럭에서는 newValue,

didSet 블럭에서는 oldValue를 매개변수로 사용할 수 있다.

 

 

정의 및 사용

 

currencyRate에 프로퍼티 감시자를 적용했다.

willSet에는 새로운 값에 대해 newRate 라는 매개변수 이름을 쓰고, 

didSet에는 오래된 값에 대해 oldRate 라는 매개변수 이름을 썼다.

 

dollar변수에 프로퍼티 감시자를 보면 암시적으로

willSet에는 newValue, 

didSet에는 oldValue를 사용했다. 

struct Money {
    // 프로퍼티 감시자 사용
    var currencyRate: Double = 1100 {
        willSet(newRate) {
            print("환율이 \(currencyRate)에서 \(newRate)으로 변경될 예정입니다")
        }
        
        didSet(oldRate) {
            print("환율이 \(oldRate)에서 \(currencyRate)으로 변경되었습니다")
        }
    }

    // 프로퍼티 감시자 사용
    var dollar: Double = 0 {
        // willSet의 암시적 매개변수 이름 newValue
        willSet {
            print("\(dollar)달러에서 \(newValue)달러로 변경될 예정입니다")
        }
        
        // didSet의 암시적 매개변수 이름 oldValue
        didSet {
            print("\(oldValue)달러에서 \(dollar)달러로 변경되었습니다")
        }
    }

    // 연산 프로퍼티
    var won: Double {
        get {
            return dollar * currencyRate
        }
        set {
            dollar = newValue / currencyRate
        }
        
        /* 프로퍼티 감시자와 연산 프로퍼티 기능을 동시에 사용할 수 없습니다
        willSet {
            
        }
         */
    }    
}

 

 

var moneyInMyPocket: Money = Money()

// 환율이 1100.0에서 1150.0으로 변경될 예정입니다
moneyInMyPocket.currencyRate = 1150
// 환율이 1100.0에서 1150.0으로 변경되었습니다

// 0.0달러에서 10.0달러로 변경될 예정입니다
moneyInMyPocket.dollar = 10
// 0.0달러에서 10.0달러로 변경되었습니다

print(moneyInMyPocket.won)
// 11500.0

 

 

'Swift > 기본' 카테고리의 다른 글

인스턴스의 생성과 소멸  (0) 2024.04.05
상속  (0) 2024.04.04
Class vs Struct / Enum  (0) 2024.04.03
열거형  (0) 2024.04.02
클래스 (Class)  (0) 2024.04.01