[kotlin] 코틀린에서의 함수형 디자인 패턴 활용 사례

함수형 프로그래밍은 불변성, 고차 함수, 람다 식 등의 기능을 중심으로 하는 프로그래밍 패러다임입니다. 코틀린은 함수형 프로그래밍을 지원하며, 다양한 함수형 디자인 패턴을 활용할 수 있습니다.

이번에는 코틀린에서 함수형 디자인 패턴을 어떻게 활용하는지에 대해 알아보겠습니다.

1. 불변성 (Immutability) 활용

코틀린은 불변성을 지향하는 언어로, val 키워드를 사용하여 변수를 선언하면 값을 재할당할 수 없게 됩니다. 이를 활용하여 함수형 디자인 패턴 중 하나인 “Unchangeable”을 구현할 수 있습니다.

예시:

data class Student(val name: String, val age: Int)

fun main() {
    val student = Student("John", 25)
    // student.name = "Mike" // 컴파일 오류, 값을 변경할 수 없음
}

2. 고차 함수 (Higher-Order Functions) 활용

코틀린은 고차 함수를 지원하여 함수를 인자로 받거나 반환할 수 있습니다. 함수형 디자인 패턴 중 “Decorator”나 “Strategy”와 같은 패턴을 구현할 때 고차 함수를 활용할 수 있습니다.

예시:

fun decorateWithBorder(text: String): String {
    return "--- $text ---"
}

fun decorateWithStars(text: String): String {
    return "*** $text ***"
}

fun decorateString(text: String, decorator: (String) -> String): String {
    return decorator(text)
}

fun main() {
    val text = "Hello, Kotlin!"
    println(decorateString(text, ::decorateWithBorder)) // --- Hello, Kotlin! ---
    println(decorateString(text, ::decorateWithStars)) // *** Hello, Kotlin! ***
}

3. 람다 식 (Lambda Expressions) 활용

람다 식은 코드 블록을 함수 인자로 전달하는 간결한 방법을 제공합니다. 이를 활용하여 함수형 디자인 패턴 중 “Lambda”를 구현할 수 있습니다.

예시:

fun List<Int>.customSum(selector: (Int) -> Int): Int {
    var sum = 0
    for (item in this) {
        sum += selector(item)
    }
    return sum
}

fun main() {
    val numbers = listOf(1, 2, 3, 4, 5)
    val sum = numbers.customSum { it * 2 }
    println("Custom sum: $sum") // Custom sum: 30
}

위 예제에서 customSum 함수는 람다 식을 활용하여 리스트의 원소에 사용자 정의 연산을 적용하는 함수형 디자인 패턴을 보여줍니다.

함수형 프로그래밍을 통해 코틀린에서 다양한 함수형 디자인 패턴을 적용할 수 있으며, 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.

이상으로 코틀린에서의 함수형 디자인 패턴 활용 사례에 대해 살펴보았습니다.