라면을 끓이는 순서는 대체로 같다. 물을 끓이고, 면을 넣고, 스프를 넣는다. 신라면이든 짜파게티든 이 골격은 바뀌지 않는다. 달라지는 건 스프 종류나 토핑 같은 세부 과정이다.
Template Method는 이 구조를 그대로 코드로 옮긴 패턴이다.
알고리즘의 골격(순서)을 상위 클래스에서 정의하고, 세부 구현은 서브클래스에 위임하는 패턴이다. 전체 흐름은 고정되고, 변하는 부분만 서브클래스가 채운다.

// 추상 클래스 — 골격 정의
public abstract class DataProcessor {
// 템플릿 메서드 — 전체 흐름을 여기서 고정
public final void process() {
readData();
processData(); // 서브클래스마다 다름
saveData();
}
private void readData() {
System.out.println("데이터 읽기");
}
// 서브클래스가 반드시 구현해야 하는 부분
protected abstract void processData();
private void saveData() {
System.out.println("데이터 저장");
}
}
// 구체 클래스 — 달라지는 부분만 구현
public class CsvProcessor extends DataProcessor {
@Override
protected void processData() {
System.out.println("CSV 형식으로 파싱");
}
}
public class JsonProcessor extends DataProcessor {
@Override
protected void processData() {
System.out.println("JSON 형식으로 파싱");
}
}
DataProcessor csv = new CsvProcessor();
csv.process();
// 데이터 읽기
// CSV 형식으로 파싱
// 데이터 저장
DataProcessor json = new JsonProcessor();
json.process();
// 데이터 읽기
// JSON 형식으로 파싱
// 데이터 저장
process() 메서드에 final을 붙인 이유는 서브클래스가 전체 흐름 자체를 바꾸지 못하게 막기 위해서다.
반드시 오버라이드해야 하는 abstract 메서드 외에, 선택적으로 오버라이드할 수 있는 훅(Hook) 메서드를 제공할 수도 있다.
public abstract class DataProcessor {
public final void process() {
readData();
if (shouldValidate()) { // 훅 — 기본값은 true
validate();
}
processData();
saveData();
}
// 훅 메서드 — 서브클래스가 필요 시 오버라이드
protected boolean shouldValidate() {
return true;
}
protected abstract void processData();
private void readData() { System.out.println("데이터 읽기"); }
private void validate() { System.out.println("유효성 검사"); }
private void saveData() { System.out.println("데이터 저장"); }
}
// 검증이 필요 없는 경우
public class FastProcessor extends DataProcessor {
@Override
protected boolean shouldValidate() {
return false; // 검증 단계 건너뜀
}
@Override
protected void processData() {
System.out.println("빠른 처리");
}
}
Template Method와 Strategy는 비슷해 보이지만 접근 방식이 다르다.
| 구분 | Template Method | Strategy |
|---|---|---|
| 변하는 부분 처리 | 상속 — 서브클래스가 오버라이드 | 구성 — 전략 객체를 주입 |
| 알고리즘 교체 | 서브클래스를 다르게 선택 | 런타임에 전략 객체 교체 |
| 결합도 | 상위 클래스에 묶임 | 느슨하게 결합 |
Template Method는 "뼈대는 내가, 세부는 네가"라면, Strategy는 "세부 전체를 외부에서 꽂아 넣는다"는 차이다.
공통 흐름이 있고 특정 단계만 구현체마다 달라진다면 Template Method를 떠올리면 된다. 뼈대를 한번 잘 잡아두면, 세부 구현은 서브클래스에서 자유롭게 확장된다.