Kotlin/포스팅

코틀린 위임 프로퍼티

짜집퍼박사(짜박) 2024. 1. 6. 14:45

코틀린에서 위임 프로퍼티(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