- 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것
- 예를들어, @Test는 이 메서드를 테스트해야 한다는 것을 테스트 프로그램에게 알리는 역할을 한다.
표준 애너테이션
메타 애너테이션
@Target
- 애너테이션이 적용가능한 대상을 지정하는데 사용된다.
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
@Retention
- 애너테이션이 유지(retention)되는 기간을 지정하는데 사용된다.
- SOURCE는 컴파일러가 사용하는 애너테이션을 뜻한다. 컴파일러를 직접 작성할 것이 아니면 쓸 일 없다.
- RUNTIME은 실행 시에 reflection을 통해 클래스 파일에 저장된 애너테이션 정보를 읽어서 처리할 수 있다.
- CLASS는 컴파일러가 애너테이션 정보를 클래스 파일에 저장할 수 있게는 하지만, 클래스 파일이 JVM에 로딩될 때는 애너테이션의 정보가 무시되어 실행 시에 애너테이션에 대한 정보를 얻을 수 없다. 그래서 잘 안 쓴다.
@Documented
- 애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.
@Inherited
- 애너테이션이 자손 클래스에 상속되도록 한다.
애너테이션 요소의 규칙
@interface AnnoTest {
int id = 100; // OK. 상수 선언. static final int id = 100;
String major(int i, int j); // 에러. 매개변수를 선언할 수 없음
String minor() throws Exception; // 에러. 예외를 선언할 수 없음
ArrayList<T> list(); // 에러. 요소의 타입에 타입 매개변수 사용불가