코틀린에서 위임 프로퍼티(delegated property)는 프로퍼티의 getter 및 setter 로직을 다른 객체에게 위임하는 메커니즘을 제공합니다. 이를 통해 코드 중복을 피하고, 재사용성을 높일 수 있습니다. 주요한 위임 프로퍼티 중에는 by 키워드를 사용하여 위임을 설정하는 여러 클래스들이 있습니다.
1. Lazy 위임
Lazy는 프로퍼티를 처음으로 사용할 때까지 초기화하지 않고, 사용 시에 초기화하는 데 사용됩니다.
val lazyValue: String by lazy {
println("Computed!")
"Hello Lazy"
}
fun main() {
println(lazyValue) // 첫 번째 호출 시에만 "Computed!" 출력, 이후 호출은 초기화된 값을 반환
println(lazyValue) // 두 번째 호출부터는 "Computed!" 출력 없이 초기화된 값을 반환
}
2. Observable 위임
Observable은 프로퍼티의 값 변경을 감지하고, 변경이 감지될 때마다 리스너를 호출합니다.
import kotlin.properties.Delegates
class User {
var name: String by Delegates.observable("Default") { property, oldValue, newValue ->
println("$property has changed from $oldValue to $newValue")
}
}
fun main() {
val user = User()
user.name = "Alice"
user.name = "Bob"
}
3. Vetoable 위임
Vetoable은 프로퍼티의 값 변경을 허용하거나 거부할 수 있는 기능을 제공합니다.
import kotlin.properties.Delegates
class User {
var age: Int by Delegates.vetoable(20) { property, oldValue, newValue ->
println("$property is changing from $oldValue to $newValue")
newValue >= 0 // 변경을 거부하려면 false를 반환
}
}
fun main() {
val user = User()
user.age = 25 // 유효한 변경, 출력: "age is changing from 20 to 25"
println(user.age) // 출력: 25
user.age = -5 // 유효하지 않은 변경, 출력: "age is changing from 25 to -5"
println(user.age) // 출력: 25 (변경이 거부되어 원래 값이 유지됨)
}
4. 사용자 정의 위임
사용자가 직접 위임을 구현할 수도 있습니다. 위임을 구현하려면 ReadOnlyProperty 또는 ReadWriteProperty 인터페이스를 구현해야 합니다.
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
class CustomDelegate : ReadOnlyProperty<Any?, String> {
override fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "Hello, Delegate!"
}
}
class Example {
val customProperty: String by CustomDelegate()
}
fun main() {
val example = Example()
println(example.customProperty) // 출력: "Hello, Delegate!"
}
위에서 CustomDelegate 클래스가 ReadOnlyProperty 인터페이스를 구현하고, getValue 함수를 오버라이드하여 사용자 정의 위임을 구현했습니다.
이렇게 코틀린에서는 by 키워드를 사용하여 다양한 위임 프로퍼티를 사용할 수 있습니다. 이를 활용하여 코드를 간결하고 모듈화된 형태로 유지할 수 있습니다.
With ChatGPT
'Kotlin > 포스팅' 카테고리의 다른 글
코틀린 커스텀 위임 만들기 (0) | 2024.01.06 |
---|---|
코틀린 표준 위임들 (0) | 2024.01.06 |
코틀린 이터레이션 (0) | 2024.01.05 |
코틀린 구조 분해 (0) | 2024.01.04 |
코틀린 호출과 인덱스로 원소 찾기 (0) | 2024.01.04 |