PHpullh
학습 라이브러리/Kotlin/템플릿 메서드 패턴 (Template Method)

KOTLIN · 디자인패턴

템플릿 메서드 패턴 (Template Method)

알고리즘의 골격을 정의하고 세부 단계를 하위 클래스에서 구현합니다. 훅 메서드로 선택적 확장도 지원합니다.

디자인패턴고급template-methodabstracthookalgorithm-skeleton

핵심 설명

알고리즘의 골격을 정의하고 세부 단계를 하위 클래스에서 구현합니다. 훅 메서드로 선택적 확장도 지원합니다.

Kotlin code

abstract class DataExporter(val name: String) {
    // 템플릿 메서드
    fun export(data: List<Map<String, Any>>): String {
        val filtered = filterData(data)
        val header = formatHeader(filtered.first().keys.toList())
        val body = filtered.map { formatRow(it) }
        val result = combine(header, body)
        onExportComplete(result)  // 훅
        return result
    }

    abstract fun formatHeader(columns: List<String>): String
    abstract fun formatRow(row: Map<String, Any>): String

    open fun filterData(data: List<Map<String, Any>>) = data // 훅: 기본은 필터 없음
    open fun combine(header: String, rows: List<String>) = (listOf(header) + rows).joinToString("
")
    open fun onExportComplete(result: String) {} // 훅
}

class CsvExporter : DataExporter("CSV") {
    override fun formatHeader(columns: List<String>) = columns.joinToString(",")
    override fun formatRow(row: Map<String, Any>) = row.values.joinToString(",")
}

class MarkdownExporter : DataExporter("Markdown") {
    override fun formatHeader(columns: List<String>) =
        "| ${columns.joinToString(" | ")} |
| ${columns.map { "---" }.joinToString(" | ")} |"
    override fun formatRow(row: Map<String, Any>) = "| ${row.values.joinToString(" | ")} |"
    override fun onExportComplete(result: String) { println("[MD] 내보내기 완료 (${result.length}자)") }
}

fun main() {
    val data = listOf(
        mapOf("이름" to "김철수", "점수" to 85),
        mapOf("이름" to "이영희", "점수" to 92),
    )
    println(CsvExporter().export(data))
    println("---")
    println(MarkdownExporter().export(data))
}

학습 팁

훅 메서드(open fun)는 기본 구현을 제공하여 하위 클래스가 선택적으로 오버라이드할 수 있습니다.

주의할 점

템플릿 메서드에서 추상 메서드가 너무 많으면 구현 부담이 커집니다. 핵심 단계만 추상화하고 나머지는 훅으로 제공하세요.

자주 묻는 질문

템플릿 메서드 패턴 (Template Method)란 무엇인가요?

알고리즘의 골격을 정의하고 세부 단계를 하위 클래스에서 구현합니다. 훅 메서드로 선택적 확장도 지원합니다.

템플릿 메서드 패턴 (Template Method) 학습 시 주의할 점은 무엇인가요?

템플릿 메서드에서 추상 메서드가 너무 많으면 구현 부담이 커집니다. 핵심 단계만 추상화하고 나머지는 훅으로 제공하세요.