개발을 하다보면 가끔 지연 초기화를 적용해야할 때가 있을 수 있다.
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 |
댓글