본문 바로가기
Kotlin 자료

[Kotlin] 늦 초기화란?

by SUN5066 2020. 12. 21.
반응형

지연 초기화(lateinit var) 만이 초기화를 지연시킬 수 있는 유일한 방법은 아님.

변수나 속성이 최초 사용될 때까지 초기화를 연기할 수도 있다. 이것을 늦 초기화(lazy initialization)라고 하며, 코드를 더 효율적으로 만들어 준다.

속성이 초기화될 때 다수의 객체를 초기화해야 하거나, 또는 파일을 읽는 것과 같은 여러 가지 작업이 수반될 수 있는 경우 우리 클래스에서 속성을 즉시로 사용할 필요가 없다면 늦 초기화가 좋은 선택이 될 수 있다.

위임(delegation) 메커니즘

코틀린에서 늦 초기화는 위임(delegation)이라는 메커니즘을 사용해서 구현함.

대리자(delegate)

위임한다는 것을 나타낼 때 코틀린에서는 by 키워드를 사용하며 by 다음에는 위임받은 일을 처리하는 대리자(delegate)를 지정한다. 예를 들어, 특정 함수를 대리자로 지정하면 이 함수가 위임 받은 일을 처리한다는 뜻이다. 대리자로는 우리 함수 또는 코틀린 표쥰 라이브러리의 함수를 사용 할 수 있다.

대리자 사용법

속성의 늦 초기화를 위임하여 처리할 때는 코틀린 표준 라이브러리의 lazy 함수를 대리자로 사용함.

이 함수는 람다를 인자로 받아 실행히켜 준다. 따라서 우리 속성이 초기화될 때 실행하고자 하는 코드를 람다에 정의하면 된다.

class Player(_name: String, var age: Int = 18, val isHuman: Boolean) {
    var name = _name
    val homtown by lazy { selectHomeTown() }
    
    private fun selectHometown() = File("towns.txt")
    		.readText()
            .split("\r\n") // 맥 OS나 리눅스에서는 .spllit("\n")
            .shuffled()
            .first()
}

 

lazy 함수에서는 selectHometown이 실행되어 반환되는 값을 hometown 속성에 초기화한다.

그러나 hometown 속성은 바로 초기화 되지 않으며, 다른 코드에서 최초 사용될 때 비로소 lazy 함수의 람다가 실행되어 초기화된다.

여기서는 name 속성의 게터에서 최초로 hometown 속성이 사용될 때 lazy 함수의 람다가 한 번만 실행된다. 그리고 이후에는 캐시에 저장된 결과가 사용된다. 이것이 늦 초기화 속성의 장점이다.

반응형

댓글