행동 - 3. Template Method

mskimdev·2026년 5월 19일

Design Pattern

목록 보기
12/13

Template Method 패턴

라면을 끓이는 순서는 대체로 같다. 물을 끓이고, 면을 넣고, 스프를 넣는다. 신라면이든 짜파게티든 이 골격은 바뀌지 않는다. 달라지는 건 스프 종류나 토핑 같은 세부 과정이다.

Template Method는 이 구조를 그대로 코드로 옮긴 패턴이다.


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을 붙인 이유는 서브클래스가 전체 흐름 자체를 바꾸지 못하게 막기 위해서다.


Hook 메서드

반드시 오버라이드해야 하는 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("빠른 처리");
    }
}

Strategy 패턴과의 차이

Template Method와 Strategy는 비슷해 보이지만 접근 방식이 다르다.

구분Template MethodStrategy
변하는 부분 처리상속 — 서브클래스가 오버라이드구성 — 전략 객체를 주입
알고리즘 교체서브클래스를 다르게 선택런타임에 전략 객체 교체
결합도상위 클래스에 묶임느슨하게 결합

Template Method는 "뼈대는 내가, 세부는 네가"라면, Strategy는 "세부 전체를 외부에서 꽂아 넣는다"는 차이다.


언제 쓰는가

  • 여러 클래스가 동일한 처리 순서를 공유하지만, 특정 단계만 다를 때
  • 중복 코드를 상위 클래스로 올려 공통화하고 싶을 때
  • 알고리즘의 전체 흐름을 서브클래스가 바꾸지 못하게 보호해야 할 때

공통 흐름이 있고 특정 단계만 구현체마다 달라진다면 Template Method를 떠올리면 된다. 뼈대를 한번 잘 잡아두면, 세부 구현은 서브클래스에서 자유롭게 확장된다.

profile
<- 개발 공부하는 나

0개의 댓글