디자인패턴

Delegate Pattern이란

Junuuu 2024. 3. 3. 00:01
728x90

Delegate Pattern이란?

Delegate는 위임이라는 뜻을 가지며 객체가 자신의 기능을 다른 객체에게 위임하여 기능을 실행하는 디자인 패턴입니다.

동일한 기능에 대해 여러번 구현하기 힘드니 한번만 구현해두고 이를 위임시키는 방법을 사용합니다.

 

예제 - kotlin

class Animal(private val cat: Cat){
	fun cry() = cat.cry()
}

class Cat(){
	fun cry() ="야옹"
}

@Test
fun `delegate를 직접 구현해서 동물의 울음소리를 고양이 클래스에게 위임한다`(){
	println(Animal(Cat()).cry())
}

Animal이란 클래스가 Cat 클래스를 인자로 받고 Cat의 cry 메서드를 그대로 사용합니다.

Animal 클래스의 cry 메서드가 Cat에 위임되었다고 볼 수 있습니다.

 

 

 

예제 - Kotlin by

interface AnimalInterface{
	fun cry(): String
}

class KotlinCat(): AnimalInterface {
	override fun cry(): String {
		return "k야옹"
	}
}

class KotlinAnimalV1(): AnimalInterface by KotlinCat()
class KotlinAnimalV2(private val kCat: KotlinCat): AnimalInterface by kCat

@Test
fun `kotlin의 도움을 받은 delegate 패턴 구현`(){
	println(KotlinAnimalV1().cry())
	println(KotlinAnimalV2(KotlinCat()).cry())
}

Kotlin에는 언어적으로 Delegate Pattern을 지원합니다.

by 키워드를 활용하여 보일러플레이트 코드를 제거할 수 있습니다.

인자로 받아온 값을 위임할 수도있고, 직접 클래스를 생성해줄 수도 있습니다.

 

 

상속을 사용하지 않는 이유

코드를 작성하다보면 "상속을 활용하여 해결하면 되는것 아닌가?" 라는 생각이 자연스럽게 듭니다.

"상속보다는 합성(Composition)을 사용하라" 라는 글으로 대체해보겠습니다.

결론적으로는 상속과 합성의 차이점을 잘 이해하고 사용해야 하고 이때 합성을 위해서 Delegate 패턴을 활용해볼 수 있습니다.

 

 

참고자료

https://en.wikipedia.org/wiki/Delegation_pattern

https://kangmin1012.tistory.com/55