지연(늦은) 초기화
- 초기화 작업을 극한으로 미루다가 사용자가 필요로 할 때 진행하는 방법
- 클래스 안에 '이 변수를 사용할 것이다'라고 선언만 해두고 나중에 변수를 실제로 사용하는 시점에 값을 입력해주어 사용하는 것
- null 로 초기화할 수 없고, 객체의 정확한 값을 뒤에 가서야 알 수 있는 경우에 사용한다.
lateinit
- var 로 선언된 프로퍼티만 사용 가능하다.
- Non-null 타입만 사용 가능하다.
- 지연 초기화를 위해 사용되는 lateinit 프로퍼티에는 null 값이 할당될 수 없다.
- 프로퍼티에 대한 사용자 정의 getter, setter 를 사용할 수 없다.
- 클래스 생성자에서 사용이 불가능하다.
- 생성자에서는 프로퍼티가 즉시 초기화되어야 한다.
- 초기화 전에는 변수 접근이 불가능하다.
- 원시 타입은 사용이 불가능하다.
- 원시 타입은 null 값을 가질 수 없고, 기본값이 반드시 있어야 한다.
- 지역 변수에서 사용이 불가능하다.
- 초기화하기 전까지 변수에 null 이 들어간다.
- null 일 경우 Exception 을 발생시켜 컴파일 단계에서 개발자가 초기화되지 않았음을 인지할 수 있도록 한다.
lazy
- val 에서만 사용이 가능하다. 이에 따라 값을 다시 변경할 수 없다.
- 호출 시점에 by lazy { ... } 에 정의해둔 블록 부분의 초기화를 진행한다.
- 클래스 생성자에서 사용이 불가능하다.
- 원시 타입도 사용이 가능하다.
- 지역 변수에서도 사용이 가능하다.
- 동기화와 관련해 여러 모드가 제공된다
- SYNCHRONIZED : 락을 사용해 단일 스레드만 사용하는 것을 보장한다. (DEFAULT)
- PUBLICATION : 여러 군데에서 호출될 수 있으나, 처음 초기화된 반환 값만을 사용한다.
- NONE : 락을 사용하지 않기 때문에 빠르나, 다중 스레드가 접근하여 값의 일관성을 보장하기 힘들다.
지연 초기화 (Lazy Initialization) | Kotlin Study
지연 초기화에 대해 알아보도록 하자!
velog.io
lateinit과 by lazy의 차이가 무엇인가요?
1. 요약 2. 늦은 초기화란? 3. lateinit 4. by lazy 5. 정리 6. 추가로 나올 수 있는 질문 6-1. lateinit을 초기화하기 전 까지는 변수에 무슨 값이 들어있을까요? 6-2. 초기화를 하지 않고 실행하면 어떻게 될
todaycode.tistory.com
'안드로이드 > Kotlin' 카테고리의 다른 글
[Kotlin] Enum class, Sealed class (0) | 2024.12.10 |
---|---|
[Kotlin] 객체 선언(Object Declaration) , 동반 객체(Companion Object) (0) | 2024.12.09 |
[Kotlin] 범위 지정 함수(Scope function) (0) | 2024.12.09 |