Effective Kotlin - lazy와 observable 델리게이터

JINHO LEE·2024년 7월 8일
0

아이템 21: 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라

델리게이터

델리게이터는 객체가 자신의 작업을 다른 객체에 위임하는 패턴이다. 이는 코드의 재사용성을 높이고, 기능을 분리하여 코드의 가독성과 유지 보수성을 향상시키는 데 도움이 된다. Kotlin에서는 델리게이트 패턴을 쉽게 구현할 수 있는 다양한 방식과 함께 델리게이트 프로퍼티(delegate property)를 제공한다.

Kotlin의 델리게이트 프로퍼티

Kotlin에서 델리게이트 프로퍼티는 프로퍼티의 getter와 setter 로직을 다른 객체에 위임하는 기능이다. by 키워드를 사용하여 구현된다. Kotlin 표준 라이브러리는 여러 유용한 델리게이트를 제공하며, 그 중 lazy와 observable이 대표적이다.

Lazy 델리게이트

lazy 델리게이트는 프로퍼티의 초기화를 지연시키는 데 사용된다. 즉, 해당 프로퍼티가 처음으로 사용될 때 초기화가 수행된다. 이를 통해 불필요한 초기화를 피하고, 성능을 최적화할 수 있다. lazylazy { ... } 함수를 사용하여 구현된다.

val lazyValue: String by lazy {
    println("Computed!")
    "Hello"
}

fun main() {
    println(lazyValue) // "Computed!" 출력 후 "Hello" 출력
    println(lazyValue) // "Hello" 출력, 초기화는 한 번만 수행됨
}

위 예제에서 lazyValue는 처음 접근할 때만 초기화되며, 이후에는 초기화된 값을 그대로 사용한다.

Observable 델리게이트

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의 값이 변경될 때마다 콜백 함수가 호출되어 이전 값과 새 값을 출력한다.

델리게이트 프로퍼티의 사용 사례

델리게이트 프로퍼티는 다양한 상황에서 유용하게 사용될 수 있다:

  1. 지연 초기화: lazy 델리게이트를 사용하여 초기화 비용이 높은 객체의 생성을 지연시킬 수 있다.
  2. 변경 감지: observable 델리게이트를 사용하여 프로퍼티의 값이 변경될 때마다 특정 작업을 수행할 수 있다.
  3. 맵 프로퍼티 위임: 맵(map) 객체에 프로퍼티 저장을 위임하여 동적으로 프로퍼티를 관리할 수 있다.
  4. 사용자 정의 델리게이트: 커스텀 델리게이트를 구현하여 특정 로직을 프로퍼티에 적용할 수 있다.

델리게이트 프로퍼티를 활용하면 코드의 모듈화와 재사용성을 높이고, 중복 코드를 줄이며, 프로퍼티의 동작을 더 유연하게 정의할 수 있다.

0개의 댓글