@Target(ElemenType.METHOD) @Retention(RetentionPolicy.SOURCE) public @interface Override {}
유지정책 class는 컴파일러가 애너테이션의 정보를 클래스 파일에 저장할 수 있게는 하지만, 클래스 파일이 JVM에 로딩될 때는 애너테이션의 정보가 무시되어 실행 시에 애너테이션에 대한 정보를 얻을 수 없다. 이것이 CLASS가 유지정책의 기본값임에도 불구하고 잘 사용되지 않는 이유다.
🌱 @Documented, @Inherited
@Documented : 애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되어 있다. 기본 애너테이션 중 @Override와 @SuppressWarnings를 제외하고는 모두 이 메타 애너테이션이 붙어 있다.
@Documented @Retention(RetentionPolicy.RUNTIME) public @interface FunctionalInterface {}
@Inherited : 애너테이션이 자손 클래스에 상속되도록 한다. @Inherited가 붙은 애너테이션을 조상 클래스에 붙이면, 자손 클래스도 이 애너테이션을 붙은 것과 같이 인식된다.
@Inherited // @SuperAnno가 자손까지 영향 미치게 @interface SuperAnno {}
@SuperAnno class Parent {}
class Child extends Parent {} // Child가 애너테이션이 붙은 것으로 인식
🌱 @Repeatable
보통은 하나의 대상에 한 종류의 애너테이션을 붙이는데, @Repeatable이 붙은 애너테이션은 여러번 붙일 수 있다.
@Repeatable(ToDos.class) // ToDo애너테이션을 여러번 반복해서 쓸 수 있게 한다. @interface ToDo { String value(); }
이 애너테이션은 하나로 묶어서 다룰 수 있는 애너테이션도 추가로 정의해야한다.
@interface Todos { // 여러개의 ToDo애너테이션을 담을 컨테이너 애너테이션 ToDos Todo[] value(); // ToDo애너테이션 배열타입의 요소를 선언. 이름이 반드시 value이어야 함. }
@Repeatable(ToDos.class) // 괄호 안에 컨테이너 애너테이션을 지정해 줘야한다. @interface ToDo { String value(); }