lateinit과 lazy는 Kotlin에서 변수를 지연 초기화하는 두 가지 방법이다. 하지만 사용 목적과 동작 방식에서 차이가 있다.
lateinit:
- lateinit은 var 프로퍼티에만 사용할 수 있다.
- 초기화를 나중에 할 수 있도록 지연시키는 기능을 제공한다.
- 변수를 선언할 때 초기값을 주지 않고, 나중에 해당 변수를 직접 초기화해야 한다.
- lateinit으로 선언된 변수는 nullable하지 않으며, non-null 타입으로 선언되어야 한다.
- lateinit 변수는 반드시 초기화되어야 하며, 그렇지 않으면 UninitializedPropertyAccessException 예외가 발생한다.
lateinit var name: String
fun initializeName() {
name = "John"
}
lazy:
- lazy는 val 프로퍼티에 사용할 수 있다.
- 처음 접근될 때 한 번만 계산되고 그 값을 캐싱하여 재사용한다.
- 값이 필요한 시점까지 계산을 지연시켜 비용이 많이 드는 작업 또는 리소스 접근 등에 유용하다.
- 스레드 안전성을 보장하기 위해 기본적으로 lazy 함수는 SynchronizedLazyImpl을 사용하여 스레드 안전성을 보장한다. 다른 스레드에서 동시에 접근하더라도 첫 번째 호출 시 한 번의 계산만 이루어진다.
val name: String by lazy {
"John"
}
따라서, lateinit은 변수의 직접적인 초기화를 미루고 나중에 할당하는 것이며, lazy는 값의 처음 접근 시점까지 계산 및 캐싱하여 지연 로딩하는 것이다. 선택은 사용하고자 하는 상황과 목적에 따라 달라질 수 있다.