728x90
Kotlin에서는 지연 초기화 방법이 두 가지가 있습니다. 언제 써야할지 헷갈리는 두 가지의 차이점에 대해 정리해봤습니다.
필요성
지연 초기화는 NullSafe를 중시하는 코틀린에서 중요한 개념입니다. 변수를 Nullable로 설정하여 Null 값을 저장할 수 있지만, Nullable을 자주 사용하는 것은 권고하지 않습니다(그리고 변수를 사용할 때마다 Nullable 타입을 작성해주어야해서 코드가 더러워집니다.).
그래서 최대한 Nullable 타입을 만들지 않고 변수를 사용해야 하는 타이밍에 초기화하기 위해 지연 초기화 방법이 고안되었습니다.
lateinit
> Computation 시기
- 별도의 context나 초기화 작업이 있을 때 -> 이게 없으면
UninitializedPropertyAccessException
발생 - 장점: 실제 접근될 때 별도의 computation time이 필요하지 않습니다.
=> 주로 context가 필요한 초기화나 생성자 밖 프로퍼티를 생성자 안에서 초기화하고 싶을 때 사용합니다.
> Error detection time - Runtime
> Non Thread-safe
- 동시 접근이 이루어지기 전에 개발자가 적절히 초기화하여 실행해야 합니다.
> 특징
- Nullable을 허용하지 않습니다.
- DI 프레임워크와 함께 사용하는 경우가 많습니다.
lateinit
프로퍼티의 값을 DI 프레임워크가 외부에서 설정하여 사용합니다.
- custom getter/setter 설정이 불가능합니다.
lazy Delegate
> Computation 시기
- 변수가 실제 접근되어질 때 → 변수에 접근하지 않으면 초기화가 아예 안된 채로 계속 있습니다.
- 장점: 실제로 접근되지 않은 변수에 대해서 초기화하지 않거나 null로 둘 수 있습니다.
> Error detection time - Compile time
> Thread-safe
- Builtin synchronization 매커니즘을 사용합니다. 그래서 멀티스레드 환경에서도 동시 접근하더라도 초기화가 완료되고 난 후에 스레드들이 접근하여 Thread-safe 합니다.
> 특징
- Nullable을 허용합니다.
- custom getter/setter 설정이 가능합니다.
728x90
'Android(Kotlin)' 카테고리의 다른 글
[Kotlin Android] Scope Function (0) | 2024.03.26 |
---|---|
[Kotlin Android] View 객체 가져오기(3) - DataBinding(구현) (0) | 2024.03.12 |
[Kotlin Android] View 객체 가져오기(3) - DataBinding (0) | 2024.03.12 |
[Kotlin] Sealed Class (0) | 2024.02.23 |
[Kotlin Android] View 객체 가져오기(2) - ViewBinding (0) | 2022.08.13 |