Kotlin lateinit 변수란?
선언된 이후에 나중에 초기화되는 변수를 '지연 초기화 변수(late-initialized variable)'라고 부릅니다. 일반적인 프로그래밍 언어에서는 널이 아닌(non-null) 타입의 변수를 생성자에서 반드시 초기화해야 하지만, 개발자가 실수로 널 검사를 누락하면 프로그램 오류로 이어질 수 있습니다. 이러한 문제를 방지하기 위해 Kotlin은 lateinit이라는 수정자(modifier)를 도입했으며, 해당 변수가 초기화되었는지 확인할 수 있는 방법도 함께 제공합니다.
lateinit 사용 조건
lateinit 변수를 선언하려면 변수 앞에 lateinit 키워드만 붙이면 됩니다. 다만 Kotlin에서 lateinit을 사용하려면 다음 조건들을 충족해야 합니다.
- 가변 변수(mutable variable)에만 사용 가능 — lateinit은 반드시
var키워드와 함께 사용해야 합니다. - 널이 아닌(non-nullable) 타입에만 허용 — nullable 타입에는 적용할 수 없습니다.
- 기본형(primitive) 데이터 타입에는 동작하지 않음 — Int, Boolean 등의 기본형에는 사용할 수 없습니다.
- getter와 setter가 없는 프로퍼티여야 함 — 커스텀 getter나 setter가 정의된 프로퍼티에는 적용할 수 없습니다.
예제: isInitialized로 초기화 여부 확인하기
아래 예제에서는 변수를 lateinit으로 선언하고, Kotlin 라이브러리에서 제공하는 this::name.isInitialized 구문을 사용해 변수가 초기화되었는지 확인합니다.
class Tutorial {
lateinit var name : String
fun checkLateInit(){
println(this::name.isInitialized)
// 값이 아직 초기화되지 않았으므로 false 출력
// name 초기화
name = "www.tutorialspoint.com/"
println(this::name.isInitialized)
// true 반환
}
}
fun main() {
var obj = Tutorial()
obj.checkLateInit()
}
실행 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
false true
첫 번째 출력에서는 name 변수가 아직 초기화되지 않았기 때문에 false가 반환됩니다. 반면 두 번째 출력에서는 변수가 이미 초기화된 상태이므로 true가 반환됩니다.
이처럼 isInitialized를 활용하면 lateinit 변수에 접근하기 전에 초기화 상태를 미리 검사할 수 있어, 초기화되지 않은 변수에 접근할 때 발생하는 UninitializedPropertyAccessException과 같은 런타임 예외를 효과적으로 예방할 수 있습니다.