스택큐힙리스트

Template Method 패턴: “뼈대는 내가 잡을게, 살은 네가 붙여” 본문

개발

Template Method 패턴: “뼈대는 내가 잡을게, 살은 네가 붙여”

스택큐힙리스트 2025. 7. 23. 10:29
반응형

패턴 한 줄 정의

부모 클래스가 알고리즘의 골격(Template) 을 제공하고, 세부 단계는 추상 메서드로 남겨 자식 클래스가 채우게 하는 행위 패턴. 결과적으로 공통 흐름은 재사용하고, 변하는 부분만 오버라이드해 중복을 없앤다.


언제 써야 맛이 살까?

  • 동일한 작업 흐름이 여러 곳에서 쓰이지만, 부분 단계가 살짝씩 다를 때
  • “프레임워크 vs 앱”처럼 제어권을 프레임워크에 두고, 개발자는 훅(hook)만 구현하도록 강제하고 싶을 때
  • 테스트∙리팩터링을 위해 핵심 로직을 한 곳에 모으고 싶을 때

구조 감 잡기

  1. AbstractClass
    templateMethod() 안에 알고리즘 순서를 고정하고, 변동 단계는 abstract fun step() 형태로 선언.
  2. ConcreteClass
    step() 구현으로 세부 동작을 정의.
  3. Hook
    반드시 구현할 필요 없는 선택적(빈) 메서드로, 자식이 필요할 때만 오버라이드.

Kotlin 예제 – 보고서 생성 과정

abstract class ReportGenerator {

    fun generate(): String {           // Template Method
        val header = buildHeader()
        val body = buildBody()         // 변동 단계
        val footer = buildFooter()
        return "$header\n$body\n$footer"
    }

    protected open fun buildHeader() = "=== 보고서 시작 ==="
    protected abstract fun buildBody(): String
    protected open fun buildFooter() = "=== 끝 ==="
}

class SalesReport : ReportGenerator() {
    override fun buildBody(): String =
        "이번 달 매출: ₩10,200,000\n환불: ₩300,000"
}

class InventoryReport : ReportGenerator() {
    override fun buildBody(): String =
        "재고 현황\n- 상품A: 120개\n- 상품B: 45개"
}

// 사용
fun main() {
    println(SalesReport().generate())
    println(InventoryReport().generate())
}

Template Method generate() 는 절대 바뀌지 않지만, 본문(buildBody)만 자식이 자유롭게 갈아끼워 서로 다른 보고서를 만든다.


장점 & 주의할 점

  • 장점
    • 코드 중복 감소: 공통 흐름 단일화
    • 변경 영향 최소: 새 변형이 필요해도 자식 클래스만 추가
    • 제어 역전: 프레임워크·SDK 만들 때 강력한 가이드 레일 제공
  • 주의
    • 상속 남용 위험: 계층이 깊어지면 구조 파악이 어려워짐
    • 메서드 순서 고정: 런타임에 알고리즘 흐름을 바꿀 수 없으므로, 동적 교체가 필요하면 Strategy가 더 적합
반응형
Comments