Kotlin/StoreInfo

<정리> lateinit vs by lazy

re트 2023. 12. 18. 15:13
728x90

늦은 초기화 : 객체 초기화를 늦게 하는 것

클래스 로딩 시간 감소와 미사용 전역변수의 메모리 공간을 줄여주는 효과

 

lateinit(Late Initialization)

  • var로 변수가 선언 되기 때문에 초기화 이후에도 값을 변경 가능
  • Nullable하지 않은 변수(Non-null 변수)를 선언은 하는데 초기화는 미루고 싶을 때 사용하는 문법
  • 초기화 제대로 하지 않아도 컴파일 시에는 에러가 발생하지 않음
  • 변수 선언하고 늦은 초기화를 하지 않은 경우 발생하는 에러 : UninitializedPropertyAccessException
  • Primitive Type(Int, Float, Double, Long...)에서는 사용 불가 → Primitive Type을 전역변수로 사용하려면 by lazy를 쓰거나 초기화를 선언과 동시에 진행해야 함
  • 변수를 초기화를 하는 코드에서부터 인스턴스가 만들어짐
  • 초기화 전에는 변수 접근 불가
  • 초기화가 되었는지는 (::변수명.isInitialized)를 통해서 체크 가능
  • null로 초기화하지 못하는 이유 : null을 변수가 초기화되었는지 그렇지 않은지 판별하기 위한 특별한 기준값으로 사용하기 때문에(타입을 모호하게 만들 위험이 높음)

 

 

by lazy(Lazy Initialization)

  • 호출 할 때 이 변수를 어떻게 초기화 해줄지에 대해 정의할 수 있는 구문
  • val로 선언 되기 때문에 한 번 초기화 이후에는 값 변경 불가
  • 초기화 제대로 하지 않으면 컴파일 에러 발생
  • Non-null, Nullable 변수 모두 사용 가능한 늦은 초기화 문법
  • 변수를 사용하는 코드에서부터 인스턴스가 만들어짐
  • delegate object를 만듬(...???)
  • 호출 할 때 한번 초기화를 진행하고 이후에는 변수를 가져다가 쓰기만 함
  • Synchronized로 동작(Thread-safe)하기 때문에 다중 쓰레드 환경에서의 초기화를 신경쓰지 않아도 됨
반응형

'Kotlin > StoreInfo' 카테고리의 다른 글

Stack 간단 구현  (0) 2024.04.11
<정리> Scope functions  (0) 2023.12.19
<정리> 키오스크 프로그램 구현2  (0) 2023.12.08
<정리> 키오스크 프로그램 구현  (0) 2023.12.06
<정리> 호텔 예약 프로그램 구현  (2) 2023.12.05