티스토리 뷰

kotlin

[kotlin/코틀린] 어노테이션

hrniin 2023. 7. 19. 23:40
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
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함