본문 바로가기

두두의 IT

[Kotlin] annotation class

728x90

[Annotation]

  • 메타데이터 ( 부가기능 )을 코드에 비침투적으로 추가할 수 있는 수단
  • 멤버 변수, 함수, 클래스 등 다양한 곳에 위치 시킬 수 있으며 또한 다양한 기능을 가진 다양한 어노테이션이 있음

 

[기본적인 선언 및 사용방법]

아래 코드는 Test이라는 어노테이션을 제작한 것이며 @Test으로 사용할 수 있습니다.

여기에 기능을 추가하기 위해서는 AOP를 이용할 수도 있으며 reflection을 이용하여 Annotation을 체크 후 기능을 만들어 줄 수도 있습니다.

annotation class Test

 

[추가 속성]

추가 속성은 어노테이션 위에 또 다른 어노테이션을 달아주는 것입니다. 추가 속성의 대표적인 예는 아래와 같습니다.

  • @Target : 어노테이션을 달 수 있는 구성 요소 선정
    • 타겟에 선언되지 않고 해당 타켓에 사용하면 정상적으로 동작하지 않을 수 있습니다.
    • AnnotationTarget enum 클래스 활용
  • @Retention : 어노테이션이 남아있는 단계를 선정합니다.
    • 소스(SOURCE), 컴파일 타임(BINARY), 런타임(RUNIME) 중 선택 가능
    • 런타임으로 선언하면 런타임중에 어노테이션 정보가 남아있습니다. 그렇지 않으면 어노테이션 정보는 지워집니다.
    • AnnotationRetention enum 클래스 활용

이런 추가 속성 어노테이션은 아래처럼 사용할 수 있습니다.

//@Target(AnnotationTarget.CLASS)
//@Retention(AnnotationRetention.RUNTIME)
//annotation class Test


@Target public final annotation class Test public constructor() : kotlin.Annotation {
}

 

[사용하는 곳]

코틀린에서 어노테이션을 사용할 수 있는 타입은 AnnotationTarget enum 클래스에 정의되어 있다고 말씀드렸습니다. 설정 가능한 곳은 아래와 같습니다.

  • 클래스
  • 어노테이션 클래스
  • 프로퍼티 ( 멤버변수 )
  • 필드 ( 프로퍼티의 백킹 필드 포함 )
  • 지역변수
  • 값 파라미터
  • 생성자
  • 함수
  • 게터 (Getter)
  • 세터 (Setter)
  • 표현식 (Expression)

'두두의 IT' 카테고리의 다른 글

[Kotlin] operator  (0) 2022.04.11
[OOP] 추상클래스와 인터페이스  (0) 2022.04.11
[OOP] 접근지정자(Access Specifier)  (0) 2022.04.11
[Kotlin] enum class  (0) 2022.04.11
[Java, Kotlin] final / open  (0) 2022.04.11