Kotlin에서 변수 초기화를 관리하는 방법에는 lateinit
과 lazy
가 있습니다.
이 두 가지 기능은 각각 다른 상황에서 유용하게 사용됩니다.
lateinit
lateinit
은 변수를 나중에 초기화할 수 있도록 해주는 기능입니다.
초기화는 변수 선언과는 별도로 나중에 이루어집니다.
용도
- 객체를 나중에 초기화해야 할 필요가 있을 때 사용합니다.
- 예를 들어, Android에서는 뷰 객체를 나중에 초기화할 때 자주 사용됩니다.
적용 대상
var
변수에만 적용할 수 있습니다.- 기본 데이터 타입(
Int
,Double
등)에는 사용할 수 없으며, 참조 타입(객체)에서만 사용 가능합니다.
특징
lateinit
으로 선언된 변수는 초기화 전에는 접근할 수 없으며, 초기화하지 않고 접근하면 런타임시 오류가 발생합니다.
예시
class MyClass {
lateinit var myString: String
fun initialize() {
myString = "Hello, Kotlin!"
}
}
fun main() {
val myClass = MyClass()
// 초기화 전에 myString에 접근하면 예외가 발생합니다.
myClass.initialize() // 이 시점에 myString이 초기화됩니다.
println(myClass.myString) // 이제 초기화된 값을 출력합니다.
}
lazy
lazy
는 변수를 최초 접근 시점에만 초기화하도록 해주는 기능입니다. 한 번 초기화된 변수는 이후에 저장된 값을 재사용합니다.
용도
- 변수의 초기화가 비용이 많이 들 때, 또는 그 값이 실제로 필요할 때만 초기화하고 싶을 때 사용합니다.
- 예를 들어, 복잡한 계산이나 네트워크 요청의 결과를 저장할 때 유용합니다.
적용 대상
val
변수에만 적용할 수 있습니다.- 초기화는 변수 최초 접근 시점에만 발생합니다.
특징
lazy
는 기본적으로 스레드 안전(thread-safe)하게 초기화됩니다. 필요에 따라 다른 스레드 안전 모드를 설정할 수 있습니다.- 초기화 과정은 첫 번째 접근 시점에만 실행되며, 이후에는 저장된 값이 재사용됩니다.
예시
val myLazyString: String by lazy {
println("Initializing myLazyString")
"Hello, Kotlin!"
}
fun printValue() {
println(myLazyString) // Initializing myLazyString"이 출력된 후, "Hello, Kotlin!"이 출력
println(myLazyString) // 이미 초기화된 값 "Hello, Kotlin!"만 출력
}
fun main() {
printValue()
}
정리
lateinit
: 객체를 나중에 초기화하고 싶을 때 사용합니다. 초기화 전에는 접근할 수 없으며, 초기화하지 않고 접근하면 예외가 발생합니다. var
변수에만 적용 가능하며, 기본 데이터 타입에는 사용할 수 없습니다.
lazy
: 변수를 처음 접근할 때만 초기화하고, 이후에는 초기화된 값을 재사용합니다. val
변수에만 적용 가능하며, 초기화 과정은 첫 접근 시점에만 실행됩니다. 스레드 안전(thread-safe)하게 초기화됩니다.