Search
💾

Properties - 저장 프로퍼티 (Stored Properties)

프로퍼티는 값을 클래스(Class), 구조체(Struct), 열거형(Enum) 에 연결합니다.
프로퍼티의 종류
저장 프로퍼티 (Stored Properties)
연산 프로퍼티 (Computed Properties)
타입 프로퍼티 (Type Properties)
저장 프로퍼티는 실제 상수와 변수 값을 인스턴스로 가집니다. 클래스와 구조체에서 사용되며 열거형에서는 사용할 수 없습니다.
연산 프로퍼티는 값을 가지지 않고 호출 될 때 마다 특정 값을 연산해 리턴 합니다. 클래스, 구조체, 열거형 모두에서 사용할 수 있습니다.
이렇게 만들어진 프로퍼티는 특정 타입을 가질 수 있습니다. (보통 타입을 가지죠.) 이런 프로퍼티를 타입 프로퍼티라고 합니다.
struct FixedLengthRange { var firstValue: Int let length: Int } // Init var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) rangeOfThreeItems.firstValue = 6 rangeOfThreeItems.length = 10 // Error
Swift
복사
struct 의 경우 Value Type 이라 사용할 때 var 로 선언해주지 않으면 초기화 후 값을 변경 할 수 없습니다.
let rangeOfFourItems = FixedLengthRange(firstValue: 0, length: 4) rangeOfFourItems.firstValue = 6 // Error
Swift
복사
But Class 는 Reference Type 이기 때문에 Class 의 원본으로 바로 접근 합니다.
따라서 Class 를 let으로 선언해도 Error가 나지 않습니다.
class FixedLengthRange { var firstValue: Int let length: Int } let rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) rangeOfThreeItems.firstValue = 6
Swift
복사

Lazy Stored Properties

Lazy로 선언한 프로퍼티 변수는 프로터피가 initial 되더라도 실행되지 않고 처음으로 값이 사용되는 시점에 초기화를 진행합니다.
class 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")
Swift
복사
위 함수가 실행되어도 lazy var importer = DataImporter() 는 실행되지 않음.
manager.importer.filename = "NewFile.txt"
Swift
복사
이런식으로 최초로 importer 에 엑세스하면,
var importer = DataInporter()가 실행됩니다.
lazy 를 잘 활용하면 앱 성능이나 저장공간 활용에 최적화가 가능해집니다.
주의할 점
If a property marked with the lazy modifier is accessed by multiple threads simultaneously and the property has not yet been initialized, there is no guarantee that the property will be initialized only once.
lazy를 사용할 때 여러 스레드에서 동시에 엑세스하고 프로퍼티가 아직 초기화 되지 않았다면 (아마 처음 사용이니 초기화를 진행할 텐데) 한번만 초기화 된다는 보장이 없습니다.
이 부분만 고려해서 쓰면 되겠네요. 쉽게 일어나는 일은 아니지만 그냥 알고 있음 좋겠죠.