또는 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"
}