클래스, 메소드, 변수 선언시에 '@'로 시작하는 태그를 붙이는 것을 의미한다. Annotation을 Metadata라고 하기도 한다. JDK 5부터 등장하였다.
어노테이션은 다음과 같은 경우에 사용한다.
미리 정해져있는 어노테이션은 딱 3개 있다.(JDK 6 기준)
해당 메소드가 부모 클래스에 있는 메소드를 Override했다는 것을 명시적으로 선언한다. 만약 잘못 Override 되었다면 컴파일러가 에러를 알려줄 수 있도록 표시해둔 것이다.
더이상 쓰이지 않는 API에 붙이는 어노테이션이다. 이 어노테이션이 붙은 API를 사용하려고 하면 컴파일러가 warning을 준다. 이제 더이상 쓰지 않는 메소드라고 그냥 삭제해버리면 기존에 그 메소드를 사용하던 프로그램들이 더이상 동작할 수 없기 때문에, 하위 호환성을 위해서 @Deprecated 어노테이션을 붙여서 남겨두는 것이다.
경고가 뜰 수 있는 코드가 포함된 메소드 위에 붙여서 컴파일러가 경고를 주지 않도록 하는 어노테이션이다.
아래 예시는 @Deprecated가 붙은 메소드를 사용하려고 할 때, 그 warning을 막는 코드이다.
@SuppressWarnings("deprecation")
메타 어노테이션은 직접 어노테이션을 선언할 때 사용한다. 메타 어노테이션은 4가지가 존재한다.
annotation을 어떤 것에 적용할지를 선언할 때 사용한다.
다음 요소들에 대해 적용 가능하다.
얼마나 오래 어노테이션 정보가 유지되는지 선언한다.
해당 어노테이션에 대한 정보가 Javadocs(API) 문서에 포함된다는 것을 선언
모든 자식 클래스에서 부모 클래스의 어노테이션을 사용할 수 있다는 것을 선언한다.
인터페이스를 선언할 때 필요한 예약어이다.
다음과 같은 .java 파일을 만들어보자
package javaonly.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
public int number();
public String text() default "This is first annotation";
}
'public int number();' 이 코드를 추가하면, number라는 필드를 int로 값을 지정해주어야한다.
ex) @CustomAnnotation(number=1)
'public String text() default "This is first annotation";' 이 부분에 의해 text도 String으로 값을 지정해주어야 하는데, 지정해주지 않으면 default 뒤에 String이 기본값이 된다. 이렇게 default 값을 지정해준 경우, 값을 지정해주지 않아도 문제가 되지 않는다.