템플릿 메소드 패턴은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나입니다. 해당 패턴은 상위 클래스에서 알고리즘의 구조를 정의하고 하위 클래스에서 알고리즘의 구체적인 단계를 구현할 수 있게 합니다. 이를 통해 하위 클래스에서 알고리즘의 일부분을 변경하면서도 전체 알고리즘의 구조는 변경하지 않아도 되게 합니다. 이로써 코드 재사용성이 높아지고 일관성 있게 알고리즘을 적용할 수 있습니다.
템플릿 메소드 패턴의 구조
템플릿 메소드 패턴은 일반적으로 다음과 같은 구조를 가집니다.
public abstract class AbstractClass {
public void templateMethod() {
primitiveOperation1();
primitiveOperation2();
}
protected abstract void primitiveOperation1();
protected abstract void primitiveOperation2();
}
public class ConcreteClass extends AbstractClass {
@Override
protected void primitiveOperation1() {
// 구체적인 구현 내용
}
@Override
protected void primitiveOperation2() {
// 구체적인 구현 내용
}
}
위의 예제에서 AbstractClass
는 알고리즘의 구조를 정의하는데 사용되고, ConcreateClass
는 구체적인 단계를 구현합니다.
templateMethod
는 알고리즘의 구조를 정의하고, primitiveOperation1
과 primitiveOperation2
는 구체적인 단계를 구현합니다.
예제
예를 들어, 커피를 만드는 프로세스를 템플릿 메소드 패턴으로 구현해보겠습니다.
public abstract class CoffeeTemplate {
public final void makeCoffee() {
boilWater();
brewCoffeeGrinds();
pourInCup();
addCondiments();
}
private void boilWater() {
System.out.println("물 끓이기");
}
private void pourInCup() {
System.out.println("컵에 따르기");
}
protected abstract void brewCoffeeGrinds();
protected abstract void addCondiments();
}
public class Cappuccino extends CoffeeTemplate {
@Override
protected void brewCoffeeGrinds() {
System.out.println("커피 가루 우려내기");
}
@Override
protected void addCondiments() {
System.out.println("우유 추가하기");
}
}
public class Americano extends CoffeeTemplate {
@Override
protected void brewCoffeeGrinds() {
System.out.println("커피 가루 우려내기");
}
@Override
protected void addCondiments() {
System.out.println("물 추가하기");
}
}
위의 예제를 보면, CoffeeTemplate
클래스에서 makeCoffee
메소드는 커피 제조 프로세스의 구조를 정의하고,
brewCoffeeGrinds
와 addCondiments
는 각각 커피 가루를 우려내는 구체적인 단계와 첨가물을 추가하는 구체적인 단계를 정의합니다.
Cappuccino
나 Americano
클래스에서는 CoffeeTemplate
클래스를 상속받아 구체적인 단계를 구현합니다.
이렇게 함으로써, 템플릿 메소드 패턴을 통해 커피 제조 프로세스의 일부분을 변경할 수 있고, 알고리즘의 구조는 변경하지 않아도 되어 코드 재사용성과 일관성을 유지할 수 있습니다.
결론
템플릿 메소드 패턴은 상위 클래스에서 알고리즘의 구조를 정의하고 하위 클래스에서 구체적인 단계를 구현함으로써, 일관성 있게 알고리즘을 적용하고 코드를 재사용할 수 있는 패턴입니다. 이 패턴은 소프트웨어의 유지보수성과 확장성을 높일 수 있는 중요한 기법 중 하나입니다.
참조 :
- https://en.wikipedia.org/wiki/Template_method_pattern
- Head First Design Patterns, O’Reilly Media, 2004