티스토리 뷰

728x90

Kotlin은 NPE(NullPointerException)를 사전에 방지하기 위해 모든 프로퍼티(Property)를 반드시 초기화를 해야 합니다. 이런 코틀린에서는 성능향상 및 메모리 사용 공간을 줄이기 위해 변수선언을 먼저 하고 초기화를 뒤로 미루는 지연 초기화(지연 인스턴스화)를 지원합니다.

1. lateinit (지연 초기화)

lateinit은 지연 초기화로 kotlin에서 변수를 선언할 때 반드시 초기화를 해주어야 하지만 해당 변수가 언제 초기화될지 알 수 없지만 반드시 초기화가 되고 이후에 사용된다는 것이 보장될 경우 lateinit을 사용합니다.

lateinit 지연 초기화는 나중에 값을 할당하여 초기화를 수행하므로 var를 사용하여 변수를 선언합니다.

  • var로 선언된 프로퍼티에만 사용이 가능합니다.
  • Non-null 프로퍼티에서만 사용이 가능합니다.
  • 객체가 보이는 어느 곳에서든 초기화가 가능합니다.
  • 초기화 전까지 접근이 불가능하며, 접근 시 Exception을 발생합니다.
  • Kotlin Primitive Type(Int, Double, Float, Boolean,...)에서는 사용이 불가능합니다.
  • getter, setter를 만들 수 없습니다.
  • 초기화되면 해당 속성. isInitialized를 true를 반환합니다.

lateinit이 초기화 확인 여부는 var 변수 이름 앞에 ::(콜론 2개)를 붙이고. isInitialized를 사용하면 됩니다.

// 초기화 확인 여부 //
fun main() {
    lateinit var str: String    
    
    if (::str.isInitialized) {
        str = "새로운 값으로 할당"
    } else {
        str = "초기값"
    }
}

 

2. by lazy (초기화 미루기 or 사용시점에 초기화)

by lazy는 lateinit과 달리 val 변수를 사용해야 합니다.

val 변수이므로 값을 변경할 수 없고, 초기화 시점은 변수가 최초로 사용되는 시점에 초기화합니다.

  • 변수를 접근 시점에 by lazy {... }의 함수 리터럴을 통해 초기화를 합니다.
  • val에서만 사용이 가능하며 당연히 값을 변경할 수 없습니다.
  • by lazy는 람다식으로 구성되어 반환식을 가지는 함수입니다.
  • 람다식(Lambda)으로 구성되어 변수를 처음 사용할 때 단 한번 호출되며 마지막 값이 초기값으로 할당됩니다.
// 람다함수로 초기화가 진행되므로 함수안에 여러개의 구문이 등러갈수 있으며 
// 맨 마지막 구문의 결과가 변수에 할당됩니다.
fun main() {
    val num : Int by lazy {
        println("초기화")
        10
    }
    
    println(num)	// 처음 호출시 초기화
    println(num)	// 이미 초기화되므로 다시 초기화 하지 않음
}

/* 출력 결과
* 초기화
* 10
* 10
*/
728x90
250x250
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Total
Today
Yesterday