[kotlin] 초기화 지연_lateinit , by lazy

Jini.Dev·2022년 5월 27일
0

kotlin.UninitializedPropertyAccessException: lateinit property adapter has not been initialized

초기화 하지 않은 property에 접근해서 생긴 익셉션이 발생.

해결 방법을 생각하다 초기화지연을하는 두가지 방법들의 특징에대해 정리해보려 한다.


일반적으로 property를 non-null type으로 선언하기 위해선 생성자에서 초기화를 해야한다.
하지만 생성자에서 초기할 수 없거나 null type을 피하고 싶은 경우, 사용 시점에 초기화하고 싶은 경우를 위해 지연초기화(Late initialization, Lazy initialization)를 제공한다.


  1. Late initialization

    • var 앞에 lateinit 키워드를 사용하여 선언
      lateinit은 mutable 변수만 가능하기 때문에 var 키워드를 가진 변수에서만 사용이 가능하다.
      ex) lateinit var name: String
    • non-null type만 가능하고 primitive type은 허용되지 않는다.
    • getter/setter선언이 불가능 하다.
    • 초기화 하지 않고 변수의 값을 호출하면 Exception(⬆️)발생한다.

    lateinit var 초기화 여부 확인

    Kotlin 1.2 이상 부터 property 앞에 :: 키워드를 사용해 .isInitialized를 호출한다.
    초기화 여부에 따라 true/false를 반환한다.
    ex. ::name.isInitialized



  2. Lazy initialization

    • val 에서만 사용 가능하고, by lazy 사용하여 선언
    • Non-null, Nullable, primitive type 모두 사용 가능
      ex) val name: String by lazy { "Jini" }
      첫 번째 호출은 by lazy에 전달된 람다를 실행하고 그 결과값을 저장한다.
      기본적으로 값은 하나의 스레드에서만 계산되고 모든 스레드는 동일한 값을 보게 된다.
      초기화되는 시점이 변수를 호출하는 시점



lateinit은 생성자에선 초기화할 수 없지만 non-null하게 사용하고 싶은 경우 또는 특정 시점에 초기화하며 value를 지속적으로 변경해야 할 경우에 사용하고,
lazy는 특정 시점에 초기화하고 싶은 경우, 최초 접근 시 value를 초기화하며 이후 value의 변경이 필요하지 않은 경우 사용한다.

https://kotlinlang.org/docs/properties.html#late-initialized-properties-and-variables

profile
정신 차려보니 개발자가 되어있었다.

0개의 댓글