메타 애너테이션
메타 애너테이션
- 메타 애너테이션은 '애너테이션을 위한 애너테이션'
- 메타 애너테이션은 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 애너테이션을 만들 수 있다.
'JAVA' 카테고리의 다른 글
프로세스와 쓰레드, 멀티쓰레드의 장단점 (0) | 2022.05.29 |
---|---|
애너테이션 타입 정의하기, 애너테이션의 요소 (0) | 2022.05.21 |
표준 애너테이션 (0) | 2022.05.11 |
애너테이션 (0) | 2022.05.09 |
열거형에 멤버 추가하기 (0) | 2022.05.09 |
댓글
이 글 공유하기
다른 글
-
프로세스와 쓰레드, 멀티쓰레드의 장단점
프로세스와 쓰레드, 멀티쓰레드의 장단점
2022.05.29 -
애너테이션 타입 정의하기, 애너테이션의 요소
애너테이션 타입 정의하기, 애너테이션의 요소
2022.05.21 -
표준 애너테이션
표준 애너테이션
2022.05.11 -
애너테이션
애너테이션
2022.05.09