PHpullh
학습 라이브러리/Kotlin/함수형 파이프라인

KOTLIN · 함수형

함수형 파이프라인

데이터 변환을 파이프라인으로 구성하여 선언적으로 처리합니다. 각 단계가 독립적이어서 테스트와 재사용이 용이합니다.

함수형고급pipelinedata-processingdeclarativelet-chain

핵심 설명

데이터 변환을 파이프라인으로 구성하여 선언적으로 처리합니다. 각 단계가 독립적이어서 테스트와 재사용이 용이합니다.

Kotlin code

data class RawRecord(val name: String, val score: String, val dept: String)
data class ValidRecord(val name: String, val score: Int, val dept: String)
data class Report(val dept: String, val avg: Double, val count: Int)

// 파이프라인 단계들 (각각 순수 함수)
val parse: (List<String>) -> List<RawRecord> = { lines ->
    lines.map { line ->
        val (n, s, d) = line.split(",")
        RawRecord(n.trim(), s.trim(), d.trim())
    }
}

val validate: (List<RawRecord>) -> List<ValidRecord> = { records ->
    records.mapNotNull { r ->
        r.score.toIntOrNull()?.let { ValidRecord(r.name, it, r.dept) }
    }
}

val aggregate: (List<ValidRecord>) -> List<Report> = { records ->
    records.groupBy { it.dept }.map { (dept, recs) ->
        Report(dept, recs.map { it.score }.average(), recs.size)
    }
}

val format: (List<Report>) -> String = { reports ->
    reports.sortedByDescending { it.avg }
        .joinToString("
") { "${it.dept}: 평균 %.1f (${it.count}명)".format(it.avg) }
}

fun main() {
    val data = listOf("김철수,85,개발", "이영희,92,마케팅", "박지성,88,개발", "최유리,invalid,인사")

    // 파이프라인 실행
    val result = data.let(parse).let(validate).let(aggregate).let(format)
    println(result)
}

학습 팁

각 단계를 독립 함수로 분리하면 단위 테스트가 쉽고, 단계를 교체하거나 재배치할 수 있습니다.

주의할 점

파이프라인이 길어지면 중간 타입을 추적하기 어렵습니다. 각 단계의 입출력 타입을 명시적으로 선언하여 가독성을 유지하세요.

자주 묻는 질문

함수형 파이프라인란 무엇인가요?

데이터 변환을 파이프라인으로 구성하여 선언적으로 처리합니다. 각 단계가 독립적이어서 테스트와 재사용이 용이합니다.

함수형 파이프라인 학습 시 주의할 점은 무엇인가요?

파이프라인이 길어지면 중간 타입을 추적하기 어렵습니다. 각 단계의 입출력 타입을 명시적으로 선언하여 가독성을 유지하세요.