JAVA/JAVA Design Pattern

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

임베디드 친구 2025. 1. 3. 10:57
반응형

1. 템플릿 메서드 패턴이란?

템플릿 메서드 패턴은 상위 클래스에서 공통 알고리즘의 구조를 정의하고, 하위 클래스에서 구체적인 세부 사항을 재정의할 수 있도록 하는 패턴입니다. 알고리즘의 전체 흐름이나 단계는 동일하지만, 일부 단계의 구현이 상황에 따라 달라질 때 유용합니다.

핵심 개념:

  • 상위 클래스(추상 클래스)는 알고리즘의 골격(template)을 정의합니다.
  • 하위 클래스는 세부 구현을 재정의(override)합니다.

2. 클래스 다이어그램

+------------------------+
|      AbstractClass     |
+------------------------+
| + templateMethod()     |
| + primitiveOperation1()|
| + primitiveOperation2()|
+------------------------+
            |
            | (상속)
            v
+------------------------+
|      ConcreteClass     |
+------------------------+
| + primitiveOperation1()|
| + primitiveOperation2()|
+------------------------+
  • AbstractClass: 알고리즘의 기본 흐름을 제공하고 세부 구현은 하위 클래스에 위임합니다.
  • ConcreteClass: AbstractClass의 메서드를 구체적으로 구현합니다.

3. 예제 코드

다음은 템플릿 메서드 패턴을 활용한 예제입니다. 음료를 만드는 과정을 예로 들어보겠습니다.

AbstractClass: 음료 만들기 기본 템플릿

abstract class Beverage {
    // 템플릿 메서드: 알고리즘의 구조를 정의
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    // 공통된 부분: 상위 클래스에서 정의
    private void boilWater() {
        System.out.println("물을 끓입니다.");
    }

    private void pourInCup() {
        System.out.println("컵에 붓습니다.");
    }

    // 세부 구현은 하위 클래스에서 정의
    protected abstract void brew();
    protected abstract void addCondiments();
}

ConcreteClass: 커피와 차 구현

class Coffee extends Beverage {
    @Override
    protected void brew() {
        System.out.println("커피를 내립니다.");
    }

    @Override
    protected void addCondiments() {
        System.out.println("설탕과 우유를 추가합니다.");
    }
}

class Tea extends Beverage {
    @Override
    protected void brew() {
        System.out.println("차를 우려냅니다.");
    }

    @Override
    protected void addCondiments() {
        System.out.println("레몬을 추가합니다.");
    }
}

Main 클래스: 실행 예

public class TemplateMethodExample {
    public static void main(String[] args) {
        System.out.println("커피 준비 중...");
        Beverage coffee = new Coffee();
        coffee.prepareRecipe();

        System.out.println("\n차 준비 중...");
        Beverage tea = new Tea();
        tea.prepareRecipe();
    }
}

실행 결과

커피 준비 중...
물을 끓입니다.
커피를 내립니다.
컵에 붓습니다.
설탕과 우유를 추가합니다.

차 준비 중...
물을 끓입니다.
차를 우려냅니다.
컵에 붓습니다.
레몬을 추가합니다.

4. 사용 사례

Java의 AbstractList 클래스

Java의 AbstractList 클래스는 템플릿 메서드 패턴을 사용하여 리스트의 기본 동작을 정의합니다.

  • 메서드 size(), get()과 같은 핵심 메서드는 하위 클래스가 구현합니다.
  • add(), remove()와 같은 메서드는 공통 알고리즘을 제공하고 특정 동작만 하위 클래스에서 재정의합니다.

예시:

import java.util.AbstractList;

class CustomList extends AbstractList<String> {
    private String[] data = {"A", "B", "C"};

    @Override
    public String get(int index) {
        return data[index];
    }

    @Override
    public int size() {
        return data.length;
    }
}

public class AbstractListExample {
    public static void main(String[] args) {
        CustomList list = new CustomList();
        System.out.println(list.get(1)); // 출력: B
        System.out.println("리스트 크기: " + list.size()); // 출력: 리스트 크기: 3
    }
}

5. 템플릿 메서드 패턴의 장단점

장점:

  • 알고리즘의 구조를 재사용할 수 있습니다.
  • 코드 중복을 줄이고 유지보수성을 높입니다.
  • 알고리즘의 변경이 필요할 때 상위 클래스만 수정하면 됩니다.

단점:

  • 하위 클래스가 많아지면 구조가 복잡해질 수 있습니다.
  • 상위 클래스에 알고리즘이 고정되어 있어 유연성이 떨어질 수 있습니다.

6. 결론

템플릿 메서드 패턴은 알고리즘의 큰 틀을 상위 클래스에서 정의하고, 세부 구현은 하위 클래스에서 맡게 하는 구조입니다. Java의 AbstractList와 같은 실제 사례를 통해 중요성과 사용법을 이해하면, 다양한 상황에서 효율적으로 활용할 수 있습니다.

반응형

'JAVA > JAVA Design Pattern' 카테고리의 다른 글

JAVA 비지터(Visitor) 패턴  (0) 2025.01.05
JAVA 상태(State) 패턴  (0) 2025.01.04
JAVA 커맨드 패턴(Command Pattern)  (0) 2025.01.02
JAVA 옵저버(Observer) 패턴  (0) 2025.01.01
JAVA 전략(Strategy) 패턴  (0) 2024.12.30