템플릿 메서드 패턴(Template Method Pattern) 이해하기
템플릿 메서드 패턴은 상위 클래스에서 알고리즘의 구조를 정의하고, 하위 클래스에서 알고리즘의 세부 구현을 제공하도록 설계된 행동 디자인 패턴입니다. 이 패턴은 알고리즘의 공통적인 부분은 상위 클래스에서 처리하고, 변경이 필요한 부분만 하위 클래스에서 오버라이딩하여 구현합니다.
템플릿 메서드 패턴은 코드 재사용성을 극대화하고, 알고리즘의 일관성을 유지하면서도 특정 단계에서의 구현은 유연하게 변경할 수 있도록 도와줍니다.
템플릿 메서드 패턴이란?
템플릿 메서드 패턴은 상위 클래스에서 알고리즘의 골격(틀)을 정의하고, 하위 클래스에서 알고리즘의 구체적인 단계를 구현하는 디자인 패턴입니다. 상위 클래스에 정의된 템플릿 메서드(Template Method)는 알고리즘의 단계를 호출하며, 하위 클래스에서 재정의된 메서드를 호출하여 구현을 확장합니다.
주요 개념은 알고리즘의 구조와 구현을 분리하여, 알고리즘의 변경 없이 세부 동작만 변경 가능하도록 하는 것입니다.
템플릿 메서드 패턴의 구조
템플릿 메서드 패턴은 다음과 같은 구성 요소로 이루어집니다.
- AbstractClass (추상 클래스):
- 알고리즘의 골격을 정의하고, 템플릿 메서드를 구현합니다.
- 템플릿 메서드는 일반적으로 final로 선언하여 하위 클래스에서 재정의할 수 없게 만듭니다.
- 세부 구현이 필요한 단계는 추상 메서드로 선언합니다.
- ConcreteClass (구체적인 클래스):
- 추상 클래스의 추상 메서드를 구현하여 알고리즘의 세부 동작을 제공합니다.
템플릿 메서드 패턴의 구현 방법
예제 코드: 커피와 차 만들기
템플릿 메서드 패턴을 활용하여, 커피와 차를 만드는 과정을 구현해보겠습니다. 커피와 차의 준비 과정은 비슷하지만, 일부 단계는 다르게 처리됩니다.
// AbstractClass: 음료 만들기
public abstract class Beverage
{
// 템플릿 메서드
public void PrepareRecipe()
{
BoilWater();
Brew();
PourInCup();
AddCondiments();
}
// 공통 메서드
private void BoilWater()
{
Console.WriteLine("Boiling water...");
}
private void PourInCup()
{
Console.WriteLine("Pouring into cup...");
}
// 추상 메서드
protected abstract void Brew(); // 끓이는 단계
protected abstract void AddCondiments(); // 첨가물 추가
}
// ConcreteClass: 커피
public class Coffee : Beverage
{
protected override void Brew()
{
Console.WriteLine("Brewing coffee grounds...");
}
protected override void AddCondiments()
{
Console.WriteLine("Adding sugar and milk...");
}
}
// ConcreteClass: 차
public class Tea : Beverage
{
protected override void Brew()
{
Console.WriteLine("Steeping tea bag...");
}
protected override void AddCondiments()
{
Console.WriteLine("Adding lemon...");
}
}
// Client 코드
class Program
{
static void Main()
{
Console.WriteLine("Making Coffee:");
Beverage coffee = new Coffee();
coffee.PrepareRecipe();
Console.WriteLine("\nMaking Tea:");
Beverage tea = new Tea();
tea.PrepareRecipe();
}
}
실행 결과
Making Coffee:
Boiling water...
Brewing coffee grounds...
Pouring into cup...
Adding sugar and milk...
Making Tea:
Boiling water...
Steeping tea bag...
Pouring into cup...
Adding lemon...
코드 설명
- AbstractClass:
- Beverage 클래스는 음료를 준비하는 알고리즘의 구조를 정의합니다.
- PrepareRecipe() 메서드는 템플릿 메서드로, 음료를 만드는 순서를 정의하고 각 단계를 호출합니다.
- 공통적인 단계는 BoilWater()와 PourInCup() 메서드로 구현됩니다.
- 각 음료에 따라 달라지는 단계는 추상 메서드(Brew()와 AddCondiments())로 선언됩니다.
- ConcreteClass:
- Coffee와 Tea 클래스는 Beverage를 상속받아, 추상 메서드를 구현합니다.
- 각 클래스는 자신만의 방식으로 커피와 차를 준비합니다.
- Client:
- 클라이언트는 템플릿 메서드(PrepareRecipe())를 호출하여 음료를 준비하며, 내부 동작은 다형성에 따라 적절한 구현이 실행됩니다.
템플릿 메서드 패턴의 장단점
장점
- 코드 재사용성 증가:
- 알고리즘의 공통적인 부분을 상위 클래스에서 구현하여, 하위 클래스에서 중복 코드를 작성할 필요가 없습니다.
- 유연성:
- 알고리즘의 세부 동작만 하위 클래스에서 변경할 수 있으므로, 확장성이 뛰어납니다.
- 알고리즘 구조 유지:
- 알고리즘의 골격을 상위 클래스에서 정의하므로, 일관성을 유지할 수 있습니다.
단점
- 하위 클래스 의존성:
- 하위 클래스가 많아질수록 코드의 복잡성이 증가할 수 있습니다.
- 알고리즘 변경의 제한:
- 알고리즘의 구조가 상위 클래스에 고정되어 있으므로, 큰 변화가 필요할 경우 새로운 구조를 설계해야 할 수 있습니다.
언제 템플릿 메서드 패턴을 사용해야 할까?
템플릿 메서드 패턴은 다음과 같은 상황에서 유용합니다.
- 알고리즘의 구조는 동일하지만, 일부 동작이 다를 때:
- 알고리즘의 큰 틀은 동일하지만, 특정 단계에서 동작이 달라지는 경우.
- 알고리즘의 재사용성이 중요한 경우:
- 알고리즘의 공통 부분을 재사용하고, 세부적인 구현만 변경하고 싶을 때.
- 코드 일관성을 유지하고 싶을 때:
- 알고리즘의 구조를 상위 클래스에서 정의하여 일관된 실행 흐름을 유지하고 싶을 때.
템플릿 메서드 패턴과 관련 패턴 비교
템플릿 메서드 패턴은 알고리즘의 골격을 정의하고, 세부 구현을 하위 클래스에 위임합니다. 유사한 디자인 패턴과의 차이를 살펴보겠습니다.
- 전략 패턴:
- 알고리즘을 별도의 객체로 캡슐화하여, 런타임에 알고리즘을 교체할 수 있습니다. 템플릿 메서드 패턴은 알고리즘의 골격을 고정하고, 세부 구현을 변경합니다.
- 팩토리 메서드 패턴:
- 객체 생성 로직을 하위 클래스에서 구현하도록 강제합니다. 템플릿 메서드 패턴은 알고리즘의 실행 흐름을 캡슐화합니다.
- 상태 패턴:
- 객체의 상태에 따라 행동을 변경합니다. 템플릿 메서드 패턴은 상태가 아닌 알고리즘의 구조에 중점을 둡니다.
실무에서 템플릿 메서드 패턴 활용하기
템플릿 메서드 패턴은 다음과 같은 실무 상황에서 활용됩니다.
- 데이터 처리 파이프라인:
- 데이터 변환, 필터링, 정렬 등 공통된 처리 흐름에서 일부 단계가 다른 경우.
- 게임 개발:
- 다양한 캐릭터의 행동(예: 공격, 이동)이 공통된 흐름을 따르지만, 세부 동작이 다른 경우.
- 테스트 프레임워크:
- 테스트의 기본 구조를 정의하고, 테스트 준비 및 정리 단계를 유연하게 구현해야 하는 경우.
- 보고서 생성 시스템:
- 보고서의 생성 과정은 동일하지만, 데이터 소스나 서식이 다른 경우.
마무리하며
템플릿 메서드 패턴은 알고리즘의 골격을 정의하고, 세부 동작을 유연하게 확장할 수 있는 강력한 패턴입니다. 특히 알고리즘의 구조는 동일하지만, 일부 동작이 다르게 구현되어야 하는 시스템에서 큰 효과를 발휘합니다.
알고리즘의 구조를 재사용하고, 세부 구현을 유연하게 관리해야 하는 시스템을 설계할 때 템플릿 메서드 패턴을 활용해보세요. 이를 통해 코드의 일관성과 유지보수성을 크게 향상시킬 수 있습니다.
'Thinking > Concept' 카테고리의 다른 글
방문자 패턴(Visitor Pattern) 이해하기 (1) | 2024.11.17 |
---|---|
전략 패턴(Strategy Pattern) 이해하기 (0) | 2024.11.17 |
상태 패턴(State Pattern) 이해하기 (0) | 2024.11.17 |
옵저버 패턴(Observer Pattern) 이해하기 (0) | 2024.11.17 |
메멘토 패턴(Memento Pattern) 이해하기 (1) | 2024.11.16 |