초기화 하지 않은 property에 접근해서 생긴 익셉션이 발생.
해결 방법을 생각하다 초기화지연을하는 두가지 방법들의 특징에대해 정리해보려 한다.
일반적으로 property를 non-null type으로 선언하기 위해선 생성자에서 초기화를 해야한다.
하지만 생성자에서 초기할 수 없거나 null type을 피하고 싶은 경우, 사용 시점에 초기화하고 싶은 경우를 위해 지연초기화(Late initialization, Lazy initialization)를 제공한다.
Late initialization
Kotlin 1.2 이상 부터 property 앞에 :: 키워드를 사용해 .isInitialized를 호출한다.
초기화 여부에 따라 true/false를 반환한다.
ex. ::name.isInitialized
Lazy initialization
lateinit은 생성자에선 초기화할 수 없지만 non-null하게 사용하고 싶은 경우 또는 특정 시점에 초기화하며 value를 지속적으로 변경해야 할 경우에 사용하고,
lazy는 특정 시점에 초기화하고 싶은 경우, 최초 접근 시 value를 초기화하며 이후 value의 변경이 필요하지 않은 경우 사용한다.
https://kotlinlang.org/docs/properties.html#late-initialized-properties-and-variables