반응형
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 |