[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

애너테이션이 자손 클래스에 상속되도록 한다. 조상클래스에 애너테이션을 선언하면 자손클래스에도 동일하게 붙은 것으로 인식된다.




[참고]

  • 자바의정석