어노테이션은 클래스나 메소드 등의 선언시에 @를 사용하는 것을 말한다. 어노테이션은 영어로 Annotation이며, 메타데이터(Metadata)라고 불리기도 한다.
어노테이션은,
자바 언어에는 사용하기 위해서 정해져 있는 어노테이션은 3개가 있고, 어노테이션을 선언하기 위해 메타 어노테이션이라는 것은 4개가 있다. 하지만, 이 메타 어노테이션은 선언을 위해서 존재하기 때문에 일반적으로 사용 가능한 어노테이션은 다음의 3개 뿐이다.
해당 메소드가 부모 클래스에 있는 메소드를 Override했다는 것을 명시적으로 선언한다. Override를 할 때에는 부모 클래스에 있는 메소드의 이름과 매개 변수들을 동일하게 가져간다.
미리 만들어져 있는 클래스나 메소드가 더 이상 사용되지 않는 경우가 있다. 그런 것을 deprecated라고 하는데, 컴파일러에게 "얘는 더 이상 사용하지 않으니까 그렇게 알아줘. 그리고 나중에 누가 이거 쓰면 경고 한 번 해주고..."라고 일러 주는 것이라고 생각하면 된다.
간혹 코딩을 하다 보면 컴파일러에서 경고(Warning)를 알리는 경우가 있다. 프로그램에는 문제가 없는데, 내가 잘 알아서 하는데 이러한 경고가 나타나면 웬지 마음이 불편하기도 한다. 그럴 때 컴파일러에게 "얘는 일부러 이렇게 코딩한 거니까 니가 경고를 해 줄 필요가 없어"라고 이야기 해주는 것이다.
메타 어노테이션(Meta Annotation)이라는 것은 어노테이션을 직접 선언할 때 사용한다. 메타 어노테이션은 다음과 같이 4개가 존재한다.
어노테이션을 어떤 것에 적용할지를 선언할 때 사용한다. 적용 방법은 다음과 같다.
@Target(ElementType.METHOD)
이처럼 @Target() 괄호 안에 적용 대상을 지정하는데, 그 대상 목록은 다음과 같다.
요소 타입 | 대상 |
CONSTRUCTOR | 생성자 선언시 |
FIELD | enum 상수를 포함한 필드(field) 값 선언시 |
LOCAL_VARIABLE | 지역 변수 선언 시 |
METHOD | 메소드 선언시 |
PACKAGE | 패키지 선언시 |
PARAMETER | 매개 변수 선언시 |
TYPE | 클래스, 인터페이스, enum 등 선언시 |
얼마나 오래 어노테이션 정보가 유지되는지를 다음과 같이 선언한다.
@Retention(RetentionPolicy.RUNTIME)
@Target처럼 괄호 안에 지정하는 적용 가능한 대상은 다음과 같다.
대상 | |
SOURCE | 어노테이션 정보가 컴파일시 사라짐 |
CLASS | 클래스 파일에 있는 어노테이션 정보가 컴파일러에 의해서 참조 가능함. 하지만, 가상 머신(Virtual Machine)에서는 사라짐 |
RUNTIME | 실행시 어노테이션 정보가 가상 머신에 의해서 참조 가능 |
해당 "어노테이션에 대한 정보가 Javadocs(API) 문서에 포함된다는 것"을 선언한다.
모든 자식 클래스에서 부모 클래스의 어노테이션을 사용 가능하다는 것을 선언한다.
추가로, @interface라는 어노테이션은 어노테이션을 선언할 때 사용한다.
참고