본문 바로가기
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)
}

댓글