더북(TheBook)

lateinit 표시가 붙은 프로퍼티는 값을 읽으려고 시도할 때 프로그램이 프로퍼티가 초기화됐는지 검사해서 초기화되지 않은 경우 UninitializedPropertyAccessException을 던진다는 한 가지 차이를 제외하면 일반 프로퍼티와 같다. 이 특성은 때로 암시적인 !! 연산자와 비슷하다.

프로퍼티를 lateinit으로 만들기 위해서는 몇 가지 조건을 만족해야 한다. 첫째, 프로퍼티가 코드에서 변경될 수 있는 지점이 여러 곳일 수 있으므로 프로퍼티를 가변 프로퍼티(var)로 정의해야 한다. 둘째, 프로퍼티의 타입은 널이 아닌 타입이어야 하고 IntBoolean 같은 원시 값을 표현하는 타입이 아니어야 한다. 내부에서 lateinit 프로퍼티는 초기화되지 않은 상태를 표현하기 위해 null을 사용하는 널이 될 수 있는 값으로 표현되기 때문이다. 마지막으로, lateinit 프로퍼티를 정의하면서 초기화 식을 지정해 값을 바로 대입할 수 없다. 이런 대입을 허용하면 애초 lateinit을 지정하는 의미가 없기 때문이다.

코틀린 1.2부터 lateinit과 관련한 몇 가지 개선 사항을 도입했다. 특히 이제는 최상위 프로퍼티와 지역 변수에서 늦은 초기화를 사용할 수 있게 됐다.

lateinit var text: String

fun readText() {
  text = readLine()!!
}

fun main() {
  readText()
  println(text)
}

다른 개선으로는 lateinit 프로퍼티의 값을 읽기 전에 lateinit 프로퍼티가 설정됐는지를 알아보는 기능이 있다. 이 방법은 10장 애너테이션과 리플렉션에서 코틀린 리플렉션 API를 다룰 때 살펴본다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.