lateinit 및 lazy()
16 Apr 2019 | Kotlinlateinit
lateinit는 다음과 같은 특징이 있습니다.
- var변수에만 사용 가능
- Non-null데이터 타입에만 가능
- primitive type에는 사용할 수 없음
- 클래스 생성자에서 사용 못함
- 로컬 변수로 사용 못함
그럼, 어떤 경우에 사용해야 할까요? 코틀린은 NULL 체크에 대한 검사가 엄격하기 때문에
class Sample {
    private var name: String
}
와 같은 코드는 Property must be initialized or be abstract 오류가 발생합니다.
실제로 초기화 때 값을 지정해주고 코드를 작성하는 것이 더욱 좋지만, 그렇지 못한 경우가 많이 발생합니다. 그럴 때는 아래와 같이 lateinit 키워드를 변수 앞에 적어주면 변수 초기화를 나중에 할 수 있게 됩니다.
class Sample {
    private lateinit var name: String
}
lazy
lazy() 함수는 lateinint와 비슷한 역할을 하는데 다음과 같은 특징이 있습니다.
- val변수에만 사용 가능
- primitive type에도 사용 가능
- Non-null,- Nullable둘 다 사용 가능
- 클래스 생성자에서 사용 못함
- 로컬 변수로 사용 가능
private val lazyExample: String by lazy {
    println("lazyExample - init()")
    "[lazy] lazyExample is initialized."
}
fun test() {
    println("Start...")
    println("1st : $lazyExample")
    println("2nd : $lazyExample")
    println("3rd : $lazyExample")
}
실행 결과는 다음과 같습니다.
Start... lazyExample - init() 1st : [lazy] lazyExample is initialized. 2nd : [lazy] lazyExample is initialized. 3rd : [lazy] lazyExample is initialized.
위 결과와 같이, 처음 호출될 시점에 초기화를 한 번 하며 그 이후로는 그 결과값만 사용하는 것을 확인할 수 있습니다.
