참치코더의 꿈 메모장

메타 애너테이션(Annotation) - Java - 2021/08/31 본문

JAVA

메타 애너테이션(Annotation) - Java - 2021/08/31

참치깡 2021. 8. 31. 20:28
728x90

메타 애너테이션

 

매타 애너테이션은 애너테이션에 붙이는 애너테이션으로 애너테이션을 정의할 때 

애너테이션의 적용대상(target) 이나 유지기간(retention) 등을 지정하는데 사용된다.

 

@Target

 

애너테이션이 적용가능한 대상을 지정하는데 사용된다.

 

* 여러 개의 값을 지정할 때는 배열에서처럼 괄호{ }를 사용해야한다.

 

@Target : 애너테이션 적용대상의 종류

ANNOTATION_TYPE 애너테이션
CONSTRUCTOR 생성자
FIELD 필드(멤버변수, enum상수)
LOCAL_VARIABLE 지역변수
METHOD 메서드
PACKAGE 패키지
PARAMETER 매개변수
TYPE 타입(클래스, 인터페이스, enum)
TYPE_PARAMETER 타입 매개변수
TYPE_USE 타입이 사용되는 모든 곳

 

@Retention

 

애너테이션이 유지되는 기간을 지정하는데 사용된다.

 

SOURCE 소스 파일에만 존재. 클래스파일에는 존재하지 않음.
CLASS 클래스 파일에 존재. 실행시에 사용불가. 기본값 
RUNTIME 클래스 파일에 존재. 실행시에 사용가능.

 

컴파일러가 사용하는 애너테이션은 유지 정책이 SOURCE이다. 

 

유지 정책을 RUNTIME으로 하면 실행 시에 리플렉션을 통해 클래스 파일에 저장된 

애너테이션의 정보를 읽어서 처리할 수 있다.

 

유지 정책 CLASS는 컴파일러가 애너테이션의 정보를 클래스파일에 저장할 수 있게는 하지만,

클래스 파일이 JVM에 로딩될 때는 애너테이션의 정보가 무시되어 실행 시에 애너테이션에 대한 정보를 얻을 수 없다.

 

@Documented

 

애너테이션에 대한 정보가 javadoc으로 작성된 문서에 포함되도록 한다.

 

 

@Inherited

 

애너테이션이 자손 클래스에 상속되도록 한다. @Inherited가 붙은 애너테이션을 조상 클래스에 붙이면,

자손클래스도 이 애너테이션이 붙은 것과 같이 인식된다.

 

@Repeatable

 

보통은 하나의 대상에 한 종류의 애너테이션을 붙이는데,  @Repeatable이 붙은 애너테이션은 여러 번 붙일 수 있다.

 

일반적인 애너테이션과 달리 같은 이름의 애너테이션이 여러 개가 하나의 대상에 적용될수 있기 때문에,

이 애너테이션들을 하나로 묶어서 다룰 수 있는 애너테이션도 추가로 정의해야 한다.

 

@Native

네이티브 메서드에 의해 참조되는 상수 필드에 붙이는 애너테이션이다.

 

* 네이티브 메서드 : JVM이 설치된 OS의 메서드를 말한다.

* 모든 클래스의 조상인 Object클래스의 메서드들은 대부분 네이티브 메서드이다.

 

애너테이션 만들기

 

@interface 애너테이션이름 {

        타입 요소이름( );

   }

 

* 애너테이션 내에 선언된 메서드를 애너테이션의 요소라고 한다.

 

애너테이션의 요소는 반환값이 있고, 매개변수는 없는 추상 메서드의 형태를 가지고, 

상속을 통해 구현하지 않아도 된다.

 

그러나 애너테이션을 적용할 때 이 요소들의 값을 빠짐없이 지정해 주어야 한다.

 

* 요소의 이름도 같이 적어주므로 순서는 상관없다.

* 애너테이션의 각 요소는 기본값을 가질 수 있으며, 기본값이 있는 요소는 애너테이션을 적용할 때

  값을 지정하지 않으면 기본값이 사용된다.

* 애너테이션 요소가 오직 하나뿐인 경우, 애너테이션을 적용할 때 요소의 이름을 생략하고

  값만 적어도 된다.

 

java.lang.annotation.Annotation

 

모든 애너테이션의 조상은 Annotation이다.

그러나 상속이 허용되지 않으므로 명시적으로 Annotation을 조상으로 지정할 수 없다.

 

마커 애너테이션 (Marker Annotation)

 

값을 지정할 필요가 없는 경우, 애너테이션의 요소를 하나로 정의하지 않을 수 있다.

요소가 하나도 정의되지 않은 애너테이션을 마커 애너테이션이라고 한다. 

 

애너테이션 요소의 규칙

1. 요소의 타입은 기본형, String, enum, 애너테이션, Class만 허용된다.

2. ( )안에 매개변수를 선언할 수 없다.

3. 예외를 선언할 수 없다.

4. 요소를 타입 매개변수로 정의할 수 없다.

 

 

728x90
Comments