본문 바로가기
안드로이드/Kotlin

[Kotlin] lateinit, by lazy

by jinwo_o 2025. 1. 14.

지연(늦은) 초기화

  • 초기화 작업을 극한으로 미루다가 사용자가 필요로 할 때 진행하는 방법
  • 클래스 안에 '이 변수를 사용할 것이다'라고 선언만 해두고 나중에 변수를 실제로 사용하는 시점에 값을 입력해주어 사용하는 것
  • 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