티스토리 뷰

Swift

[Swift] 프로퍼티의 종류

Hani_Levenshtein 2021. 1. 13. 03:53

프로퍼티는 클래스, 구조체 그리고 열거형에서 객체의 상태를 나타내는 요소입니다.

이번 포스팅에서는 프로퍼티의 종류에 관하여 알아볼 것입니다.


저장 프로퍼티(Stored Properties)

struct FixedLengthRange {
    var firstValue: Int
    let length: Int
}
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)
// 범위 값은 0, 1, 2 입니다.
rangeOfThreeItems.firstValue = 6
// 범위 값은 6, 7, 8 입니다.

저장 프로퍼티는 말 그대로 값을 저장하고 있는 프로퍼티입니다. 클래스와 구조체에서 사용됩니다.

구조체는 프로퍼티가 옵셔널이 아니여도 이니셜라이저를 자동으로 생성합니다

클래스는 프로퍼티가 옵셔널이 아니면 프로퍼티의 디폴트 값, 또는, 지정 이니셜라이저로 초기화 해야합니다.

 

변수로 선언된 객체는 변수로 선언된 프로퍼티의 값을 변경할 수 있습니다.

 

let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
// 범위 값은 0, 1, 2, 3 입니다.
rangeOfFourItems.firstValue = 6
// 에러 발생!

상수로 선언된 객체는 변수로 선언된 프로퍼티의 값을 변경할 수 없습니다.

상수로 선언된 프로퍼티는 객체가 상수든 변수든 값을 변경할 수 없습니다.


지연 저장 프로퍼티(lazy Stored Properties)

class DataImporter {
    /*
        DataImporter는 외부 파일에서 데이터를 가져오는 클래스입니다.
         이 클래스는 초기화 하는데 매우 많은 시간이 소요된다고 가정하겠습니다.
     */
    var filename = "data.txt"
    // 데이터를 가져오는 기능의 구현이 이 부분에 구현돼 있다고 가정
}

class DataManager {
    lazy var importer = DataImporter()
    var data = [String]()
    // 데이터를 관리하는 기능이 이 부분에 구현돼 있다고 가정
}

let manager = DataManager()
manager.data.append("Some data")
manager.data.append("Some more data")
// DataImporter 인스턴스는 이 시점에 생성돼 있지 않습니다.

지연 저장 프로퍼티는 값이 처음으로 사용 되기 전에는 초기값이 없는 프로퍼티입니다. lazy를 붙여 선언합니다.

지연 저장 프로퍼티는 호출되기 전에는 값을 갖지 않는 프로퍼티이기 때문에 변수로만 선언해야 합니다.

 

프로퍼티가 인스턴스에 의존이며 인스턴스를 초기화하는데 많은 부하가 걸릴 때 지연 저장 프로퍼티를 


연산 프로퍼티(Computed Properties)

 

연산 프로퍼티는 특정 상태에 따른 값을 연산하는 프로퍼티입니다. 클래스와 구조체 그리고 열거형에서 사용됩니다.

 

 

인스턴스 내/외부의 값을 연산하여 적절한 값을 돌려주는 getter

의 역할이나 은닉화된 내부의 프로퍼티 값을 간접적으로 설정하는 setter

 

굳이 메서드를 두고 왜 연산프로퍼티를 쓸까요? 그 이유에 대해 생각을 해보자면 인스턴스 외부에서 메서드를 통해 인스턴스 내부 값에 접근 하려면 메서드를 두개(getter, setter)를 구현해야합니다.

다만, 주의해야될 점은 연산 프로퍼티는 접근자인 get메서드처럼 읽기 전용을 구현하기 쉽지만, 쓰기 전용은 구현할 수 없다는 단점이 있습니다.(메서드로는 가능하지만 프로퍼티로는 불가능)

 


프로퍼티 감시자(Property Observers)

 

프로퍼티 감시자를 사용하면 프로퍼티의 값이 새로 할당될 때마다 감시자의 내용이 호출됩니다.

새로 할당되는 값이 현재의 값과 같더라도 호출되며, 오직 저장 프로퍼티에서만 적용할 수 있습니다.


프로퍼티 감시자에는 프로퍼티의 값이 할당되기 전후로 호출되는 두 가지 메서드가 존재합니다.

이는 프로퍼티의 값이 변경되기 전에 호출되는 willSet 메서드와 변경된 후에 호출되는 didSet 메서드입니다.

 

willSet 메서드의 매개변수는 프로퍼티가 변경될 값이고, didSet 메서드의 매개변수는 변경되기 전의 값입니다.

매개변수를 지정하지 않으면 willSet에는 newValue, didSet에는 oldValue가 매개변수로 자동으로 저장됩니다.

class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) { // 매개변수를 지정해줌
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet { // 매개변수를 지정하지 않음
            if totalSteps > oldValue  { // 매개변수가 oldValue로 대체됨
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 0 steps
stepCounter.totalSteps = 300
// About to set totalSteps to 300
// Added 100 steps

타입 프로퍼티(Type Properties)

 

인스턴스가 아닌 타입 자체에 속하게 되는 프로퍼티를 타입 프로퍼티라고 합니다

타입 프로퍼티는 인스턴스의 생성 여부와 상관없이 타입 프로퍼티의 값은 하나입니다.

따라서 타입프로퍼티는 그 타입의 모든 인스턴스가 공통으로 사용되는 값을 정의할 때 유용합니다.

class A{
    var aaa :String? // 인스턴스 프로퍼티
    class var bbb:Int = 99 // 타입 프로퍼티
    static var ccc:Int = 100 // 재정의 불가 타입 프로퍼티
}

print(A.bbb) //99
A.bbb=100
print(A.bbb) //100

인스턴스 프로퍼티와는 다르게 이니셜라이저가 존재하지 않아서 항상 초기값을 지정해야합니다.

 

 

'Swift' 카테고리의 다른 글

[Swift] 익스텐션  (0) 2021.01.17
[Swift] 인스턴스  (0) 2021.01.16
[Swift] 메서드  (0) 2021.01.13
[Swift] 옵셔널  (0) 2021.01.12
[Swift] 클래스와 구조체  (0) 2021.01.10
댓글