들어가기 전에
이번에는 또 다른 지연 초기화의 기법인 By lazy입니다. 늦은 초기화라고도 할 수 있습니다. lateinit과 무엇이 다른지 알아봅시다.
핵심 키워드
- By lazy
학습하기
들어가기 전에
이번에는 또 다른 지연 초기화의 기법인 By lazy입니다. 늦은 초기화라고도 할 수 있습니다. lateinit과 무엇이 다른지 알아봅시다.
핵심 키워드
학습하기
lateinit을 통해서 프로퍼티나 객체를 선언할 때는 val은 허용하지 않고 var로 선언해야 했습니다. 하지만 var로 선언되면 객체나 프로퍼티의 경우 언제든 값이 변경될 수 있는 단점이 있습니다. 그렇다면 읽기 전용의 val로 선언한 객체나 프로퍼티를 나중에 초기화하려면 어떻게 할까요? 바로 lazy를 적용하면 됩니다.
lazy의 특징
class LazyTest {
init {
println("init block") // ②
}
val subject by lazy {
println("lazy initialized") // ⑥
"Kotlin Programming" // ⑦ lazy 반환값
}
fun flow() {
println("not initialized") // ④
println("subject one: $subject") // ⑤ 최초 초기화 시점!
println("subject two: $subject") // ⑧ 이미 초기화된 값 사용
}
}
여기서 최초 초기화 시점은 flow()를 사용하는 (5)번과정에서 프로퍼티인 subject를 접근하는 시점입니다. 프로퍼티 뿐만아니라 객체에도 사용할 수 있습니다.
class Person(val name: String, val age: Int)
fun main() {
var isPersonInstantiated: Boolean = false // ① 초기화 확인 용도
val person : Person by lazy { // ② lazy를 사용한 person 객체의 지연 초기화
isPersonInstantiated = true
Person("Kim", 23) // ③ 이 부분이 Lazy 객체로 반환 됨
}
val personDelegate = lazy { Person("Hong", 40) } // ④ 위임 변수를 사용한 초기화
println("person Init: $isPersonInstantiated")
println("personDelegate Init: ${personDelegate.isInitialized()}")
println("person.name = ${person.name}") // ⑤ 이 시점에서 초기화
println("personDelegate.value.name = ${personDelegate.value.name}") // ⑥ 이 시점에서 초기화
println("person Init: $isPersonInstantiated")
println("personDelegate Init: ${personDelegate.isInitialized()}")
}
http://www.yes24.com
comment