Weekoding
[Swift] lazy Variable 본문
공부하던 중 lazy 키워드를 발견했다.
Bruno Mars의 'The Lazy Song'이 먼저 생각나는 걸 보니 아직 많이 부족한가보다^^
농담은 그만하고 바로 알아보도록 하자!
📂 ' lazy '
: 게으른, 여유로운
: "A lazy stored property is a property whose initial value is not calculated until the first time it is used"
→ 처음 호출되기 전 까지는 초기화 값이 계산되지 않는 프로퍼티. -Swift Programming Guide
호출 시에 생성이 되면서 메모리에 올라가고, 이후 같은 변수 사용 시엔 이전에 생성된 프로퍼티를 이용한다.
이름 값 하는 키워드이다!
lazy 키워드를 갖는 프로퍼티가 어떤 상황에 필요한 지 구분해보자니,
TableView와 CollectionView에서 쓰이는 dequeueResuableCell이 생각났다.
보이지 않을 Cell을 전부 메모리에 로드하는 것은 메모리 측면에서 비효율적이다.
같은 맥락으로 초기화 값이 당장 필요 없다면 'lazy' 키워드를 사용하는게 메모리 관리 측면에서 좋겠다.
또한, 외부에 초기값이 의존되어 있다면, lazy를 통해 호출하여 시점을 분리해 오류를 최소화 할 때도 사용될 것이다.
📌 'lazy'가 필요한 순간!
1. 초기 값이 복잡할 때, 메모리 관리가 필요할 때
2. 초기화 시점의 분리가 필요할 때
⌘ 이처럼 적재적소에 사용하면 안정성과 성능을 챙길 수 있다.
또한 UIkit코드 작성 시, UI Component를 만들 때도 많이 사용한다.
//lazy property
lazy var dateLabel: UILabel = {
let label = UILabel()
label.text = "May 1st Sunday"
label.font = .systemFont(ofSize: 14.0, weight: .semibold)
label.textColor = .secondaryLabel
return label
}()
위 코드를 보면 알 수 있듯, lazy property에는 clousure를 사용하여 값을 넣어준다.
또한, 클로저 뒤 '( )'를 통해 즉시 실행 결과를 돌려주고 끝내버리기 때문에, 메모리 누수로부터 안전하다.
→ lazy의 클로저 내부에 self를 사용할 수 있다.(순환 참조를 발생시키지 않기 때문)
📂 'lazy' Rules
lazy가 그렇다고 천하무적일까? lazy를 사용하는 데 몇가지 규칙이 있다.
1. Variable
'lazy'는 반드시 'var'과 함께 사용된다. 사실상 'lazy var'인 셈.
let property는 초기화가 끝나기 전까지 반드시 값을 가져야 한다.
그러나 lazy property는 호출될 때 까지 초기화 되지 않으므로 무조건 var이다.
2. Stored Property
computed property와 사용할 수 없다.
lazy property는 첫 호출 시 메모리에 값을 올리고, 그 이후는 계속하여 그 값을 사용한다.
computed property는 사용할 때마다 값을 연산하기 때문에 lazy로 사용할 수 없다.
3. class, stuct
오직 class와 struct의 member property로만 사용할 수 있다.
4. not thread-safe
1번에 적혀있듯 lazy property는 자동으로 초기화되지 않아 thread-safe하지 않다.
📌 마치며
아이러니하다! 초기화 작업을 최대한 지연시켜 성능향상을 시키는 property라니..
'급할 수록 천천히' 라는 격언과도 맞아 떨어지는 녀석이다.
장점도 장점이지만 조건도 많아 사용하려면 더 많은 코드를 접해야 할 것 같다.
항상 기억해 두었다가 적절한 때가 오면 사용해야지.
오류 및 지적사항은 댓글로 남겨주시면 감사하겠습니다!
참고 :
'공부 노트(Swift)' 카테고리의 다른 글
[Swift] 생명주기 정리( App / ViewController ) (0) | 2022.05.22 |
---|---|
[Swift] ViewController간 데이터 주고받기 - Delegate pattern (4) | 2022.05.12 |
[Swift] UIKit코드로 SwiftUI Preview 사용해 보기 (0) | 2022.05.03 |
[Swift] Snapkit 맛보기(코드 UI, layoutIfNeeded) (0) | 2022.04.27 |
[Swift] Snapkit Setting(+ UIWindow, Xcode 13.0 (iOS 15)) (0) | 2022.04.27 |