본문 바로가기
Java & Kotlin/Kotlin

by lazy를 통해 지연 초기화 적용하기

by devson 2021. 11. 6.

개발을 하다보면 가끔 지연 초기화를 적용해야할 때가 있을 수 있다.

Kotlin을 사용하면 이를 쉽게 처리를 할 수 있다.

 

아래 코드를 보자.

object Answer {
    val value = 42
}

// 수행이 오래 걸리는 기능
fun longJob() {
    println("Job just started")
    Thread.sleep(2_000)
    println("Job has done")
}

fun main() {
    longJob()
    println(Answer.value)
}

여기서 Answer에 value 프로퍼티는 사용되기 전에도 초기화가 되어있다.

 

이 값을 정말 사용되는 때(위 코드에서는 14번째 라인)까지 초기화를 지연시키고 싶다고 했을 때 by lazy 를 통해 쉽게 처리할 수 있다.

object Answer {
//    val value = 42
    val value: Int by lazy {
        println("Computing the answer...")
        42
    }
}

// 수행이 오래 걸리는 기능
fun longJob() {
    println("Job just started")
    Thread.sleep(2_000)
    println("Job has done")
}

fun main() {
    longJob()
    println(Answer.value)
}

 

위 코드를 실행 시킨 후 콘솔을 보면 아래와 같이 longJob 함수가 끝난 후 Answer.value 값을 사용할 때 해당 프로퍼티를 초기화를 하는 것을 확인할 수 있다.

물론 이 다음에 Answer.value를 또 사용한다면 그 때는 초기화가 되어있으니 Computing the answer... 문구가 콘솔에 또 출력되지 않는다.

 

또 lazy를 사용할 떄 mode: LazyThreadSafetyMode 파라미터로 Thread-safe 관련한 설정을 할 수 있다.

(default는 LazyThreadSafetyMode.SYNCHRONIZED 이다)

object Answer {
    val value: Int by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
        println("Computing the answer...")
        42
    }

 

 

또한 by lazy는 클래스 프로퍼티에만 적용가능한 것이 아니라 값을 지정할 수 있는 곳에는 적용이 가능하기 때문에 아래와 같이 코드를 사용할 수도 있다.

// 수행이 오래 걸리는 기능
fun longJob() {
    println("Job just started")
    Thread.sleep(2_000)
    println("Job has done")
}

fun main() {
    val answer: Int by lazy {
        println("Computing the answer...")
        42
    }
    longJob()
    println(answer)
}

댓글