[Java] 10. Annotation(애너테이션)
애너테이션은 인터페이스
1. 애너테이션이런?
코드에서 @가 붙어있는 키워드를 애너테이션이라고 한다. 클래스나 인터페이스를 컴파일 시에 설정 정보 및 특정 기능을 부여할 때 사용된다.
Spring 에서 웹 어플리케이션에서 애너테이션을 메서드나 클래스에 선언해서 @Controller, @Service 로 레이어층을 나누고 @Mapper나 @Repository로 데이터 계층에 접근하는 것을 볼 수 있다.
커스텀 애너테이션 같은 경우 컴파일 시 애너테이션이 선언이 되어있는 클래스나 메서드, 속성 등 데이터들에 유효성 검사와 같은 메타데이터로써 사용되며 리플렉션을 활용할 수 있다.
[참고] 애너테이션 : 주석, 메모
2. 표준 애너테이션
애너테이션 | 설명 |
---|---|
@Override | 컴파일러에게 오버라이드한 메서드라는 것을 알린다. |
@Deprecated | 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다. |
@SuppressWarnings | 컴파일러의 특정 경고 메시지를 제거하는 애너테이션으로 개발자의 의도가 있는 코드이지만 컴파일러가 이를 알지 못하고 경고를 띄울때 경고 메시지를 제거할 때 사용한다. |
@SafeVarargs | 제네릭 같은 가변인자 매개변수 사용시 경고를 무시한다. (JDK 1.7 이상) |
@FunctionalInterface | 함수형 인터페이스라는 것을 알린다. (JDK 1.8 이상) |
@Native native | 메서드에서 참조되는 상수 앞에 붙인다. (JDK 1.8) |
3. 메타 애너테이션
@Target({TYPE, FIELD, METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface MetaAnnotation {
//...
}
@MetaAnnotation //TYPE
class MetaSampleClass {
@MetaAnnotation //FIELD
int id;
@MetaAnnotation //METHOD
public int getId() {
return id;
}
}
자바에서 기본적으로 제공하는 애너테이션 메타 애너테이션(meta annotation)이다.
애너테이션 | 설명 |
---|---|
@Target | 애너테이션이 적용가능한 대상을 지정하는데 사용한다. |
@Documented | 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다. |
@Inherited | 애너테이션이 자손 클래스에 상속되도록 한다. |
@Retention | 애너테이션이 유지되는 범위를 지정하는데 사용한다. |
@Repeatable | 애너테이션을 반복해서 사용할 수 있게 한다. (JDK 1.8) |
@Target
애너테이션이 적용가능한 대상(동작 대상)을 지정한다. 만약 다른 타입이 온다면 컴파일 에러를 띄운다. ElementType이라는 enum을 통해 지정한다.
대상타입 | 의미 |
---|---|
ANNOTATION_TYPE | 애너테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드(멤버변수, enum 상수) |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입(클래스, 인터페이스, enum) |
TYPE_PARAMETER | 타입 매개변수(JDK1.8) |
TYPE_USE | 타입이 사용되는 모든 곳(JDK1.8) |
@Retention
애너테이션 유지(retention)되는 기간을 지정하는데 사용된다. 애너테이션 유지 정책(retention policy)은 종류이다.
유지정책 | 의미 |
---|---|
SOURCE | 소스 파일에만 존재, 클레스파일에는 존재하지 않음 (컴파일 전까지만 유효하며 컴파일 이후에는 사라짐) |
CLASS | 클래스 파일에 존재, 실행시에 사용불가 (Default) (컴파일러가 클래스를 참조할 때까지 유효함) |
RUNTIME | 클래스 파일에 존재. 실행시에 사용가능 (컴파일 이후 런타임 때 사용) |
유지정책을
"RUNTIME"
으로 하면, 실행 시에"리플렉션(reflection)"
을 통해 클래스 파일에 저장된 애너테이션의 정보를 읽어서 처리할 수 있다.
@Documented
애너테이션에 대한 정보가 javadoc 으로 작성한 문서에 포함되도록 한다.
@Inherited
애너테이션이 자손 클래스에 상속되도록 한다. 조상클래스에 애너테이션을 선언하면 자손클래스에도 동일하게 붙은 것으로 인식된다.
[참고]
- 자바의정석