어노테이션은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다.
@ 기호를 앞에 붙여서 사용한다.
interface Animal {
void cry();
}
class Dog implements Animal {
@Override
public void cry() {
System.out.println("멍멍");
}
}
class Dog implements Animal {
@Deprecated
public void cry() {
System.out.println("멍멍");
}
}
@SuppressWarnings
선언한 곳의 컴파일 경고를 무시한다.
@SafeVarargs
java7 부터 지원한다.
제너릭 같은 가변인자의 매개변수를 사용할 때 경고를 무시한다.
@FunctionalInterface
java8 부터 지원한다.
함수형 인터페이스를 지정하는 어노테이션이다.
메서드가 존재 하지 않거나 1개 이상의 메서드가 존재할 경우(default 제외) 컴파일 오류를 발생시킨다.
@Retention
자바 컴파일러가 어노테이션을 다루는 방법을 기술하며 특정 시점까지 영향을 미치는지 결정한다.
RetentionPolicy.SOURCE : 컴파일 전까지만 유효
RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효
RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조 가능
@Target
어노테이션이 적용할 위치를 선택한다.
ElementType.PACKAGE : 패키지 선언
ElementType.TYPE : 타입 선언
ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElementType.CONSTRUCTOR : 생성자 선언
ElementType.FIELD : 멤버 변수 선언
ElementType.LOCAL_VARIABLE : 지역 변수 선언
ElementType.METHOD : 메서드 선언
ElementType.PARAMETER : 전달인자 선언
ElementType.TYPE_PARAMETER : 전달인자 타입 선언
ElementType.TYPE_USE : 타입 선언
@Documented
해당 어노테이션을 Javadoc에 포함시킨다.
@Inherited
어노테이션의 상속을 가능하게 한다.
@Repeatable
Java8 부터 지원한다.
연속적으로 어노테이션을 선언할 수 있게 해준다.
자바 컴파일러의 컴파일 단계에서 유저가 정의한 어노테이션의 소스코드를 분석하고 처리하기 위해 사용되는 훅이다.
컴파일 에러나 경고를 만들어 내거나 소스코드와 바이트 코드를 내보내기도 한다.