반응형
Notice
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 데이터분석
- 보안
- 데이터과학
- 딥러닝
- I'm Sorry
- springboot
- 소프트웨어공학
- Yes
- 컴퓨터공학
- 자바스크립트
- 네트워크
- 프로그래밍언어
- 디자인패턴
- 빅데이터
- 머신러닝
- 사이버보안
- 데이터구조
- 데이터베이스
- 네트워크보안
- 웹개발
- 인공지능
- 자료구조
- 프로그래밍
- 파이썬
- 클라우드컴퓨팅
- 알고리즘
- 소프트웨어
- 컴퓨터과학
- 버전관리
- 컴퓨터비전
Archives
- Today
- Total
스택큐힙리스트
Template Method 패턴: “뼈대는 내가 잡을게, 살은 네가 붙여” 본문
반응형
패턴 한 줄 정의
부모 클래스가 알고리즘의 골격(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가 더 적합
반응형
'개발' 카테고리의 다른 글
프론트엔드와 API 통합 테스트 전략 (2) | 2025.07.23 |
---|---|
자바 스프링 개발 시작하기 - 15일차 실전 프로젝트 완주 (0) | 2025.07.23 |
State 패턴: if-else 없이 굴러가는 ‘상태 머신’의 힘 (1) | 2025.07.23 |
Spring Boot 실시간 채팅 서버 만들기 — WebSocket + STOMP, 하트비트까지 완전 정복 (1) | 2025.07.23 |
SSE vs WebSocket, 언제 써야 빛을 볼까? (4) | 2025.07.22 |
Comments