티스토리 뷰

반응형

알고리즘을 캡슐화해서, 서브클래스에서 언제든 필요 할때마다 사용할 수 있는 방법을 고민하신다면 디자인 패턴 중 하나인 템플릿 메소드 패턴을 제안드립니다.  이번 포스트는 템플릿 메소드 패턴에 대해서 간단히 알아보겠습니다.

* Head First - Design Patterns 의 템플릿 메소드 패턴 기반으로 작성하였습니다. 자세한 설명은 도서를 참고해주세요.

 

템플릿 메소드 패턴

메소드에서 알고리즘의 골격을 정의합니다. 알고리즈의 여러 단계 중 일부는 서브클래스에서 구현할 수 있습니다. 템플릿 메소드를 이용하면 알고리즘의 구조는그대로 유지하면서 서브클래스에서 특정 단계를 재정의할 수 있습니다.

 

후크

추상 클래스에서 선언되는 메소드긴 하지만 기본적인 내용만 구현되어 있거나 아무 코드도 들어있지 않은 메소드입니다.

서브클래스 입장에서는 다양한 위치에서 알고리즘에 끼어들 수 있습니다.

필수적이지 않은 부분은 추상 클래스가 아닌 후크로 구현하면 그 추상 클래스의 서브클래스를 만들 때 조금 부담이 줄여들게 됩니다.

 

헐리우드 원칙

의존성 부패(dependency rot)를 방지 할 수 있습니다.

의존성부패란?
A 구성요소(고수준)가 B 구성요소(저수준)를 의존하고, B 구성요소가 A 구성요소를 의지하고, A 구성요소는 C 구성요소를 의존하고, C 구성요소는 B 구성요소를 의존하는 것과 같이 의존성이 복잡하게 꼬여있는 것을 의존성 부패라고 부릅니다.

 

CoffeeBeverage 고수준 구성요소 입니다. 음료 만드는 방법에 해당하는 알고리즘을 구성하지만, 메소드 구현이 필요한 상황에서만 서브클래스를 불러내게 됩니다.

헐리우드 원칙에 의하면 저수준 모듈을 언제 호출 할지는 고수준 모듈에서 결정하는 것이 좋습니다.

 

야생의 템플릿 메소드

템플릿 메소드 패턴은 매우 많이 쓰이는 패턴이라서 야생에서도 쉽게 발견할 수 있습니다. Arrays 클래스의 정렬(sort) 을 살펴보겠습니다.

Arrays의 sort(Object[]) 메소드를 확인하면 mergeSort() 을 호출 하고 있고, mergeSort 안에서 object을 Comparable로 형변환 후 compareTo() 메소드를 통하여 비교하고 있습니다.

하나의 예시로 Duck 객체를 생성 후 compareTo() 메소드를 정의하여 Arrays의 Sort() 을 할 수 있게 하겠습니다.

 

마무리

템플릿 메소드 패턴에 대해서 알아봤습니다.

템플릿 메소드 패턴은 다양한 곳에서 쉽게 발생할 수 있는데요. Android App 개발을 해보셨으면 한번 이상은 템플릿 메소드 패턴을 사용했을 것입니다. 
Android LifeCycle 에 맞춰 개발하다보면 onCreate, onResume 을 override 을 하여 사용합니다. 
onCreate, onResume 은 LifeCycle에 맞춰 동작하게 되고 사용자는 그 LifeCycle에 맞춰 override 을 통해 구현을 하게 됩니다. 

템플릿 메소드 패턴에 대한 자세한 설명은 Head First - Design Patterns (도서) 에서 확인 하실 수 있습니다.

알고리즘의 일부 단계를 구현하는 것을 서브클래에서 처리가 필요 시 템플릿 메소드 패턴 적용을 고려하는 것도 좋을거 같습니다.

 

출처

[도서] Head First - Design Patterns

반응형
댓글