일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Swift
- Flutter
- Apple Developer Academy
- WWDC22
- app intents
- cloud functions
- ios
- Coding Test
- coreml
- task.yield()
- watchkit
- Tuist
- tabman
- SwiftUI
- 코테
- UIDatePicker
- spring
- UIStackView
- fcm
- Sendbird
- createml
- Delegate Pattern
- Complication
- swift concurrency
- backend
- Firebase
- widgetkit
- Project
- github
- UITableView
- Today
- Total
azhy의 iOS 이야기
[iOS/Swift] lazy Variable 본문
2022년 8월 19일에 작성됨
iOS는 앱의 사용량, 메모리가 너무 높아지면 앱을 죽이기 때문에 메모리 관리를 항상 신경 쓰며 코드를 짜야합니다.
이러한 메모리 관리에 있어 도움을 주는 많은 친구들 중에 한명이 바로 lazy 키워드입니다.
이미 많은 분들이 lazy에 대해 자세하게 설명을 해놓으셨기에 오늘은 중요한 키포인트 몇 개만 짚어보려 합니다.
lazy variable?
공식문서에는 lazy를 이렇게 정의합니다.
'A lazy stored property is a property whose initial value isn’t calculated until the first time it’s used. You indicate a lazy stored property by writing the lazy modifier before its declaration.'
한 마디로 lazy 변수는 처음 호출되기 전 까지는 초기화 값이 계산이 되지 않습니다. 호출 시에 생성이 되면서 메모리에 올라가고, 후에 다시 사용하면 이전에 생성된 프로퍼티를 이용합니다.
필요는 하지만 사용하기도 전에 불러오기 부담스러운 것들은 lazy를 통해 선언해 주는 것이 좋습니다.
예를 들면 인스타나 유튜브에 있는 짧은 영상들을 클릭하기도 전에 전부 다 가져오게 된다면 쓸데없는 메모리가 앱을 실행할 때마다 생기게 됩니다.
특징
lazy는 반드시 var과 함께 사용해야 합니다.
lazy 프로퍼티는 호출될 때까지 초기화가 되지 않기 때문에 var를 사용해야 합니다.
computed property (getter, setter)와 사용할 수 없습니다.
lazy 프로퍼티는 첫 호출 시 메모리에 값을 올리고, 그 이후에는 생성한 그 값을 사용하기 때문에 사용할 때마다 값을 새로 연산하는 computed property는 lazy로 사용할 수 없습니다.
struct, class
기본적으로 lazy는 struct와 class에서만 사용할 수 있습니다.
not thread safe
lazy property는 자동으로 초기화되지 않아 thread safe 하지 않습니다.
lazy는 항상 쓰는 게 이득인가?
꼭 그렇지는 않습니다. 써야 할 상황이 있다면 쓰는 게 좋겠지만 쓰면 안 되는 상황이 있죠.
그중에서도 제일 큰 문제점은 바로 thread safe 하지 않다는 것입니다.
애플 문서는 이렇게 적어놨습니다. '다중 스레드에서 접근하면 한 번만 초기화되는 것이 보장되지 않는다.'
즉, 단일 스레드에서 lazy var에 접근하는 것을 보장할 수 없는 상황에서는 lazy var를 쓰면 안 됩니다.
정리
객체 생성 시 항상 사용하는 게 아니라 사용하는 경우가 드문 경우 lazy를 사용하는게 좋습니다. 하지만 위에서도 설명했듯 thread safe 하지 않고 쓸 수 없는 상황이 분명 존재하니 써야 할 상황과 쓰지 말아야 할 상황을 잘 판단하는 게 중요할 것 같습니다.
'Swift' 카테고리의 다른 글
Task.yield()는 언제 쓸까? (0) | 2024.11.26 |
---|---|
[iOS/Swift] iOS 15, Navigation Bar 배경 색 설정 (0) | 2024.11.14 |
[iOS/Swift] setContentHuggingPriority, setContentCompressionResistancePriority 개념 (0) | 2024.11.13 |
[iOS/Swift] UIDatePicker 최소, 최대 날짜 설정하기 (0) | 2024.11.12 |
[iOS/Swift] Lottie 를 사용해서 애니메이션을 만드는 법 (2) | 2024.11.12 |