템플릿 메소드 패턴

Bo Ram·2025년 3월 26일

템플릿 메소드 패턴이란?

템플릿 메소드(Template Method) 패턴은 알고리즘의 뼈대는 부모 클래스에 정의하고, 알고리즘의 세부적인 단계는 자식 클래스에서 구현하도록 하는 디자인 패턴입니다. 이렇게 하면 알고리즘의 구조는 고정된 채, 세부 구현만 변경할 수 있어 코드 재사용성과 유연성을 제공합니다.

문제 상황

커피와 차를 만드는 예시를 보면, 물 끓이기와 컵에 따르기와 같은 과정은 공통이고, 커피 내리기와 티백 우리기, 첨가물 추가는 다릅니다. 코드 중복을 줄이고, 나중에 전체 로직을 수정할 때 불편함을 없애려면, 공통된 로직을 따로 빼놓고 각자 다른 부분만 구현하도록 해야 합니다.

템플릿 메소드 패턴 구조

  • 추상 클래스 (AbstractClass)

    • templateMethod(): 알고리즘의 뼈대. 각 단계는 메소드 호출로 연결됩니다. 보통 final로 선언하여 자식 클래스에서 변경할 수 없도록 합니다.
    • primitiveOperation(): 자식 클래스가 구현해야 하는 추상 메소드들.
    • hook(): 자식 클래스가 선택적으로 오버라이드할 수 있는 메소드.
  • 구체 클래스 (ConcreteClass)

    • 추상 클래스를 상속받고, 필요한 부분만 구현합니다.

예시

abstract class CaffeineBeverage {
    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        if (customerWantsCondiments()) {
            addCondiments();
        }
    }

    abstract void brew();
    abstract void addCondiments();

    void boilWater() {
        System.out.println("물을 끓이는 중");
    }

    void pourInCup() {
        System.out.println("컵에 따르는 중");
    }

    boolean customerWantsCondiments() {
        return true;
    }
}

class Coffee extends CaffeineBeverage {
    @Override
    void brew() {
        System.out.println("커피를 내리는 중");
    }

    @Override
    void addCondiments() {
        System.out.println("설탕과 우유를 추가하는 중");
    }
}

class Tea extends CaffeineBeverage {
    @Override
    void brew() {
        System.out.println("찻잎을 우려내는 중");
    }

    @Override
    void addCondiments() {
        System.out.println("레몬을 추가하는 중");
    }
}

장점

  1. 코드 중복 제거: 공통 로직을 부모 클래스에 두고, 자식 클래스는 필요한 부분만 구현.
  2. 구조 일관성 유지: 템플릿 메소드를 final로 선언해 알고리즘의 흐름을 강제할 수 있습니다.
  3. 확장 용이: 새로운 음료를 추가할 때, 부모 클래스에서 공통된 부분은 그대로 두고, 자식 클래스에서 새로운 로직만 구현하면 됩니다.
  4. 유연성: hook() 메소드를 사용해 알고리즘 중 특정 단계를 선택적으로 변경할 수 있습니다.

활용 예시

  • 프레임워크: GUI나 웹 프레임워크에서 생명 주기 메소드가 템플릿 메소드 패턴을 사용합니다.
  • 라이브러리: 정렬 알고리즘처럼, 알고리즘의 구조는 동일하고 세부 구현만 달라지는 경우.

결론

템플릿 메소드 패턴은 알고리즘의 뼈대는 부모 클래스에서 관리하고, 세부 구현만 자식 클래스에서 수정하도록 하는 매우 유용한 패턴입니다. 이를 통해 코드 중복을 줄이고, 일관된 구조를 유지하면서 유연한 확장이 가능합니다.

profile
사부작ㅤ사부작

0개의 댓글