코틀린에서는 자바와 같은 방법으로 애노테이션을 사용할 수 있다. 애노테이션을 적용하려는 대상 앞에 애노테이션을 붙이면 된다. 함수나 클래스 등 여러 다른 코드 구성 요소에 붙일 수 있다.
@Deprecated
애노테이션자바와 코틀린에서 @Deprecated
의 의미는 똑같다. 하지만 코틀린에서는 replaceWith 파라미터를 통해 옛버전을 대신할 수 있는 패턴을 제시할 수 있고, API 사용자는 그 패턴을 보고 지원이 종료될 API 기능을 더 쉽게 새 버전으로 포팅할 수 있다.
@Deprecated("Use removeAt(index) instead.", ReplaceWith("removeAt(index"))
fun remove(index: Int) { }
애노테이션에 인자를 넘길 때는 일반 함수와 마찬가지로 괄호 안에 인자를 넣는다.
애노테이션의 인자로는 원시 타입의 값, 문자열, enum, 클래스 참조, 다른 애노테이션 클래스, 그리고 지금까지 말한 요소들로 이뤄진 배열이 들어갈 수 있다.
애노테이션 인자를 지정하는 문법은 자바와 약간 다르다.
@MyAnnotation(Myclass::class)
처럼 ::class를 클래스 이름 뒤에 넣어야 한다.@RequestMapping(path = arrayOf("/foo", "/bar"))
처럼 arrayOf 함수를 사용한다. 자바에서 선언한 애노테이션 클래스를 사용한다면 value라는 이름의 파라미터가 필요에 따라 자동으로 가변 길이 인자로 변환된다. 따라서 그런 경우에는 @JavaAnnotationWithArrayValue("abc", "foo", "bar")
처럼 arrayOf 함수를 쓰지 않아도 된다.애노테이션 인자를 컴파일 시점에 알 수 있어야 한다. 따라서 임의의 프로퍼티를 인자로 지정할 수는 없다. 프로퍼티를 애노테이션 인자로 사용하려면 그 앞에 const 변경자를 붙여야 한다. 컴파일러는 const가 붙은 프로퍼티를 컴파일 시점 상수로 취급한다.
다음은 JUnit의 @Test
애노테이션에 timeout 파라미터를 사용해 밀리초 단위로 타임아웃 시간을 지정하는 예다.
const val TEST_TIMEOUT = 100L
@Test(timeout = TEST_TIMEOUT) fun testMethod() { ... }
const가 붙은 프로퍼티는 파일의 맨 위나 object 안에 선언해야 하며, 원시 타입이나 String으로 초기화해야만 한다.
[TODO: 작성 중] ParameterizedTest에서 MethodSource의 인자로 전달하는 함수에 JvmStatic을 선언했었는데,
코틀린 소스코드에서 한 선언을 컴파일한 결과가 여러 자바 선언과 대응하는 경우가 자주 있다. 그리고 이때 코틀린 선언과 대응하는 여러 자바 선언에 각각 애노테이션을 붙여야 할 때가 있다.