Kotlin 어노테이션 Annotations

Kotlin 어노테이션

어노테이션은 컴파일 시 클래스, 인터페이스, 매개 변수 등에 메타데이터를 첨부하는 데 사용된다. 어노테이션은 런타임에 반영되는 컴파일러에서 사용할 수 있다. 어노테이션 값에 따라 데이터 또는 프로그램의 의미를 변경할 수 있다.

Kotlin 메타 어노테이션

어노테이션을 선언하는 동안 메타 정보를 추가할 수 있다. 다음은 몇 가지 메타 어노테이션이다:

어노테이션명 사용
@Target 이 어노테이션은 어노테이션이 적용될 수 있는 요소의 유형을 지정한다.
예를 들어, 클래스, 함수, 프로퍼티 등에 어노테이션을 적용할 수 있도록 지정할 수 있다.
@Retention 이 어노테이션은 어노테이션이 유지되는 기간을 지정한다.
Kotlin에서는 세 가지 유지 정책을 제공한다: SOURCE, BINARY, RUNTIME. SOURCE는 컴파일 후 버려지고, BINARY는 컴파일된 클래스 파일에 포함되지만 런타임 시에는 사용할 수 없으며, RUNTIME은 런타임 시에 사용 가능하다.
@Repeatable 이 어노테이션은 동일한 요소에 여러 번 적용할 수 있도록 허용한다. Kotlin 1.4부터 지원된다.
@MustBeDocumented 이 어노테이션은 문서화가 필요한 어노테이션임을 나타낸다. 즉, 이 어노테이션을 사용할 때는 반드시 문서화되어야 한다.

어노테이션 예

@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.VALUE_PARAMETER, AnnotationTarget.EXPRESSION)
@Retention(AnnotationRetention.SOURCE)
@MustBeDocumented
annotation class MyAnnotation

어노테이션 만들기

어노테이션은 클래스 앞에 어노테이션 수정자 작성하면 된다.

annotation class MyAnnotation  

생성자에 어노테이션 선언

클래스의 생성자에 어노테이션을 지정 할 수 도 있다. 생성자 선언에 생성자 키워드를 추가하고 그 앞에 어노테이션을 작성하면 된다.

Kotlin에서 생성자에 어노테이션을 선언하는 방법은 주로 주요 생성자(primary constructor)에 적용된다. 다음은 생성자에 어노테이션을 선언하는 예제이다:

class MyClass @Inject constructor() {
    // 클래스 내용
}

위의 예제에서 @Inject 어노테이션은 클래스의 생성자에 적용되었다. 이 경우 MyClass의 주요 생성자가 @Inject 어노테이션으로 처리되었다.

생성자의 매개변수에 어노테이션을 사용할 수도 있다:

class MyClass {
    constructor(@SomeAnnotation parameter: String) {
        // 생성자 내용
    }
}

위의 예제에서 parameter 매개변수에 @SomeAnnotation 어노테이션이 적용되었다.

Property의 accessor 어노테이션 선언

class MyClass{  
    var parameter: String? = null
        @Inject set  
}  

어노테이션 만들때, 생성자를 사용

어노테이션 만들때, 생성자를 사용할 수도 있다. 생성자를 어노테이션으로 사용하려면 매개변수가 필요하다.

annotation class MyClass(val parameter: String)

@MyClass("parameter")
class Foo {
    // ...
}

어노테이션으로 사용되는 매개변수는 nullable 유형이 될 수 없다. 이는 JVM이 어노테이션 속성의 값으로 널을 지원하지 않기 때문이다.

또한, 하나의 어노테이션을 다른 어노테이션의 매개 변수로 사용할 수 있지만, 이 경우 접두사 @ 문자를 넣지 않아야 한다:

annotation class ReplaceWith(val expression: String)

annotation class Deprecated(
    val message: String,
    val replaceWith: ReplaceWith = ReplaceWith(""), // @를 넣지 않았다.
)

@Deprecated("This function is deprecated, use === instead", ReplaceWith("this === other"))
class Foo2 {
    // ...
}

또한, Kotlin의 KClass를 사용하여 클래스가 어노테이션의 매개변수로 지정하면, Kotlin 컴파일러는 이를 자바 클래스로 자동 변환하여 어노테이션과 인수를 정상적으로 볼 수 있도록 한다.

import kotlin.reflect.KClass

annotation class MyClass(val arg1: KClass<*>, val arg2: KClass<out Any>)

@MyClass(String::class, Int::class)
class Foo

TYPE 어노테이션 사용

자바 어노테이션 인터페이스 Ann.java 생성한다:

package basic.annotations.ex5;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface Ann {
    int value();
}

Ann 어노테이션 인터페이스를 사용하는 MyClass.kt 클래스를 만든다.

@Ann(value = 10)
class MyClass {
    // ...
}

fun main(args: Array<String>) {
    val clazz = MyClass()
    val x = clazz.javaClass.getAnnotation(Ann::class.java)
    if (x != null) {
        println("Value:" + x?.value)
    }
}

Output:

Value: 10



최종 수정 : 2024-03-03