lateinit var

The type of the property or variable 는 반드시 non-nullable 이어야 한다.

primitive type은 lateinit var로 지정할 수 없다.

초기화 하기 전에 lateinit var에 접근하면 exception이 발생한다. .isInitialized 를 이용해서 값이 초기화 되었는지 확인할 수 있다.

data class Foo(val name: String)

lateinit var some: Foo

fun main() {
    println(::some.isInitialized) // false
}

Properties | Kotlin

Property references

property를 first-class object로 접근하기 위해서 :: 연산자를 사용한다.

val x = 1

fun main() {
    println(::x.get()) // 1
    println(::x.name) // x
}

::xKProperty0<Int> type property object로 평가된다.

get() 을 사용해서 객체가 가진 값을 읽을 수 있다.

name property를 이용해서 property name을 얻을 수 있다.

var 객체는 KMutableProperty0<Type> 이고, set() 을 이용해서 값을 설정할 수 있다.

Reflection | Kotlin

왜 lateinit은 nullable과 사용할 수 없을까?

lateinit은 선언 시점에는 초기화 하지 않지만, 사용하는 시점에는 초기화를 해서 어떤 값을 가진다는 의미다. 따라서 값을 가지지 않는다는 의미의 nullable과는 의미상 어울리지 않아서 사용할 수 없다.

Why doesn't Kotlin allow you to use lateinit with primitive types?

왜 lateinit val은 불가능할까?

나중에 초기화 하는 lateinit과 선언과 동시에 초기화한다는 val의 의미가 어울리지 않아서라고 생각한다.