Kotlin/포스팅

코틀린 고차 함수와 DSL

짜집퍼박사(짜박) 2024. 1. 6. 18:53

코틀린에서는 고차 함수(higher-order function)와 DSL(domain-specific language)을 사용하여 강력하고 표현력 있는 코드를 작성할 수 있습니다.

 

고차 함수 (Higher-Order Function)

고차 함수는 다른 함수를 매개변수로 받거나 함수를 반환하는 함수를 의미합니다. 이를 통해 함수를 일급 객체로 취급할 수 있어, 함수형 프로그래밍의 특징을 지원합니다.

 

매개변수로 함수 전달하기

// 람다식을 매개변수로 받는 고차 함수
fun higherOrderFunction(action: (Int, Int) -> Int): Int {
    return action(3, 5)
}

fun main() {
    // 람다식을 인자로 전달하여 호출
    val result = higherOrderFunction { a, b -> a + b }
    println(result) // 출력: 8
}

함수 반환하기

// 고차 함수
fun multiplyBy(factor: Int): (Int) -> Int {
    // 함수를 반환
    return { number -> number * factor }
}

fun main() {
    // 함수를 반환받아 사용
    val multiplyByTwo = multiplyBy(2)
    val result = multiplyByTwo(5)
    println(result) // 출력: 10
}

 

DSL (Domain-Specific Language)

DSL은 특정 도메인이나 문제 영역에 특화된 언어를 말합니다. 코틀린에서는 이러한 DSL을 쉽게 만들고 사용할 수 있습니다.

 

예제: HTML DSL

// HTML DSL을 위한 태그 클래스
class Tag(val name: String) {
    val children = mutableListOf<Tag>()
    val attributes = mutableMapOf<String, String>()

    // 중첩된 태그를 추가하는 확장 함수
    fun Tag.div(block: Tag.() -> Unit) {
        val child = Tag("div")
        child.block()
        children.add(child)
    }
}

// DSL을 사용하는 함수
fun html(block: Tag.() -> Unit): Tag {
    val root = Tag("html")
    root.block()
    return root
}

fun main() {
    // DSL을 사용하여 HTML 구조 생성
    val document = html {
        div {
            attributes["id"] = "container"
            div {
                div {
                    // 중첩된 태그
                }
            }
        }
        div {
            // 다른 레벨의 태그
        }
    }

    // 생성된 HTML 구조 출력
    println(document)
}

위의 예제에서는 HTML을 표현하기 위한 DSL을 만들었습니다. Tag 클래스는 태그의 구조를 표현하고, html 함수와 div 확장 함수를 사용하여 HTML 구조를 만듭니다.

DSL은 주로 특정 도메인에서 표현력이 높은 코드를 작성하고자 할 때 사용됩니다. 예를 들어, 안드로이드 앱에서 UI를 정의하는 DSL이나 데이터베이스 쿼리를 작성하는 DSL 등이 있습니다.

 

With ChatGPT