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

ds_chanin

·

2023. 5. 14. 19:02


지연 프로퍼티

lazy 프로퍼티는 이후에 처음 사용하는 요청이 들어올 때 초기화되는 프로퍼티를 의미한다.

지연프로퍼티를 java에서 구현하려면 복합한 과정이 필요한데 코틀린은 프로퍼티 위임을 이용하여 간단하게 구현할 수 있다.

val value by lazy { createValue() }

Delegates.observable을 이용하면 프로퍼티 위임을 사용하면 변화를 감지하는 옵저버 패턴도 쉽게 만들 수 있다.

var catchedChessPeices: List<ChessPeice> by
  Delegates.observable(listOf()) { _, old, new -> 
    checkKingDied(new)
  }

 

위와 같이 프로퍼티 위임 메커니즘을 사용하면 뷰, 리소스 바인딩, 의존성 주입, 데이터 바인딩 등 다양한 패턴을 만들 수 있다.

 

프로퍼티 위임을 직접 만드는 경우 메서드 이름을 정확하게 지어야 한다.

  • getValue (val, var의 경우)
  • setValue (var의 경우)
class LoggingProperty<T>(var value: T) {
  operator fun getValue(
    thisRef: Any?,
    prop: KProperty<*>
  ): T {
    print("${prop.name} returned value $value")
    return value
  }
  
  operator fun setValue(
    thisRef: Any?,
    prop: KProperty<*>,
    newValue: T
  ) {
    print("name changed from $value to $newValue")
    value = newValue
  }
}

 

프로퍼티 위임을 이용하면 자바와 비교하여 포워딩 객체를 사용하기 편해진다.

interface MyInterface {
  fun foo()
}

class ForwardingClass : MyInterface {
  override fun foo() {
    println("delegate")
  }
}

class MyClass(
    val fowardingClass: ForwardingClass
) : MyInterface by fowardingClass