Kotlin/포스팅

코틀린 @DslMarker

짜집퍼박사(짜박) 2024. 1. 6. 19:35

@DslMarker는 코틀린 DSL (Domain-Specific Language)을 구현할 때 사용되는 마커 애노테이션입니다. 이 애노테이션은 특정 클래스를 DSL의 일부로 표시하고, 해당 클래스의 멤버 함수들이 DSL의 일부로 간주되도록 하는 역할을 합니다.

@DslMarker 애노테이션을 사용하면 특정 클래스나 인터페이스에서만 DSL 구문을 적용하도록 제한할 수 있습니다. 이를 통해 DSL을 정의하거나 사용할 때 컴파일러가 더욱 강력한 타입 검사를 수행하도록 할 수 있습니다.

 

예제

@DslMarker
annotation class MyDslMarker

// @MyDslMarker 애노테이션이 붙은 클래스
@MyDslMarker
class MyDslBuilder {
    var name: String = ""
    var age: Int = 0

    fun build(): Person {
        return Person(name, age)
    }
}

// 사용자 클래스
class Person(val name: String, val age: Int)

// 사용 예제
fun main() {
    val person = myDsl {
        name = "John"
        age = 30
    }.build()

    println("Name: ${person.name}")
    println("Age: ${person.age}")
}

// 확장 함수를 통해 DSL 구문을 사용할 수 있는 함수
@MyDslMarker
fun myDsl(block: MyDslBuilder.() -> Unit): MyDslBuilder {
    val builder = MyDslBuilder()
    builder.block()
    return builder
}

위의 예제에서 @DslMarker 애노테이션이 MyDslMarker라는 마커 인터페이스에 적용되었습니다. 그리고 MyDslBuilder 클래스는 이 마커 인터페이스를 사용하여 DSL의 일부로 표시되었습니다.

또한 myDsl이라는 확장 함수가 마커 애노테이션과 함께 정의되었습니다. 이 함수는 MyDslBuilder 클래스의 인스턴스를 생성하고 DSL 구문을 적용하기 위해 사용됩니다.

main 함수에서는 myDsl 함수를 사용하여 DSL 구문을 작성하고, 해당 DSL을 통해 Person 객체를 생성합니다.

이렇게 하면 MyDslBuilder 클래스와 myDsl 함수를 특정 마커 애노테이션을 사용하여 DSL의 일부로 표시함으로써 해당 DSL을 좀 더 안전하게 사용할 수 있게 됩니다.

 

With ChatGPT