[iOS/Swift] 저장 속성(Stored Property) 이란? (2/2)
지난번 포스팅에 이어서 저장 속성(Stored Property)을 설명해 보겠습니다.
지난 포스팅은 여기를 참고 해주시면 됩니다.
지연 저장 속성(Lazy Stored Property)
지연 저장 속성(Lazy Stored Property)은 객체 지향 프로그래밍에서 필요할 때까지 초기화되지 않는 속성을 의미합니다. 즉, 해당 속성에 처음 접근하는 시점에 값이 계산되고 초기화된 후, 메모리에 저장되어 이후에는 재사용되는 속성입니다.
그렇다면 저장속성과 지연 저장 속성의 차이점은 무엇일까
저장 속성은 인스턴스를 생성할 때, 즉 인스턴스가 초기화되는 시점에 함께 초기화됩니다. 즉, 객체가 생성될 때 모든 저장 속성은 미리 값을 할당받아 준비된 상태로 존재하게 됩니다. 이는 속성이 즉시 사용될 수 있도록 보장하지만, 불필요하게 메모리를 사용할 수도 있습니다.
반면, 지연 저장 속성은 그 초기화를 지연시킵니다. 인스턴스가 생성될 때 자동으로 초기화되지 않고, 해당 속성에 처음 접근하는 시점에 비로소 초기화가 이루어집니다. 이 방식은 초기화 비용이 큰 속성이나, 프로그램 실행 중 사용될 가능성이 낮은 속성에 특히 유용합니다. 초기화 시점을 늦춤으로써, 메모리 사용과 계산 비용을 최적화할 수 있습니다.
따라서, 지연 저장 속성은 필요할 때만 초기화하여 자원을 효율적으로 사용하는 데 기여합니다.
지연 저장 속서성의 문법은 단순합니다.
저장 속성 앞에 lazy키워드를 붙이면 지연 저장 속성이 됩니다.
class ClassName {
lazy var propertyName: PropertyType = {
// 초기화에 필요한 코드
return 초기화된 값
}()
}
여기서 주의할 점은 지연 저장 속성은 꼭 변수(var)로 선언해야 한다는 것입니다.
지연 저장 속성은 초기화 이후에도 값을 변경할 수 있어야 하므로, 반드시 변수(var)로 선언해야 합니다.
상수(let)로 선언하게 된다면 초기화 이후 값을 변경할 수 없기 때문에, 지연 저장 속서의 특성과 맞지 않게 됩니다.
그렇다면 저장 속성와 지연 저장 속성의 차이점을 코드와 출력결과를 통하여 확인해보겠습니다.
class DataLoader {
// 저장 속성
var immediateValue: String = {
print("저장 속성 초기화 중...")
return "저장된 데이터"
}()
// 지연 저장 속성
lazy var lazyValue: String = {
print("지연 저장 속성 초기화 중...")
return "지연된 데이터"
}()
init() {
print("DataLoader 객체가 생성되었습니다.")
}
}
// 인스턴스 생성
let loader = DataLoader()
// 저장 속성 접근
print("저장 속성에 접근합니다.")
print(loader.immediateValue)
// 지연 저장 속성 접근
print("지연 저장 속성에 접근합니다.")
print(loader.lazyValue)
// 지연 저장 속성에 다시 접근
print("지연 저장 속성에 다시 접근합니다.")
print(loader.lazyValue)
먼저 출력 결과는 다음과 같습니다. 출력결과를 확인하면서 코드를 살펴보겠습니다.
저장 속성 초기화 중...
DataLoader 객체가 생성되었습니다.
저장 속성에 접근합니다.
저장된 데이터
지연 저장 속성에 접근합니다.
지연 저장 속성 초기화 중...
지연된 데이터
지연 저장 속성에 다시 접근합니다.
지연된 데이터
1. 저장 속성 초기화 중...
- 저장 속성은 객체 생성 시점에 초기화됩니다. 따라서 DataLoader 인스턴스가 immediateValue가 즉시 초기화되고, "저장 속성 초기화 중..." 메시지가 출력됩니다.
2. DataLoader 객체가 생성되었습니다.
- 생성자(init)가 호출되면서 "DataLoader 객체가 생성되었습니다." 메시지가 출력됩니다.
3. 저장 속성에 접근합니다.
- 저장 속성에 접근할 때는 이미 초기화된 상태이므로 "저장 속성 초기화 중..." 메시지는 출력되지 않고, "저장된 데이터"가 출력됩니다.
4. 지연 저장 속성에 접근합니다.
- lazyValue에 처음 접근할 때, 지연 저장 속성이 초기화됩니다. 이때 "지연 저장 속성 초기화 중..." 메시지가 출력되며, "지연된 데이터"가 출력됩니다.
5. 지연 저장 속성에 다시 접근합니다.
- 지연 저장 속성에 두 번째로 접근할 때는 이미 초기화된 상태이므로, 초기화 메시지는 출력되지 않고, "지연된 데이터"만 출력됩니다.
잘못된 내용 혹은 오타가 있거나 더 좋은 내용 피드백은 언제나 환영입니다 :)