목표
- Delegate Pattern에 대해 이해한다.
Delegate Pattern이란
Delegate란 한국말로 위임이라는 뜻이다. 우리가 계약서 등을 작성할 때 대리인에게 결정 권한을 위임한다고 하면, 대리인은 우리의 결정 권한을 가지게 된다. 대리인은 우리와 다른 사람임에도 결정 권한이라는 행동에 대해 우리와 똑같이 행동할 수 있게 되는 것이다.
코틀린의 Delegate Pattern 또한 같다. 코틀린의 Delegate Pattern은 한 객체에의 함수(행동) 혹은 프로퍼티(속성)의 구현을 다른 객체에 위임한다. 예를 들어 객체1과 객체2가 있다고 해보자. 이러한 객체1의 행동을 객체2에 위임한다고 했을 때 객체2는 객체1의 함수와 프로퍼티를 위임 받는다.
예를 들어 다음과 같은 부동산계약을 위한 인터페이스가 있다고 해보자.
interface 부동산계약 {
fun 계약하기()
}
부동산 계약을 진행하는 본인은 부동산계약 인터페이스를 구현하여 계약이 가능해진다.
class 본인() : 부동산계약 {
override fun 계약하기() { println("계약되었습니다") }
}
하지만, 중개인은 본인에게 위임받지 않는 이상 부동산 계약이 불가능하다.
이러한 상황에서 우리는 위임을 사용한다. 코틀린에서는 위임을 위한 by keyword를 제공한다.
먼저 본인 객체를 만든 다음 부동산 중개인의 부동산계약 interface구현을 본인에서 구현한 부동산계약 interface관련 함수로 위임한다.
val me = 본인()
class 부동산중개인() : 부동산계약 by me // 나의 계약하기 fun이 부동산 중개인에게 위임됨
fun main() {
부동산중개인().계약하기() // 계약되었습니다.
}
이를 통해 부동산 중개인은 계약하기 수행이 가능해진다.
한 객체에서 구현된 메서드가 다른 메서드에 구현된 메서드와 같다면 여러번 구현하는 것 보다 한 번 구현 후에 재사용하는것이 보일러플레이드 코드를 줄여준다.
*보일러플레이트 코드: 무의미하게 반복되어 가독성을 떨어트리고 유지보수를 어렵게 하는 코드
val me = 본인()
class 부동산중개인() : 부동산계약 by me
class 배우자() : 부동산계약 by me
fun main() {
부동산중개인().계약하기() // 계약되었습니다.
배우자().계약하기()
}
위의 예시에서는 부동산 중개인만 있었지만, 부동산계약의 위임자는 다음과 같이 배우자가 될 수도 있고 부모님이 될 수도 있고 임의의 사람이 될 수도 있다.
이러한 경우에 각각 부동산 계약과 관련된 메서드를 구현하는 것보다 아래와 같이 본인 객체를 만들어놓고 계약 권한을 위임하는 것이 코드 유지보수에 용이하다.
val me = 본인()
class 부동산중개인() : 부동산계약 by me
class 배우자() : 부동산계약 by me
class 부모님() : 부동산계약 by me
fun main() {
부동산중개인().계약하기() // 계약되었습니다.
배우자().계약하기()
부모님().계약하기()
}
Delegate Pattern의 의의
- Delegate Pattern은 보일러 플레이트 코드를 줄여준다.
- 관리 포인트를 일원화시켜 코드 유지보수를 용이하게 해준다. 한곳에서 구현하면 다른 곳에서 위임 받아 사용할 수 있기 때문이다.
이러한 장점을 가진 Delegate Pattern은 Kotlin에서는 어떻게 사용하는지 다음 글에서 알아보록 하자.