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 키워드를 사용해서 연결
- 프로퍼티 위임은 다른 객체의 메서드를 활용해서 프로퍼티의 접근자를 만드는 방식
정리
- 프로퍼티 위임은 프로퍼티와 관련된 다양한 조작을 할 수 있고, 컨텍스트와 관련된 대부분의 정보를 가지는데 이러한 특징으로 인해 다양한 프로퍼티의 동작을 추출해서 재사용할 수 있음
'KOTLIN' 카테고리의 다른 글
[KOTLIN] 멤버 확장 함수의 사용을 피하라 (이펙티브 코틀린) (0) | 2022.07.27 |
---|---|
[KOTLIN] 복잡한 객체를 생성하기 위한 DSL을 정의하라 (이펙티브 코틀린) (0) | 2022.07.20 |
[KOTLIN] 제네릭 타입과 VARIANCE 한정자를 활용하라 (이펙티브 코틀린) (0) | 2022.07.10 |
[KOTLIN] 타입 파라미터의 섀도잉을 피하라 (이펙티브 코틀린) (0) | 2022.07.10 |
[KOTLIN] 연산자 오버로드를 할때는 의미에 맞게 사용 (0) | 2022.07.03 |