728x90
Kotlin에서 늦은 초기화 기법
클래스에서 "변수를 나중에 사용할 것이다." 라고 명시만 해놓고, 실제로 사용할 시점에 값을 할당하여 사용하는 것을 말한다.
하지만 코틀린에서는 값을 할당해주지 않는다면 변수를 사용하지 못한다.
그래서 Kotlin에서는 nullable를 허용하는데, (null에 대해서는 나중에 또 공부해보자.)
예시로 아래와 같은 코드를 들 수 있다.
var str : String? = null
하지만 null은 분명히 위험하다. 또한 예외처리에 있어서 nullable를 허용하지 않는 것이 안전한다.
그렇다면 내가 사용하고 싶을 시점에 사용하는 방법을 어떤식으로 처리를 할까? 그것이 바로 객체 초기화를 늦게 하는 것이다.
lateinit
lateinit var myString: String
fun initializeString() {
myString = "Hello, World!"
}
fun printString() {
if (::myString.isInitialized) {
println(myString)
} else {
println("String is not initialized yet")
}
}
lateinit은 변수의 초기화를 나중으로 미루고 싶을 떄 사용하며, 위 예시 코드 처럼 사용하는 것이 일반적이다.
특징
- null을 허용하지 않는 비 - 기본형(non-primitive) 타입에만 사용할 수 있다.
- 초기화 전에 접근 시 UninitializedPropertyAccessException이 발생한다.
- 초기화 상태를 확인하기 위해 ::property.isInitialized를 사용할 수 있다.
by lazy
val myString: String by lazy {
println("Initializing myString")
"Hello, World!"
}
fun printString() {
println(myString)
}
lazy는 변수를 첫번째로 사용할 때 초기화하는 방법이다. val과 함께 사용되며, 초괴화 람다 표현식으로 전달한다.
특징
- 변수가 처음으로 접근될 때 초기화된다.
- 기본적으로 스레드 안전하다. (LazyThreadSafetyMode.SYNCHRONIZED).
- 초기화 로직이 단 한 번만 실행된다.
이 둘의 차이는?
- 사용 대상:
- lateinit은 var와 함께 사용되고, lazy는 val과 함께 사용된다.
- 초기화 시점:
- lateinit은 변수를 선언한 후, 나중에 명시적으로 초기화해야 한다.
- lazy는 변수가 처음으로 접근될 때 자동으로 초기화된다.
- 타입 제한:
- lateinit은 기본형(primitive) 타입에 사용할 수 없다.
- lazy는 모든 타입에 사용할 수 있다.
- 초기화 상태 확인:
- lateinit은 ::property.isInitialized로 초기화 여부를 확인할 수 있다.
- lazy는 초기화 여부를 확인하는 방법을 제공하지 않는다. 초기화는 첫 접근 시 자동으로 이루어 진다.
결론
- lateinit은 초기화를 나중에 하고 싶지만, 초기화 시점이 명확해야 할 때 유용하다.
- lazy는 변수가 처음 필요할 때 초기화하고, 이를 통해 불필요한 초기화를 피하고 싶을 때 유용하다.
참고
728x90
'Programming Language > Kotlin' 카테고리의 다른 글
[Kotlin] BigDecimal 이란 (0) | 2024.05.31 |
---|---|
[Kotlin] const val에 대해서 공부하자 (0) | 2024.05.28 |
[Kotlin] Flow Retry 연산자 (0) | 2024.03.03 |
[Kotlin] Dispatchers in Kotlin Coroutines (0) | 2024.03.02 |
[Kotlin] Flow zip 연산자로 long- running tasks in parallel 처리하기 (0) | 2024.03.02 |