티스토리 뷰
728x90
Annotation
- 소스코드에 추가할 수 있는 메타데이터
val objects = listOf<Any>("1", "2", "3")
val s = @Suppress("UNCHECKED_CAST") objects as List<String>
- 자바와 달리 어노테이션을 식에 적용할 수 있다.
@[Synchronized Strictfp] // @Synchronized @Strictfp
fun main() { }
- 어노테이션을 여러개 붙이고 싶다면 []로 어노테이션을 감싼다.
class A @MyAnnotation constructor()
- 어노테이션을 주생성자에 적용하고 싶을 때는 명시적으로 주생성자에 constructor 키워드를 붙인다.
1. 어노테이션 정의
annotation class Dependency(val arg: String, val componentNames: String = "Core")
- 클래스 앞에 annotation이라는 변경자를 붙인다.
- 멤버, 부생성자, init이 포함될 수 없다.
- nested class, interface, object를 포함할 수 있다.
- 어노테이션의 파라미터는 항상 val로 선언해야 한다.
- 디폴트 값이나 가변 인자(vararg)를 사용할 수 있다.
- @ 구문을 사용해야만 어노테이션 인스턴스를 생성할 수 있고, 실제 어노테이션 인스턴스를 얻기 위해서는 리플렉션을 사용한다.
- Any 클래스와 Annotation 클래스를 자동으로 상속한다.
2. 어노테이션 파라미터로 사용할 수 있는 타입
- Int, Boolean, Double 등의 primitive 타입
- String
- enum
- 다른 어노테이션
- 클래스 리터럴
- 위의 타입들로 이루어진 배열
annotation class Dependency(vararg val componentNames: String)
annotation class Component(val name: String = "Core", val dependency: Dependency = Dependency())
@Component("Log", Dependency("I/O")) // 다른 어노테이션 인자에 사용
class Logger
- 다른 어노테이션의 인자로 사용하는 경우 @를 붙이지 않아도 된다.
- 일반 생성자 호출처럼 사용한다.
annotation class Dependency(val componentNames: Array<String>)
@Dependency(["I/O", "Log"])
class Main
- 어노테이션 인자로 배열이 들어가는 경우 []를 사용하여 배열을 표현할 수 있다.
- 클래스 리터럴
annotation class Dependency(vararg val componentClasses: KClass<*>) // 파라미터를 KClass 타입으로 지정
annotation class Component(val name: String = "Core", val dependency: Dependency = Dependency())
@Component("I/O")
class IO
@Component("Log", Dependency(IO::class)) // 클래스 리터럴로 인자 전달
class Logger
-
- KClass 타입의 리플렉션 객체로 클래스에 대한 표현을 얻을 수 있다.
- KClass 타입은 자바의 Class에 해당하는 코틀린 클래스다.
- ::class를 붙여서 클래스 리터럴을 만든다.
3. 사용 지점 대상
class Person(val name: String)
- 위 코드에는 생성자 파라미터와 게터, backing field가 포함되어 있다.
- 이런 요소 각각에 대해 어노테이션을 붙일 수 있다.
annotation class MyAnnotation()
class Person(@get:MyAnnotation val name: String)
- 사용 지점 대상을 지정하는 키워드
- property: 프로퍼티 자체
- field: 프로퍼티의 backing field
- get: 프로퍼티 게터
- set: 프로퍼티 세터
- param: 생성자 파라미터
- setparam: 프로퍼티 세터의 파라미터
- delegate: 위임 객체를 저장하는 필드
- receiver
- file
4. 코틀린 내장 어노테이션
- @Retention
- 어노테이션이 저장되고 유지되는 방식을 제어
- AnnotationRetentation 이넘 상수
- SOURCE: 컴파일 시점에만 존재하고, 바이너리에는 저장되지 않는다.
- BINARY: 바이너리에 저장되지만 리플렉션으로 접근할 수 없다.
- RUNTIME: 바이너리에 저장되고, 리플렉션으로 접근할 수 있다. (default)
- 식에 붙은 어노테이션은 런타임까지 유지되지 못하므로 SOURCE, BINARY만 지정할 수 있다.
- @Target
@Retention(AnnotationRetention.SOURCE)
@Target(AnnotationTarget.EXPRESSION) // 식에만 지정 가능
annotation class MyAnnotation(val text: String)
@MyAnnotation("a") // error
fun main() {
val objects = listOf<Any>("1", "2", "3")
val s = @MyAnnotation("b") objects as List<String> // ok
}
- 어노테이션을 어떤 요소에 붙일 수 있는지 지정한다.
- AnnotationTarget 이넘 상수
- CLASS: 클래스, 인터페이스, 객체
- FUNCTION: 함수 (람다, 익명 함수 포함)
- FIELD: 프로퍼티의 backing field
- TYPE: 타입 지정
- ANNOTATION_CLASS, TYPEALIAS, PROPERTY, LOCAL_VARIABLE, VALUE_PARAMETER, CONSTRUCTOR, PROPERTY_GETTER, PROPERTY_SETTER, FILE, EXPRESSION
- @Repeatable
@Repeatable
annotation class MyAnnotation(val text: String)
@MyAnnotation("a")
@MyAnnotation("b")
class A
- 하나의 요소에 어노테이션을 두 번 이상 반복 적용할 수 있다.
- @Suppress
- 컴파일러 경고를 표시하지 않게 한다.
- @Deprecated
- Message
- ReplaceWith
- DeprecationLevel: WARNING, ERROR, HIDDEN
728x90
'kotlin' 카테고리의 다른 글
[kotlin/코틀린] 연산자 오버로딩 (0) | 2023.07.19 |
---|---|
[kotlin/코틀린] 리플렉션 (0) | 2023.07.19 |
[kotlin/코틀린] 제네릭 (0) | 2023.07.19 |
[kotlin/코틀린] 컬렉션 (0) | 2023.07.19 |
[kotlin/코틀린] 클래스 계층 (0) | 2023.07.19 |