아이템 21: 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라
델리게이터는 객체가 자신의 작업을 다른 객체에 위임하는 패턴이다. 이는 코드의 재사용성을 높이고, 기능을 분리하여 코드의 가독성과 유지 보수성을 향상시키는 데 도움이 된다. Kotlin에서는 델리게이트 패턴을 쉽게 구현할 수 있는 다양한 방식과 함께 델리게이트 프로퍼티(delegate property)를 제공한다.
Kotlin에서 델리게이트 프로퍼티는 프로퍼티의 getter와 setter 로직을 다른 객체에 위임하는 기능이다. by 키워드를 사용하여 구현된다. Kotlin 표준 라이브러리는 여러 유용한 델리게이트를 제공하며, 그 중 lazy와 observable이 대표적이다.
lazy
델리게이트는 프로퍼티의 초기화를 지연시키는 데 사용된다. 즉, 해당 프로퍼티가 처음으로 사용될 때 초기화가 수행된다. 이를 통해 불필요한 초기화를 피하고, 성능을 최적화할 수 있다. lazy
는 lazy { ... }
함수를 사용하여 구현된다.
val lazyValue: String by lazy {
println("Computed!")
"Hello"
}
fun main() {
println(lazyValue) // "Computed!" 출력 후 "Hello" 출력
println(lazyValue) // "Hello" 출력, 초기화는 한 번만 수행됨
}
위 예제에서 lazyValue는 처음 접근할 때만 초기화되며, 이후에는 초기화된 값을 그대로 사용한다.
observable
델리게이트는 프로퍼티의 값이 변경될 때마다 특정 로직을 실행할 수 있도록 한다. 이는 Delegates.observable
함수를 사용하여 구현된다. 이 델리게이트는 값이 변경될 때마다 콜백 함수를 호출하여 이전 값과 새 값을 전달한다.
import kotlin.properties.Delegates
var observableValue: String by Delegates.observable("Initial Value") { property, oldValue, newValue ->
println("Property '${property.name}' changed from '$oldValue' to '$newValue'")
}
fun main() {
observableValue = "New Value" // 값이 변경될 때마다 콜백 함수가 호출됨
observableValue = "Another Value"
}
위 예제에서 observableValue의 값이 변경될 때마다 콜백 함수가 호출되어 이전 값과 새 값을 출력한다.
델리게이트 프로퍼티는 다양한 상황에서 유용하게 사용될 수 있다:
델리게이트 프로퍼티를 활용하면 코드의 모듈화와 재사용성을 높이고, 중복 코드를 줄이며, 프로퍼티의 동작을 더 유연하게 정의할 수 있다.