개발을 하다보면 가끔 지연 초기화를 적용해야할 때가 있을 수 있다.
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)
}
'Java & Kotlin > Kotlin' 카테고리의 다른 글
[MockK] 인자 값 그대로 리턴하기 (0) | 2022.04.14 |
---|---|
observable, vetoable를 통한 프로퍼티 변경 감지 (0) | 2021.11.06 |
by 키워드를 사용한 Delegation (0) | 2021.11.06 |
Kotlin Gradle Multi Module 적용하기 (0) | 2021.11.04 |
JUnit5 테스트 시 @BeforeEach, @AfterEach가 실행되지 않을 때 (0) | 2021.01.10 |
댓글