Link
Today
Total
06-30 13:48
Archives
관리 메뉴

초보개발자 긍.응.성

5. Template Method Pattern (템플릿 메소드 패턴) 본문

설계패턴(Design Pattern)

5. Template Method Pattern (템플릿 메소드 패턴)

긍.응.성 2019. 10. 29. 21:30
반응형

상황에 따라 달라지는 부분이 있지만 전체적인 알고리즘의 뼈대가 유지되어야 할 때 사용될 Template Method Pattern에 대해 알아보자.

 

1. Purpose

Identifies the framework of an algorithm, allowing implementing classes to define the actual behavior.

알고리즘의 틀을 알고있으며, 실질적인 행동들을 클래스에서 정의해주려 할때

 

2. Use When

  • A single abstract implementation of an algorithm is needed.
  • Common behavior among subclasses should be localized to a common class.
  • Parent classes should be able to uniformly invoke behavior in their subclasses.
  • Most or all subclasses need to implement the behavior.

예시를 통해 알아보자

 

카페와 다방(?)이 있다고 생각해보자. 둘의 공통점은 음료를 제조한다는 점이며 음료를 만드는 과정은 다음과 같다.

 

위의 제조과정(prepareRecipe)을 보자. Coffee의 제조과정은 물을 끓인후, 커피를 추출한후 컵에 붓는다. 마지막으로 설탕과 우유를 추가하여 제조를 마친다. Tea의 제조과정은 Coffee와 동일하게 물을 끓인다. 대신 티백을 넣은 후, 컵에 붓는다. 마지막으로 레몬을 추가한다.

 

두 클래스의 prepareRecipe는 boilwater, pourInCup이라는 공통된 행위를 가진다. 이는 비슷한 제조 알고리즘에서 중복되는 요소가 존재하며, 추가되는 음료에 대해 잠재적 중복의 가능성을 가진다. 이런 중복을 줄이기 위해 사용하는 것이 Template Method Pattern이다.

 

 

brewCoffeeGrinds와 steepTeaBag처럼 Coffee와 Tea가 가지는 유사하지만 다른 행위에 대해 brew라는 함수의 이름으로 통합하고 첨가물을 넣는행위도 addCondiments라는 함수로 만들어준다. 그리고 final 함수로 prepareRecipe를 묶어준다. 같은 행위인 물을 끓이는 행위나 컵에 붓는행위는 concrete하게 작성하여 주고 비슷하지만 음료마다 다른 행위를 하는 brew나 addCondiments함수는 하위클래스에서 상속하여 구현할수있도록 abstract method으로 둔다.

 

이때 final키워드를 사용하는 것이 중요한 포인트이다. 알고리즘단위를 final로 선언해줌으로써 이를 상속하는 하위 클래스들은 prepareRecipt라는 알고리즘의 틀을 수정할수없게된다. 하위클래스 Coffee와 Tea는 상위클래스 CaffeineBeverage를 상속받아 각각의 음료제조과정에 맞게 brew와 addCondiments를 작성, 상위클래스에서 제공하는 prepareRecipe함수를 통해서만 음료를 만들수있다. 이는 새롭게 추가되는 음료에 대해 코드의 중복을 줄여주며 전체적인 음료제조의 알고리즘의 변화도 한곳에서만 변화시킴으로써 해결해줄수 있는 장점이있다.

 

이때 void final prepareRecipe() { ... } 부분을 Template Method라 부른다.

 

정리해보면 이렇다. 전체 뼈대가되는 알고리즘 부분을 Template Method로 묶는다. Template Method을 구성하는 알고리즘은 여러 개의 method로 구성되며 이중 concrete하게 작성된 것도 있는 반면 abstract method로 남아 하위 클래스에게 행위를 정의하게 만들 수 있다. 이는 하위클래스가 알고리즘의 변화없이 쉽게 자신의 step을 담을 수 있다는 장점을 가진다.

 

3. Hook Method

 

Template Method 알고리즘 속 제어문을 넣어 일부의 제어를 하위클래스가 필요에 따라 활용할 수 있도록 제공하기도 한다. 이를 Hook method라 부른다.

 

 

위의 그림에서 customerWantsCondiments()가 Hook method가 된다.

 

4. Design Principle

 

이 Template Method Pattern의 Design Principle을 Hollywood Principle이라 부른다.

Hollywood Principle: Don't call us, we'll call you

 

즉 상위 Component만이 하위 Component를 부를수있다는 원칙이다. Template method는 상위클래스에 선언되 있으며 상위클래스에서 이 method를 수행할때 필요에 따라 일부 step 하위 클래스의 method를 불러서 처리한다.

 

지금까지 Template Method Pattern에 대해 알아보았다. 같은 부분을 묶어내는것이 Strategy Pattern과 비슷한 점이며 둘다 Behavior에 대한 설계패턴인것이 맞다. 다른점은 사용되는 단위이다. Template Method Pattern은 하나의 Class내에서 전체적인 알고리즘이 정의되는고 polymorphism을 사용하여 다른 method를 수행한다. 이와 달리, Strategy Pattern은 행위를 별도의 Interface로 분리한다. 그리고 상위 클래스는 이를 멤버변수로 가지며 이 Behavior 필요에 따라 다른 Object로 갈아끼우면서 진행한다.

반응형
Comments