Design Pattern with Java

5. 템플릿메소드 패턴(Template Method)

초코너무조코 2025. 1. 15. 12:10
728x90

 


목차

    템플릿 메소드 패턴(Template Method Pattern)란?

    템플릿 메소드 패턴(Template Method Pattern)은 행동 디자인 패턴 중 하나로, 알고리즘의 구조를 정의하고, 알고리즘의 일부 단계를 서브클래스가 구현하도록 맡기는 패턴입니다. 이 패턴은 알고리즘의 흐름을 상위 클래스에서 정의하고, 세부 구현을 하위 클래스에서 정의하는 방식으로 설계됩니다.

    템플릿 메소드 패턴의 특징

    • 알고리즘의 구조를 상위 클래스에서 정의하고, 일부 세부 구현은 하위 클래스에서 구현하게 됩니다.
    • 알고리즘을 구현할 때, 공통된 부분을 상위 클래스에서 처리하고, 변경되는 부분만 하위 클래스에서 처리하는 방식입니다.
    • 서브클래스에서 알고리즘의 세부 구현을 수정할 수 있으므로 유연하게 확장이 가능합니다.

    템플릿 메소드 패턴의 구성 요소

    템플릿 메소드 패턴은 다음과 같은 주요 요소들로 구성됩니다:

    1. 추상 클래스(Abstract Class): 템플릿 메소드를 포함한 클래스입니다. 템플릿 메소드는 알고리즘의 구조를 정의하며, 하위 클래스가 구현해야 할 추상 메소드를 호출합니다.
    2. 템플릿 메소드(Template Method): 알고리즘의 틀을 정의하는 메소드입니다. 이 메소드 안에서 알고리즘의 순서를 정하고, 일부 단계를 하위 클래스에서 구현하도록 요청합니다.
    3. 구체 클래스(Concrete Class): 템플릿 메소드에서 정의된 알고리즘의 세부 사항을 구현하는 클래스입니다.

    템플릿 메소드 패턴 예시 (Java)

    다음은 템플릿 메소드 패턴을 사용한 간단한 예시입니다. 우리가 만들어볼 예시는 커피를 만드는 알고리즘입니다. 를 만드는 알고리즘도 비슷하지만, 차의 세부 구현이 조금 다를 수 있습니다. 이때 템플릿 메소드 패턴을 활용할 수 있습니다.

    // 추상 클래스: 음료를 만드는 알고리즘 정의
    abstract class Beverage {
        
        // 템플릿 메소드: 알고리즘을 정의
        public final void prepareRecipe() {
            boilWater();
            brew();
            pourInCup();
            addCondiments();
        }
        
        abstract void brew();  // 커피나 차를 우려내는 과정
        abstract void addCondiments();  // 첨가물 추가 (설탕, 우유 등)
        
        // 공통된 부분: 물 끓이기, 컵에 붓기
        private void boilWater() {
            System.out.println("Boiling water");
        }
        
        private void pourInCup() {
            System.out.println("Pouring into cup");
        }
    }
    
    // 커피를 만드는 구체 클래스
    class Coffee extends Beverage {
        
        @Override
        void brew() {
            System.out.println("Brewing coffee");
        }
    
        @Override
        void addCondiments() {
            System.out.println("Adding sugar and milk");
        }
    }
    
    // 차를 만드는 구체 클래스
    class Tea extends Beverage {
        
        @Override
        void brew() {
            System.out.println("Steeping the tea");
        }
    
        @Override
        void addCondiments() {
            System.out.println("Adding lemon");
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Beverage coffee = new Coffee();
            System.out.println("Preparing coffee...");
            coffee.prepareRecipe();  // 템플릿 메소드 호출
            
            System.out.println("\n");
    
            Beverage tea = new Tea();
            System.out.println("Preparing tea...");
            tea.prepareRecipe();  // 템플릿 메소드 호출
        }
    }
    

    위 예시에서 Beverage는 추상 클래스로, prepareRecipe() 메소드에서 알고리즘의 순서를 정의합니다. brew()와 addCondiments()는 추상 메소드로, 커피와 차 클래스에서 각기 다르게 구현됩니다.

    prepareRecipe() 메소드는 공통된 부분인 물 끓이기컵에 붓기는 상위 클래스에서 처리하고, 각기 다른 부분인 커피 우려내기첨가물 추가는 서브클래스에서 구현하게 됩니다.


    템플릿 메소드 패턴의 장점

    1. 코드 중복 제거 알고리즘의 공통된 부분은 상위 클래스에서 처리하고, 변하는 부분만 하위 클래스에서 구현하므로 중복 코드를 줄일 수 있습니다.
    2. 알고리즘의 구조 일관성 유지 알고리즘의 흐름을 상위 클래스에서 정의함으로써, 알고리즘의 구조가 일관되게 유지됩니다. 하위 클래스는 변경된 부분만 구현하기 때문에 일관된 방식으로 처리됩니다.
    3. 확장성 제공 새로운 알고리즘을 추가하고 싶을 때, 기존의 코드를 변경하지 않고 새로운 서브클래스를 추가하여 확장이 가능합니다.

    템플릿 메소드 패턴의 단점

    1. 상위 클래스 변경의 위험 상위 클래스에서 알고리즘의 구조를 정의하기 때문에, 상위 클래스를 변경할 경우 서브클래스에 영향을 줄 수 있습니다. 이 점은 강한 결합도를 유발할 수 있습니다.
    2. 서브클래스 구현 의존성 템플릿 메소드는 서브클래스에 의존적이기 때문에, 서브클래스가 올바르게 구현되지 않으면 템플릿 메소드가 제대로 동작하지 않습니다.

    결론

    템플릿 메소드 패턴은 알고리즘의 구조를 상위 클래스에서 정의하고, 세부 구현은 하위 클래스에서 처리하도록 해주는 강력한 디자인 패턴입니다. 알고리즘을 재사용하면서도 확장성과 유연성을 제공하며, 코드 중복을 최소화할 수 있습니다. 그러나 상위 클래스 변경이 하위 클래스에 미치는 영향을 고려하여 신중하게 적용하는 것이 중요합니다.

    728x90