WIPIVERSE

템플릿 메소드 패턴

템플릿 메소드 패턴

정의

템플릿 메소드 패턴(Template Method Pattern)은 추상 클래스를 이용해 알고리즘의 골격을 정의하고, 일부 단계는 하위 클래스가 구체적으로 구현하도록 하는 객체지향 설계 패턴이다. 알고리즘 전체 흐름은 변하지 않으며, 변동이 필요한 부분만 하위 클래스에서 재정의한다.

분류

  • 패턴 카테고리: 행동(Behavioral) 패턴
  • 관련 패턴: 전략 패턴(Strategy Pattern), 훅(Hook) 메소드, 메소드 오버라이딩

핵심 구성 요소

구성 요소 역할
AbstractClass (추상 클래스) 템플릿 메소드를 정의하고, 알고리즘의 고정된 순서를 구현한다. 추상 메소드 혹은 훅을 선언해 하위 클래스가 구체화하도록 만든다.
ConcreteClass (구체 클래스) AbstractClass에서 선언된 추상 메소드 또는 훅을 구현한다. 알고리즘의 가변적인 부분을 제공한다.
Template Method AbstractClass에 구현된, 알고리즘 전체 흐름을 제어하는 메소드. 일반적으로 final 혹은 sealed로 선언해 재정의를 방지한다.
Hook (선택적) 기본 구현이 제공되며, 필요에 따라 하위 클래스에서 선택적으로 재정의할 수 있는 메소드.

작동 메커니즘

  1. 클라이언트는 AbstractClass의 템플릿 메소드를 호출한다.
  2. 템플릿 메소드는 사전에 정의된 순서대로 여러 단계(메소드)를 실행한다.
  3. 각 단계는 AbstractClass에 구현되어 있거나, ConcreteClass에서 구현된 추상 메소드/훅이다.
  4. 알고리즘 흐름은 고정되어 있으므로, 하위 클래스가 구현을 바꾸더라도 전체 구조는 유지된다.

적용 조건

  • 알고리즘의 전체 구조는 변하지 않지만, 일부 단계만 바꾸어야 할 경우.
  • 여러 하위 클래스가 동일한 알고리즘 흐름을 공유하면서도 세부 구현을 다르게 해야 하는 경우.
  • 코드 중복을 최소화하고, 공통 로직을 한 곳에 집중시키고자 할 때.

장점

  • 코드 재사용: 공통 로직을 추상 클래스에 집중시켜 중복을 감소한다.
  • 일관성 유지: 알고리즘 흐름이 고정되어 있어 클라이언트 입장에서 일관된 동작을 보장한다.
  • 확장성: 새로운 하위 클래스를 추가함으로써 기존 코드 변경 없이 새로운 동작을 제공할 수 있다.

단점

  • 상속에 의존: 다중 상속이 불가능하거나 제한적인 언어에서는 적용이 어려울 수 있다.
  • 구조 복잡도: 추상 클래스와 하위 클래스가 늘어나면 클래스 계층이 복잡해질 가능성이 있다.

사용 예시 (설계 수준)

abstract class DataProcessor {
    // 템플릿 메소드
    public final void process() {
        readData();
        processData();
        writeData();
    }

    protected abstract void readData();      // 하위 클래스가 구현
    protected abstract void processData();  // 하위 클래스가 구현
    protected void writeData() {              // 기본 구현(훅)
        System.out.println("기본 저장 로직");
    }
}

// 구체 클래스 1
class CSVProcessor extends DataProcessor {
    protected void readData() { /* CSV 읽기 구현 */ }
    protected void processData() { /* CSV 처리 구현 */ }
}

// 구체 클래스 2
class XMLProcessor extends DataProcessor {
    protected void readData() { /* XML 읽기 구현 */ }
    protected void processData() { /* XML 처리 구현 */ }
    @Override
    protected void writeData() { /* XML 특화 저장 구현 */ }
}

관련 패턴과 차이점

  • 전략 패턴: 알고리즘 자체를 캡슐화하여 런타임에 교체한다. 템플릿 메소드는 알고리즘 흐름을 고정하고, 일부 단계만 교체한다는 점에서 차이가 있다.
  • 훅 메소드: 템플릿 메소드 내부에 제공되는 선택적 오버라이드 포인트. 템플릿 메소드와 훅은 같은 구조 내에서 함께 사용된다.
  • 팩토리 메소드 패턴: 객체 생성 구문을 추상화한다. 템플릿 메소드는 알고리즘 흐름을 정의한다는 점에서 목적이 다르다.

출처

  • Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides, Design Patterns: Elements of Reusable Object‑Oriented Software, Addison‑Wesley, 1994.
  • 공식 GOF(GoF) 디자인 패턴 카탈로그.

(본 설명은 공개된 문헌 및 신뢰할 수 있는 기술 서적을 기반으로 작성하였다.)

둘러보기

더 찾아볼 만한 주제

    전체 문서 보기