minstudio

템플릿 메서드 패턴 (Template Method)

템플릿 메서드 패턴(Template Method Pattern)은 전체적인 알고리즘의 '뼈대(흐름)'는 부모(추상) 클래스에 정의하고, 단계별 '구체적인 구현'은 자식 클래스에게 위임하는 행위 패턴입니다.

커피와 홍차를 끓이는 과정을 보면 `1. 물 끓이기 -> 2. 우려내기 -> 3. 컵에 따르기 -> 4. 첨가물 넣기` 로 전체 흐름이 완벽히 똑같습니다. 이때 부모 클래스의 makeBeverage() 메서드 안에 이 4단계의 순서를 고정(final)해두고, 자식 클래스(Coffee, Tea)는 2번과 4번 내용만 알맞게 오버라이딩하여 코드 중복을 완전히 제거합니다.

📝 Template Method: 알고리즘 뼈대는 부모가, 상세 구현은 자식이 CaffeineBeverage (추상 클래스) final make() { // 뼈대 고정 (오버라이딩 불가) boilWater(); // 공통 로직 brew(); // 자식이 구현할 추상 메서드 pourInCup(); // 공통 로직 addCondiments(); // 자식이 구현할 추상 메서드 } Coffee brew() -> "커피 원두 필터로 내리기" addCondiments() -> "설탕과 우유 추가" Tea brew() -> "홍차 티백 우리기" addCondiments() -> "레몬 띄우기"
// Abstract Class
abstract class CaffeineBeverage {
    // 템플릿 메서드 (알고리즘의 골격)
    // 하위 클래스에서 오버라이드 하지 못하게 final 선언
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }
    
    // 서브클래스에서 구현해야 할 메서드
    abstract void brew();
    abstract void addCondiments();
    
    // 공통 메서드
    public void boilWater() { System.out.println("물 끓이는 중"); }
    public void pourInCup() { System.out.println("컵에 따르는 중"); }
}

class Tea extends CaffeineBeverage {
    public void brew() { System.out.println("차를 우려냅니다"); }
    public void addCondiments() { System.out.println("레몬을 추가합니다"); }
}

class Coffee extends CaffeineBeverage {
    public void brew() { System.out.println("필터로 커피를 우려냅니다"); }
    public void addCondiments() { System.out.println("설탕과 우유를 추가합니다"); }
}

public class Main {
    public static void main(String[] args) {
        CaffeineBeverage myTea = new Tea();
        myTea.prepareRecipe();
        System.out.println("---");
        CaffeineBeverage myCoffee = new Coffee();
        myCoffee.prepareRecipe();
    }
}
템플릿 메서드 패턴 (Template Method) | Minstudio