더북(TheBook)

4.3.2 늦은 초기화

클래스를 인스턴스화할 때 프로퍼티를 초기화해야 한다는 요구 사항이 불필요하게 엄격할 때가 있다. 어떤 프로퍼티는 클래스 인스턴스가 생성된 뒤에, 그러나 해당 프로퍼티가 사용되는 시점보다는 이전에 초기화돼야 할 수도 있다. 예를 들어 단위 테스트를 준비하는 코드나 의존 관계 주입에 의해 대입돼야 하는 프로퍼티가 이런 종류에 속한다. 이런 경우 생성자에서는 초기화되지 않은 상태라는 사실을 의미하는 디폴트 값을 대입하고( null) 실제 값을 필요할 때 대입할 수도 있다. 예를 들어 다음 코드를 생각해보자.

import java.io.File

class Content {
  var text: String? = null
  
  fun loadFile(file: File) {
    text = file.readText()
  }
}

fun getContentSize(content: Content) = content.text?.length ?: 0

여기서 loadFile()은 다른 곳에서 호출되며 어떤 파일의 내용을 모두 문자열로 읽어온다고 가정하자. 이 예제의 단점은 실제 값이 항상 사용 전에 초기화되므로 절대 널이 될 수 없는 값이라는 사실을 알고 있음에도 불구하고 늘 널 가능성을 처리해야 한다는 점이다. 코틀린은 이런 패턴을 지원하는 lateinit 키워드를 제공한다. 앞의 예제에 lateinit을 적용해보자.

import java.io.File

class Content {
  lateinit var text: String
  
  fun loadFile(file: File) {
    text = file.readText()
  }
}

fun getContentSize(content: Content) = content.text.length
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.