Delegate pattern을 편하게 써보자
Delegate Pattern이란?
- 객체 합성이 상속과 동일하게 코드 재사용을 할 수 있도록 하는 객체 지향 디자인 패턴
- 한 객체가 다른 객체로부터 기능 일부를 넘겨받아 데이터를 제공하거나 특정 작업을 수행 할 수 있게 하는 것
- 보통 상속 대신에 Composition을 사용할 때 활용하면 유용
Delegation In Kotlin
- Kotlin에서는 Delegate Pattern을
by라는 키워드로 제공 - Delegation을 구현하는 데에 있어서 보일러 플레이트 코드를 줄일 수 있다
Example
ElectronicCar라는 인터페이스에서 전기량을 뜻하는battery, 이를 출력하는info()메서드 존재
interface ElectronicCar {
val battery: Int
fun info()
}
User라는 클래스는,ElectronicCar을 직접 구현하는 것이 아닌 구현체를 인자로 받아 사용
class User(private val electronicCar: ElectronicCar) : ElectronicCar {
override val battery: Int = electronicCar.battery
override fun info() = electronicCar.info()
}
class Tesla : ElectronicCar {
override val battery: Int = 500
override fun info() {
print("사용 가능한 전력양은 500 입니다.")
}
}
fun main(){
val user = User(Tesla())
user.info()
}
User는 Tesla를 상속받지 않더라도 사용 가능- 하지만 속성, 메서드가 많아질 수록 위임받는게 많아지고, 불필요한 코드를 야기한다
코틀린에서 지원하는 키워드 ‘by’
- ‘by’ 키워드로 한번에 해결
class User(private val electronicCar: ElectronicCar) : ElectronicCar by electronicCar
결론
- 상속은 불필요한 코드를 많이 전달받고, 결합도가 높아지기에 ‘Composition’ 사용을 지향하고있다
- ‘by’를 쓴다면 위임 클래스의 변경 영향에 부담이 없기에 자주 사용할 것 같다
Leave a comment