[iOS] Property 1

Eugenie·2022년 4월 12일
0

[iOS] Property

목록 보기
1/2

Property

Property
값을 특정 클래스, 구조체, 열거형과 연결한다.


Swift 에서 Property 는 크게 세 가지로 나눌 수 있다.

🌵 저장 프로퍼티 [ Stored Property ]

상수와 변수값을 인스턴스의 일부로 저장한다.
클래스구조체에서만 사용된다.

🌵 연산 프로퍼티 [ Computed Property ]

특정 연산을 수행하여, 값을 반환한다.
클래스, 구조체, 열거형에서 사용된다.

🌵 타입 프로퍼티 [ Type Property ]

프로퍼티를 타입 자체와 연결한 형태이다.


저장 프로퍼티 [Stored Property]

클래스와 구조체의 인스턴스의 일부가 되는 상수, 변수이다.

구조체 [ Struct ]

struct FixedLengthRange {
	var firstValue: Int  // 변수 저장 프로퍼티
    let length: Int      // 상수 저장 프로퍼티
}

// 초깃값 설정 - firstValue : 0, length: 3
var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)

rangeOfThreeItems.firstValue = 6
rangeOfThreeItems.length = 10    // Error

rangeOfThreeItems변수로 선언되었고,
그 안의 firstValue변수, length상수로 선언되었다.

firstValue변수 이므로, 값 변경이 가능하고,

length상수로 선언되었기 때문에,
값을 변경하려고 하면 Error 가 발생한다.

❗️ 만약 rangeOfThreeItems상수로 선언되었다면,

그 안의 firstValuelength 모두 상수로 선언된 것과 같이 된다.

이는 구조체가 Value Type 이기 때문이다.

cf.
구조체는 기본적으로,
저장프로퍼티를 파라미터로 가지는 이니셜라이저가 있으므로,
초깃값을 줬다면 FixedLengthRange() 도 가능하다.

클래스 [ Class ]

클래스에서 저장 프로퍼티의 초깃값이 없다면,
init반드시 필요하다.

class FixedLengthRange {
	var firstValue: Int  // 변수 저장 프로퍼티
    let length: Int      // 상수 저장 프로퍼티
    
    init(firstValue: Int, length: Int) {
    	self.firstValue = firstValue
        self.length = length
    }
}

var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3)

rangeOfThree.firstValue = 3
rangeOfThreeItems.length = 10 // Error

rangeOfThreeItems변수로 선언되었고,
그 안의 firstValue변수, length상수로 선언되었다.

firstValue변수이므로, 값 변경이 가능하고,

length상수로 선언되었기 때문에,
값을 변경하려고 하면 Error 가 발생한다.

❗️ 만약 rangeOfThreeItems 가 상수로 선언되었다면,

그 안의 firstValue 의 값을 바꾸려고할 때,
Error 가 발생하지 않는다.

length 는 상수로 선언되었기 때문에,
값을 변경하려고 하면 Error 가 발생한다.

이는 클래스가 Reference Type 이기 때문이다.

게으른 저장 프로퍼티 [ Lazy Stored Property ]

Lazy Stroed Property
값이 사용되기 전까지는 값이 계산되지 않는 프로퍼티이다.

// example

class DataImporter {
	var filename = "data.txt"
}

class DataManager {
	
    // DataImporter 인스턴스, lazy 로 선언
	lazy var importer = DataImporter()
    var data = [String]()
}

// DataManager 인스턴스
// DataManager 의 저장 프로퍼티들은 초깃값이 있으므로,
// init 이 없어도 된다.
let manager = DataManager()

// DataManager 의 저장프로퍼티 'data' 에
// 데이터를 추가한다.
manager.data.append("Some data")
manager.data.append("Some more data")

manager 라는 DataManager 인스턴스를 이용하여
importer 프로퍼티는 한 번도 접근된 적이 없고

lazy 로 선언되었기 때문에,
DataImporter 인스턴스는 아직까지 생성되지 않았다.

importer 프로퍼티에 처음 접근하고 사용될 때,
DataImporter 인스턴스가 생성된다.

print(manager.importer.filename)

❗️ 게으른 저장 프로퍼티는

인스턴스 초기화가 될 때까지 초깃값을 모르고
외부요소에 의존 하는 경우이거나,

초깃값이 복잡하거나 계산비용이 많이 드는 설정을
필요로 할 때에 유용하다.

반드시 변수로서 선언해야 한다.
값이 필요할 때 초기화를 하기 때문이다.

초기화되지 않은 상태에서
여러 쓰레드동시접근한다면,
이 프로퍼티가 단 한 번만 초기화된다는 것을 보장할 수 없으므로,
주의해야 한다.


📚 Reference
The Swift Language Guide
Swift ) Properties - Stored Property(저장 프로퍼티)

profile
🌱 iOS developer

0개의 댓글