PHpullh
학습 라이브러리/Kotlin/타입 안전 빌더 (Type-Safe Builders)

KOTLIN · 함수

타입 안전 빌더 (Type-Safe Builders)

수신 객체가 있는 람다를 활용하여 타입 안전한 빌더 패턴을 구현합니다. HTML, SQL, UI 등 구조적 DSL에 활용됩니다.

함수고급type-safe-builderdslreceiver-lambdaapply

핵심 설명

수신 객체가 있는 람다를 활용하여 타입 안전한 빌더 패턴을 구현합니다. HTML, SQL, UI 등 구조적 DSL에 활용됩니다.

Kotlin code

class Html {
    private val children = mutableListOf<String>()

    fun head(init: Head.() -> Unit) {
        children += Head().apply(init).render()
    }
    fun body(init: Body.() -> Unit) {
        children += Body().apply(init).render()
    }
    fun render() = "<html>
${children.joinToString("
")}
</html>"
}

class Head {
    var title = ""
    fun render() = "  <head><title>$title</title></head>"
}

class Body {
    private val elements = mutableListOf<String>()
    fun h1(text: String) { elements += "    <h1>$text</h1>" }
    fun p(text: String)  { elements += "    <p>$text</p>" }
    fun render() = "  <body>
${elements.joinToString("
")}
  </body>"
}

fun html(init: Html.() -> Unit) = Html().apply(init).render()

fun main() {
    val page = html {
        head { title = "Kotlin DSL" }
        body {
            h1("환영합니다")
            p("타입 안전 빌더 예제입니다")
        }
    }
    println(page)
}

학습 팁

@DslMarker 어노테이션을 사용하면 중첩된 빌더에서 바깥 스코프의 함수 호출을 제한할 수 있습니다.

주의할 점

빌더 내에서 바깥 스코프의 메서드가 의도치 않게 호출될 수 있습니다. @DslMarker를 적용하여 스코프를 제한하세요.

자주 묻는 질문

타입 안전 빌더 (Type-Safe Builders)란 무엇인가요?

수신 객체가 있는 람다를 활용하여 타입 안전한 빌더 패턴을 구현합니다. HTML, SQL, UI 등 구조적 DSL에 활용됩니다.

타입 안전 빌더 (Type-Safe Builders) 학습 시 주의할 점은 무엇인가요?

빌더 내에서 바깥 스코프의 메서드가 의도치 않게 호출될 수 있습니다. @DslMarker 를 적용하여 스코프를 제한하세요.