또는 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"
    }
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.