더북(TheBook)

또는 name에 빈 문자열을 사용하지 못하는 것이 확실하다면 빈 문자열로 초기화되지 않은 참조를 표현할 수도 있다. 어떤 경우든 초기화한 후 절대 값이 바뀌지 않더라도 참조 선언에 var를 사용해야 한다. 그런데 코틀린은 더 나은 해법을 제공한다.

val name: String by lazy { getName() }

이렇게 쓰면 name 참조를 최초로 사용하는 시점에 getName() 함수를 호출한다. 여기서 람다(lambda, 함수 값을 람다라고도 부름) 대신 함수 참조를 쓸 수 있다.

val name: String by lazy(::getName)

name이라는 참조를 최초로 사용한다는 말은 그 참조가 가리키는 값을 사용하려고 최초로 name을 역참조(dereference)한다는 말이다. 다음 예제를 보자.

fun main(args: Array<String>) {
    val name: String by lazy { getName() }
    println("안녕1")
    val name2: String by lazy { name }
    println("안녕2")
    println(name)
    println(name2)
    println(name)
    println(name2)
}

fun getName(): String {
    println("이름 계산 중...")
    return "Frank 현석 Oh"
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.