애노테이션

목표


  • 자바의 애노테이션에 대해 학습하세요.

학습할 것


  • 애노테이션 정의하는 방법
  • @retention
  • @target
  • @documented
  • 애노테이션 프로세서

애노테이션 정의하는 방법


애노테이션은 소스코드 안에 문서화를 하는 기법을 응용해, 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시키는 것입니다.

애노테이션은 손쉽게 ’@’과 함께 이름을 붙여 정의할 수 있습니다.

// 테스트 애노테이션의 경우
@Test
public void method() {

}

JDK에서 제공하는 표준 애노테이션은 컴파일러를 위한 것들로 컴파일러에게 유용한 정보를 제공합니다. 새로운 애너테이션을 정의할 때는 메타 애너테이션을 사용합니다.

대표적인 애노테이션으로 @Override가 있습니다.

  • 메서드 앞에만 붙일 수 있는 애노테이션
  • 조상의 메서드를 오버라이딩하는 것을 컴파일러에게 알림
  • 애노테이션을 씀으로써 메서드의 이름이 잘못된 케이스를 방지할 수 있음
class Parent {
  void paranetMethod() {}
}
class Child extends Parent {
  void parentmthod() {} // 오버라이딩하려 했으나 실수로 이름을 잘못 적음
}

이 경우, 실행시 오류가 발생하지 않고, 조상의 메서드가 호출되므로 어디서 잘못되었는지 알아내기 어렵습니다.

class Child extends Parent {
  @Override
  void parentmethod() {}
}

@Override 애노테이션을 붙여 에러의 경우, 에러 메세지를 출력하게 됩니다.

@target


먼저 메타 애너테이션에 대해 알아보자면, 메타 애너테이션은 ‘애너테이션’에 붙이는 ‘애너테이션’으로 ‘애너테이션’을 정의할 때 ‘애너테이션’의 적용대상(target)이나 유지기간(retention) 등을 지정하는데 사용됩니다.

@Target은 애너테이션이 적용가능한 대상을 지정하는데 사용됩니다. 예를 참고해 알아보겠습니다.

@Target({ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE })
@Retention(RetentionPoliciy.SOURCE)
public @interface SuppressWarnings {
  String[] value();
}

@SuppressWarnings 애너테이션에 적용할 수 있는 대상을 **‘@Target’으로 지정하였습니다. 여러 개의 값을 지정할 때는 배열처럼 괄호{}를 사용해야합니다.

대상 타입 의미
ANNOTATION_TYPE 애너테이션
CONSTRUCTOR 생생자
FIELD 필드(맴버변수, enum상수)
LOCAL_VARIABLE 지역변수
METHOD 메서드
PACKAGE 패키지
PARAMETER 매개변수
TYPE 타입(클래스, 인터페이스, enum)
TYPE_PARAMETER 타입 매개변수(JDK1.8)
TYPE_USE 타입이 사용되는 모든 곳(JDK1.8)

@retention


애너테이션이 유지(retention)되는 기간을 지정하는데 사용됩니다.

  • SOURCE
    • 소스 파일에만 존재. 클래스파일에는 존재하지 않음
  • CLASS
    • 클래스 파일에 존재. 실행시에 사용불가. 기본값
  • RUNTIME
    • 클래스 파일에 존재. 실행시에 사용가능
SOURCE

‘@Override’‘@SuppressWarnings’처럼 컴파일러가 사용하는 애너테이션은 유지 정책이 ‘SOURCE’입니다. 컴파일러를 직접 작성할 것이 아니면, 이 유지정책은 필요없다고 합니다.

@Rentention(retentionPolicy.SOURCE)
public @interface Override {}
RUNTIME

유지 정책을 ‘RUNTIME’으로 하면, 실행 시에 ‘리플랙션(reflection)’을 통해 클래스 파일에 저장된 애너테이션의 정보를 읽어서 처리할 수 있습니다. ‘@FunctionalInterface’는 ‘@Override’처럼 컴파일러가 체크해주는 애너테이션이지만, 실행 시에도 사용되므로 유지정책이 ‘RUNTIME’으로 되어 있습니다.

CLASS

유지 정책 ‘CLASS’는 컴파일러가 애너테이션의 정보를 클래스 파일에 저장할 수 있게 합니다. 그러나 클래스 파일이 JVM에 로딩될 때는 애너테이션의 정보가 무시되어 실행되기 때문에, 실행시 애너테이션의 정보를 얻을 수 없습니다. 그래서 ‘CLASS’가 유지 정책의 기본값임에도 잘 사용되지 않는다고 합니다.

@documented


애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 합니다.

애노테이션 프로세서


출처

자바의 정석