충분히 쌓여가는
메타 애너테이션 본문
메타 애너테이션
애너테이션을 위한 애너테이션
java.lang.annotation 패키지에 포함
애너테이션 | 설명 |
@Target | 애너테이션이 적용가능한 대상을 지정하는데 사용한다 |
@Documented | 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다 |
@Inherited | 애너테이션이 자손 클래스에 상속되도록 한다 |
@Retention | 애너테이션이 유지되는 범위를 지정하는데 사용한다 |
@Repeatable | 애너테이션을 반복해서 적용할 수 있게 한다 |
@Target
애너테이션을 정의할 때, 적용대상 지정에 사용
@Target ({ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE } )
@Retention(RetentionPolicy.SOURCE)
public @Interface SuppressWarnings {
String[] value();
}
대상 타입 | 의미 |
ANOOTATION_TYPE | 애너테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드(멤버변수, enum 상수) |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입(클래스, 인터페이스, enum) |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든 곳 |
코드
import static java.lang.annotation.ElementType.*;
@Target({FIELD, TYPE, TYPE_USE}) // 적용대상이 FIELD, TYPE, TYPE_USE
public @interface MyAnnotation { } // MyAnnotation을 정의
@MyAnnotation // 적용대상이 TYPE인 경우
class MyClass {
@MyAnnotation // 적용대상이 FIELD인 경우
int i;
@MyAnnotation // 적용대상이 TYPE_USE인 경우
MyClass mc;
}
@Retention
애너테이션이 유지(retention)되는 기간을 지정하는데 사용
유지 정책 | 의미 |
SOURCE | 소스 파일에만 존재, 클래스 파일에는 존재하지 않음 |
CLASS | 클래스 파일에 존재, 실행 시에 사용불가, 기본값 |
RUNTIME | 클래스 파일에 존재, 실행 시에 사용가능 |
컴파일러에 의해 사용되는 애너테이션의 유지 정책은 SOURCE
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {}
실행 시에 사용 가능한 애너테이션의 정책은 RUNTIME
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}
@Documented
javadoc으로 작성한 문서에 포함시키려면 @Documented를 붙인다
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}
@Inherited
애너테이션을 자손 클래스에 상속하고자 할 때, @Inherited를 붙인다
@Inherited // @SuperAnno가 자손까지 영향 미치게
@interface SuperAnno {}
@SuperAnno
class Parent{}
class Child extends Parent {} // Child에 애너테이션이 붙은 것으로 인식
@Repeatable
반복해서 붙일 수 있는 애터네이션을 정의할 때 사용
@Repeatable(ToDos.class) // ToDo 애너테이션을 여러 번 반복해서 쓸 수 있게 한다
@interface ToDo {
String value();
}
@Repeatable이 붙은 애너테이션은 반복해서 붙일 수 있다
@ToDo("delete test codes.")
@ToDo("override inherited methods")
class MyClass {
...
}
@Repeatable인 @ToDo를 하나로 묶을 컨테이너 애너테이션도 정의해야 함
@interface ToDos { // 여러 개의 ToDo 애너테이션을 담을 컨테이너 애너테이션 ToDos
ToDo[] value(); // ToDo 애너테이션 배열타입의 요소를 선언, 이름이 반드시 value이어야 함
}
'Java > JAVA3' 카테고리의 다른 글
thread 쓰레드 (0) | 2023.08.02 |
---|---|
애너테이션 타입 정의하기, 애너테이션의 요소 (0) | 2023.08.01 |
Annotation(애너테이션) @ (0) | 2023.07.31 |
열거형에 멤버 추가하기 (0) | 2023.07.31 |
열거형(enum) (0) | 2023.07.30 |