개발
Template Method 패턴: “뼈대는 내가 잡을게, 살은 네가 붙여”
스택큐힙리스트
2025. 7. 23. 10:29
반응형
패턴 한 줄 정의
부모 클래스가 알고리즘의 골격(Template) 을 제공하고, 세부 단계는 추상 메서드로 남겨 자식 클래스가 채우게 하는 행위 패턴. 결과적으로 공통 흐름은 재사용하고, 변하는 부분만 오버라이드해 중복을 없앤다.
언제 써야 맛이 살까?
- 동일한 작업 흐름이 여러 곳에서 쓰이지만, 부분 단계가 살짝씩 다를 때
- “프레임워크 vs 앱”처럼 제어권을 프레임워크에 두고, 개발자는 훅(hook)만 구현하도록 강제하고 싶을 때
- 테스트∙리팩터링을 위해 핵심 로직을 한 곳에 모으고 싶을 때
구조 감 잡기
- AbstractClass
templateMethod() 안에 알고리즘 순서를 고정하고, 변동 단계는 abstract fun step() 형태로 선언. - ConcreteClass
step() 구현으로 세부 동작을 정의. - 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가 더 적합
반응형