주의
이 블로그는 개인적인 생각과 이해를 정리한 곳입니다. 실제와 다를 수 있으니 글에서 참고한 글을 꼭 확인해주세요.
Kotlin Delegated Properties란?
Kotlin은 멤버 변수들을 property로 취급하는데 이를 대신 동작(위임)할 수 있게 하는 기능을 지원한다. by lazy가 대표적이며 getter를 위임받아서 값의 초기화를 지연시키는데 사용한다.
예제 코드
val number: Int by lazy {
println("Initialize number...")
1
}
fun main() {
println("number=${number}")
}
Initialize number...
number=1
Process finished with exit code 0
예제코드와 결과를 보면 by lazy에 의해서 number를 getter로 가져올때 "Initialze number..."가 출력되는걸 알 수 있다.
lazy란? (by lazy에서...)
getter를 위임받고 값의 초기화를 지연시키는데 사용한다. 비슷한 동작을 할 수 있는 코드는 다양하지만 약간의 차이가 존재한다.
초기화 방법의 다양한 방법
val anyImmutable = Any()
var anyMutable = Any()
lateinit var anyLateInit: Any
val anyLazy: Any by lazy { Any() }
fun main() {
anyLateInit = Any()
}
- val -> 상수 선언에도 쓰이고 선언문에서 변하지 않는 값으로 초기화를 하는 방법
- var -> 값을 변경할 수 있고 선언문에서 초기화를 하는 방법
- lateinit var -> 값을 변경할 수 있고 선언에서 초기화를 하지 않는 방법. 이후 다른 부분에서 꼭 초기화를 해주어야한다. 그렇지 않으면 kotlin.UninitializedPropertyAccessException: lateinit property anyLateInit has not been initialized 오류가 발생한다. 일반적으로 nonNull로 선언하고 싶은데 선언문에서 초기화가 불가능하고 값의 변경이 가능해야하는 경우에 사용한다.
- by lazy -> 값을 변경할 수 없고 초기화를 최초 접근시에 하는 방법. 생성자가 리소스를 많이 사용하는 경우, 선언에서 nonNull로 선언이 불가능하고 값의 변경을 불가능하게 하고 싶은 경우에 사용한다.
Delegate Property 직접 만들기
Delegate Property는 직접 구현이 가능하다. getValue만 구현하면 val에 사용이 가능하고 getValue, setValue 모두 구현하면 var에 사용이 가능하다.
구현 예시 코드
import kotlin.reflect.KProperty
class ValDelegate {
private val value = "message"
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
println("Called ValDelegate getValue")
return value
}
}
class VarDelegate {
private var value = "message"
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
println("Called VarDelegate getValue")
return value
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("Called VarDelegate setValue")
this.value = value
}
}
val message: String by ValDelegate()
var message2: String by VarDelegate()
fun main() {
println(message)
message2 += "2"
println(message2)
}
Called ValDelegate getValue
message
Called VarDelegate getValue
Called VarDelegate setValue
Called VarDelegate getValue
message2
Process finished with exit code 0
참고
'Kotlin' 카테고리의 다른 글
Kotlin Sealed class (1) | 2020.09.09 |
---|---|
Kotlin Regex(정규식) (1) | 2020.09.08 |
Kotlin Sequences (0) | 2020.09.08 |