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