공부/SWIFT

[SWIFT] 프로퍼티( 저장 프로퍼티 ) ★★★

알로하리미 2021. 3. 11. 15:58
728x90

1. 개요

프로퍼티는 클래스, 구조체 또는 열거형 등에 관련된 값(속성)을 뜻한다.

저장(Stored), 연산(Computed), 타입 프로퍼티로 나눈다.

저장 프로퍼티 : 특정 타입의 인스턴스의 변수, 상수를 칭함. (구조체 , 클래스 에서 사용)

* 프로퍼티의 값이 변하는 것을 감시하는 프로퍼티 감시자(Property Observers)도 있다.

 

 

 

 

2. 저장 프로퍼티

구조체의 저장프로퍼티 

저장 프로퍼티를 매개변수로 갖는 생성자를 갖고 있습니다.(자동생성)

기본값을 할당 해줘도 되고, 안해도 됩니다.

기본값을 할당했다면 굳이 생성자의 전달인자로 초깃값을 넘길 필요가 없습니다.

기본값과 다른 초기값을 가질시에는 인스턴스 생성시 생성자의 전달인자로 값을 넘기면됩니다.

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) 그 구조체 인스턴스의 프로퍼티를 변경할 수 없습니다.
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4)
// 범위 값은 0, 1, 2, 3 입니다.
rangeOfFourItems.firstValue = 6
// 에러 발생!

 

 

클래스의 저장 프로퍼티

저장 프로퍼티가 옵셔널이 아니라면 기본값을 지정해주거나

사용자 정의 이니셜라이저를 통해 반드시 초기화 해주어야 합니다.

( 지정되면 사용자 정의 생성자를 구현 할 필요 없다.)

 

 

지연 저장 프로퍼티

프로퍼티의 선언 앞에 lazy 키워드를 붙이면 됩니다.

실제 사용되기 전에는 실행되지 않는다.( 예를들어, 인스턴스 생성하고 딱!!! 그 lazy 변수를 호출 했을시에 할당 및 구현 된다는 것이다. 전역변수 및 전역상수가 그러하다 ) 그래서 성능 저하및 공간 낭비를 줄 일 수 있다.

지연 프로퍼티는 반드시 변수(var)로 선언해야 합니다. 왜냐하면 상수는 초기화가 되기전에 항상 값을 같는 프로퍼티인데, 지연 프로퍼티는 처음 사용되기 전에는 값을 갖지 않는 프로퍼티이기 때문입니다.

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 변수를 따아악!! !호출! 할때 생성된다.
// 즉, 필요할때만 호출하고 그때만 연산된다는 점이다.
print(manager.importer.filename)
// the DataImporter 인스턴스가 생성되었습니다.
// "data.txt" 파일을 출력합니다.

* 만약 지연 프로퍼티가 여러 스레드에서 사용되면 지연 프로퍼티가 한번만 실행되는 걸 보장하지 않습니다. 만약 지연 프로퍼티가 단일 스레드에서 사용되면 초기화는 한번만 하게 됩니다.

 

 

 

2021.03.11 - [공부/SWIFT] - [SWIFT] 프로퍼티( 연산 프로퍼티 ) ★★★

2021.03.11 - [공부/SWIFT] - [SWIFT] 프로퍼티( 타입 프로퍼티 ) ★★★

2021.03.11 - [공부/SWIFT] - [SWIFT] 프로퍼티( 프로퍼티 옵저버 ) ★★★