KOTLIN

[KOTLIN] 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라 (이펙티브 코틀린)

집한구석 2022. 7. 13. 21:33
728x90

프로퍼티 위임

  • 코틀린에서 제공하는 관례에 의존하는 특성 중 하나
  • 프로퍼티 위임을 사용하면 값을 뒷받침 하는 필드에 단순히 저장하는 것보다 더 복잡한 방식으로 작동하는 프로퍼티를 쉽게 구현 가능함
  • 일반적인 프로퍼티의 행위를 추출해서 재사용이 가능함

프로퍼티 위임 예시

var token: String? = null
	get() {
		print("token returned value $field")
		return field
	}
	set(value) {
		print("token changed from $field to $value")
		field = value
	}

var attempts: Int = 0
	get() {
		print("attempts returned value $field")
		return field
	}
	set(value) {
		print("attempts changed from $field to $value")
		field = value
	}

위임 프로퍼티 적용
----------------------------------------
var token: String? by LoggingProperty(null)
var attempts: Int by LoggingProperty(0)

private 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
	) {
		val name = prop.name
		print("name changed from $value to $newValue")
		value = newValue
	}
}
  • 일부 프로퍼티에서 사용될 때, getter / setter에서 로그를 출력한다고 가정
  • token, attempts 타입은 다르지만 내부적으로 같은 처리를 하고, 자주 반복되는 패턴이 보임
  • getValue, setValue 함수를 만들어서 객체를 만든뒤 by 키워드를 사용해서 연결
  • 프로퍼티 위임은 다른 객체의 메서드를 활용해서 프로퍼티의 접근자를 만드는 방식

정리

  • 프로퍼티 위임은 프로퍼티와 관련된 다양한 조작을 할 수 있고, 컨텍스트와 관련된 대부분의 정보를 가지는데 이러한 특징으로 인해 다양한 프로퍼티의 동작을 추출해서 재사용할 수 있음