lateinit
과 lazy
키워드 사용class Person {
lateinit var name: String // 1. 늦은 초기화를 위한 선언
fun test() {
if(!::name.isInitialized) { // 2. 프로퍼티의 초기화 여부 판단
println("not initialized")
} else {
println("initialized")
}
}
}
fun main() {
val kildong = Person()
kildong.test()
kildong.name = "Kildong" // 3. 이 시점에서 초기화됨(지연 초기화)
kildong.test()
println("name = ${kildong.name}")
}
data class Person(var name:String, var age:Int)
lateinit var person1: Person // 1. 객체 생성의 지연 초기화
fun main() {
person = Person("kildong", 30) // 2. 생성자 호출 시점에서 초기화됨
print(person1.name + " is " + person1.age.toString())
}
class LazyTest {
init {
println("init block") // 1.
}
val subject by lazy {
println("lazy initialized") // 3.
"Kotlin Programming" // lazy 반환값
}
fun flow() {
println("not initialized") // 2.
println("subject one: $subject") // 4. 최초 초기화 시점!
println("subject two: $subject") // 5. 이미 초기화된 값 사용
}
}
fun main() {
val test = LazyTest()
test.flow()
}
< val|var|class> 프로퍼티 혹은 클래스 이름: 자료형 by 위임자
import kotlin.properties.Delegates
class User {
// observable 은 값의 번화를 감시하는 일종의 콜백 루틴
var name:String by Delegates.observable("NONAME") { // 프로퍼티를 위임
prop, old, new -> // 람다식 매개변수로 프로퍼티, 기존값, 새로운 값
println("$old -> $new") // 이부분은 이벤트가 발생될때만 실행됨
}
}
fun main() {
val user = User()
user.name = "kildong"// 값이 변경되는 시점에서 첫 이벤트 발생
user.name = "Dooly" // 값이 변경되는 시점에서 두번째 이벤트 발생
}
import kotlin.properties.Delegates
fun main() {
var max: Int by Delegates.vetoable(0) { // 1. 초기값은 0
property, oldValue, newValue ->
newValue > oldValue // 2. 조건에 맞지 않으면 거부권 행사
}
println(max) // 0
max = 10
println(max) // 10
// 여기서는 기존값이 새값보다 크므로 false임으로 5가 할당되지 않는다
max = 5
println(max) // 10
}