반응형

메타 애너테이션

  • 메타 애너테이션은 '애너테이션을 위한 애너테이션'
  • 메타 애너테이션은 java.lang.annotation패키지에 포함

메타 애너테이션은 "애너테이션을 위한 애너테이션"이다.
애너테이션을 만들 때 사용하는 애너테이션이다.

메타 애너테이션은 java.lang.annotation패키지에 포함되어 있다.

위의 표에있는 메타 애너테이션을 하나씩 살펴보자.

 


 

@Target

  • 애너테이션을 정의할 때, 적용대상 지정에 사용

@Target 메타 애너테이션은 애너테이션을 어디에 붙일 수 있는지를 지정할 때 사용한다.

@SuppressWarnings 애너테이션의 실제 소스코드이다.
이 애너테이션을 어디에 붙일 수 있냐면, TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE 에 붙일 수 있도록 지정되어 있다.

한가지 예를 살펴보자.

@MyAnnotation 이라는 애너테이션을 새로 만드려고 한다.
애너테이션을 만들 때는 interface앞에 @를 붙인다.
그리고 @MyAnnotation을 붙일 수 있는 대상을 FIELD, TYPE, TYPE_USE로 지정했다.
FIELD는 멤버 변수일때,
TYPE_USE는 참조변수 일때
TYPE은 클래스나 인터페이스 인 경우
@MyAnnotation을 붙여서 사용할 수 있다는 뜻이다.

이렇게 특정 애너테이션을 사용할 수 있는 적용대상을 지정할 때 @Target 메타애너테이션을 사용한다.

 


 

@Retention

  • 애너테이션이 유지(retention)되는 기간을 지정하는데 사용

@Retention 메타 애너테이션은 특정 애너테이션이 언제까지 유지되는지 기간을 지정하는데에 사용한다.

지정할 수 있는 기간정책 종류는 3가지이다.

SOURCE는 소스파일에만 존재한다. 컴파일하고난 이후인 클래스파일에는 존재하지 않는다.

RUNTIME은 클래스파일에 존재한다. 실행시에도 사용할 수 있다.

CLASS는 클래스파일을 메모리에 올려주는 classorder까지 사용할 수 있는 유지 정책이다.

 

  • 컴파일러에 의해 사용되는 애너테이션의 유지 정책은 SOURCE이다.

@Override 라는 애너테이션이 있었는데, 오버라이딩을 올바르게 했는지 체크해주는 애너테이션이다. 컴파일러를 위한 것이었다. 이것은 실행시에는 필요없다. 컴파일러가 체크하고 끝나기 때문이다.

그래서 @Retention 애너테이션이 SOURCE이다. 소스파일에만 존재하면 되기 때문이다.
@Override 애너테이션이 클래스파일에 남아있을 이유가 없기 때문이기도 하다.

 

  • 실행시에 사용 가능한 애너테이션의 정책은 RUNTIME이다.

@FunctionalInterface 애너테이션은 @Retention정책이 RUNTIME이다.
RUNTIME에만 존재하는 것이아니라, RUNTIME까지 존재하는 것이다. 즉, 클래스파일에도 존재한다.
@FunctionalInterface는 컴파일러가 함수형인터페이스를  잘 작성했는지 체크도 해주지만,
RUNTIME까지 살아서 간다. 왜냐면, 클래스파일에도 존재하기 때문이다.

 


 

@Documented, @Inherited

  • javadoc으로 작성한 문서에 포함시키려면 @Documented를 붙인다.

@Documented는 javadoc으로 작성한 문서에 포함시킬 애너테이션은 @Documented 메타 애너테이션을 붙여야한다.
우리가 사용할 일은 별로 없다.

 

  • 애너테이션을 자손 클래스에 상속하고자 할 때, @Inherited를 붙인다.

애너테이션도 상속이 가능하다.


@SuperAnno라는 애너테이션이 있는데,
이 애너테이션앞에 @Inherited 메타 애너테이션을 붙이면, 해당 애너테이션은 상속이 된다는 뜻이다.

그래서 Parent클래스에다가 @SuperAnno 애너테이션을 붙이면,
Parent클래스를 상속받은 Child 클래스에도 @SuperAnno 애너테이션이 붙은것과 같게 된다.
즉, 조상의 애너테이션이 상속된 것이다.

 


 

@Repeatable

  • 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용
  • @Repeatable 이 붙은 애너테이션은 반복해서 붙일 수 있다.

@Repeatable 메타 애너테이션은 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용한다.

@ToDo 애너테이션이 있을 때,
여기에 @Repeatable 메타 애너테이션을 적어주면,
@Todo 애너테이션을 여러번 붙일 수 있다.
하나의 대상에 해당 애너테이션을 여러번 붙일 수 있다.

 

  • @Repeatable인 @ToDo를 하나로 묶을 컨테이너 애너테이션도 정의해야 함

주의해야할 점은, @Repeatable 애너테이션만 정의하면 되는 것이 아니라,
@Todo를 하나로 묶을 컨테이너 애너테이션도 함께 정의해야 한다.

@ToDos 애너테이션을 함께 정의해서
그 안에 ToDo[] 이렇게 @ToDo 애너테이션을 배열로 담을 수 있도록 해야한다.
그래야 @Repeatable 애너테이션을 만들 수 있다.

반응형