Java Annotations(어노테이션)

이진호·2022년 9월 8일
0

JAVA

목록 보기
9/10
post-thumbnail

어노테이션(annotaions)은 프로그램에 추가 정보를 제공하는데 사용됩니다.

  • '@'로 시작합니다.
  • 컴파일 완료 이후의 프로그램의 동작을 변경하지 않습니다.
  • 메타데이터(정보)를 프로그램의 요소(예: 인스턴스 변수, 생성자, 메서드, 클래스 등)에 연결하는데 도움이 됩니다.
  • 컴파일러에서 프로그램을 처리하는 방식을 변경할 수 있다는 점에서, 순수한 주석과는 다릅니다.
  • 기본적으로 추가 정보를 제공하는데 사용되므로 XML 및 Java 마커 인터페이스의 대안이 될 수 있습니다.

Java Annotations(어노테이션)

어노테이션 타입 정의

어노테이션 타입 정의는 @interface를 사용하여 정의합니다.

public @interface MyAnnotation {
    String name();
    int age() default 0;
}

어노테이션은 엘리멘트(Element)라는 것을 멤버로 가질 수 있습니다. Element는 타입과 이름으로 구성되며 디폴트값을 가질 수 있습니다. 엘리먼트의 이름 뒤에는 메서드를 작성하는 것처럼 뒤에 ()를 꼭 붙여야 합니다.

@MyAnnotation(name="test")

@MyAnnotation(name="test", age=28)

기본 엘리멘트는 value이며 해당 값은 @어노테이션(값)으로 엘리멘트명을 생략할 수 있습니다.

public @interface MyAnnotation {
    String value();
}
@MyAnotation("test")

어노테이션 적용 대상

@Target 어노테이션을 사용하여 어노테이션을 적용할 수 있는 범위를 지정할 수 있습니다.

@Target(value = { ElementType.FIELD , ElementType.METHOD })
public @interface MyAnnotation {
    String value();
}

지정할 수 있는 범위는 java.lang.annotation.ElementType에 열거상수(Enum)으로 아래와 같이 정의되어있습니다.

TYPE : 클래스, 인터페이스, 열거 타입에 적용합니다.
ANNOTATION_TYPE : 어노테이션에 적용합니다.
FIELD : 필드에 적용합니다. 
CONSTRUCTOR: 생성자에 적용합니다. 
METHOD: 메서드에 적용합니다.
LOCAL_VARIABLE: 로컬 변수에 사용합니다.
PACKAGE: 패키지에 사용합니다.

어노테이션 유지정책

@Retention 어노테이션을 사용하여 사용 용도에 따라 해당 어노테이션을 소스상에만 유지할 것인지 or 컴파일된 클래스까지 유지할 것인지 or 런타임 시에도 유지할 것인지를 정의할 수 있습니다.

@Target({ ElementType.FIELD , ElementType.METHOD })
@Retention(RetentionPolicy.CLASS)
public @interface MyAnnotation {
    String value();
}

해당 정책들은 java.lang.annotation.RetentionPolicy에 열거상수(Enum)으로 아래와 같이 정의되어있습니다.

SOURCE : 소스상에서만 어노테이션을 유지. class파일로 변경된 후에는 어노테이션 정보가 유지되지 않습니다. 주로 소스 코드를 분석에 사용되는 범위입니다.
CLASS : 바이트 코드에서도 어노테이션 정보를 유지하는 것입니다. RUNTIME과는 달리 리플렉션API를 이용해서 어노테이션 정보를 얻을 수는 없습니다. 
RUNTIME : 리플렉션API를 이용해서 런타임시에도 어노테이션 정보를 얻을 수 있습니다.

Runtime시 어노테이션 정보 사용하기

java.lang.reflect.AnnotaionElement 인터페이스 내의 아래 메소드를 활용, 어노테이션 정보를 얻어 특정 작업을 수행하도록 할 수 있습니다.

isAnnotationPresent( Class<? extends Anotation> annotationClass )
: 지정한 어노테이션이 적용되었는지 여부를 boolean타입으로 리턴합니다. Class에서 호출했을 때 상위 클래스에 적용된 경우도 true를 리턴합니다.
getAnnotation( Class<T> annotationClass )
: 지정한 어노테이션이 적용되어 있으면 해당 어노테이션을 리턴하고 없을 시 null을 리턴합니다. 마찬가지로 상위 클래스에 적용되어도 같습니다.
getAnnotations()
: 적용된 모든 어노테이션을 Annotation[] 배열로 받습니다. 상위클래스도 포함합니다. 
getDelaredAnnotations()
: 상위 클래스를 제외한 직접 적용된 어노테이션 배열을 리턴합니다.

출처

0개의 댓글