fun main()
{
val kildong = Person()
kildong.test()
kildong.name = "Kildong" //이 시점에서 초기화됨(지연 초기화)
kildong.test()
println("name = ${kildong.name}")
}
class Person
{
lateinit var name : String //늦은 초기화를 위한 선언
fun test()
{
if(!::name.isInitialized) //프로퍼티의 초기화 여부 판단
{
println("not initialized")
} else
{
println("initialized")
}
}
}
lazy 1
class LazyTest
{
init
{
println("init block")
}
private val subject by lazy { //private로 권장하는 이유는 외부에서 사용하지 않았기 때문이다.
println("lazy initialized")
"Kotlin Programming" //lazy 반환값 (람다식)
}
fun flow()
{
println("not initialized")
println("subject one : ${subject}") // 최초 초기화 시점!
println("subject two : ${subject}") //이미 초기화된 값 사용, 위 subject 블록이 구동하지 않음.
}
}
fun main()
{
val test = LazyTest()
test.flow()
}
lazy 2
class Person(val name : String, val age : Int)
fun main()
{
var isPersonInstantiated : Boolean = false //초기화 확인 용도
val person : Person by lazy { //lazy 사용한 person객체의 지연 초기화
isPersonInstantiated = true // 이 구문으로 진입하면 true로 넣음, 인스턴스 생성되었는지 확인용
Person("Kim", 23) //lazy 객체로 반환됨
}
// 사용 방식이만 틀린거 뿐이고, lazy방식으로 정의 됨. 위임방식 알아보기!!
val personDelegate = lazy {Person("Hong", 40) } //위임 변수를 사용한 초기화
println("person Init : ${isPersonInstantiated}")
//위임 변수가 초기화 되었는지 isInitialized() 호출
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()}")
}