Property
Property 는
값을 특정 클래스, 구조체, 열거형과 연결한다.
Swift 에서 Property 는 크게 세 가지로 나눌 수 있다.
Stored Property
]상수와 변수값을 인스턴스의 일부로 저장한다.
클래스와 구조체에서만 사용된다.
Computed Property
]특정 연산을 수행하여, 값을 반환한다.
클래스, 구조체, 열거형에서 사용된다.
Type Property
]프로퍼티를 타입 자체와 연결한 형태이다.
저장 프로퍼티 [Stored Property]
클래스와 구조체의 인스턴스의 일부가 되는 상수, 변수이다.
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
가 상수로 선언되었다면,그 안의 firstValue
와 length
모두 상수로 선언된 것과 같이 된다.
이는 구조체가 Value Type 이기 때문이다.
cf.
구조체는 기본적으로,
저장프로퍼티를 파라미터로 가지는 이니셜라이저가 있으므로,
초깃값을 줬다면FixedLengthRange()
도 가능하다.
클래스에서 저장 프로퍼티의 초깃값이 없다면,
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(저장 프로퍼티)