애노테이션
목표
- 자바의 애노테이션에 대해 학습하세요.
학습할 것
- 애노테이션 정의하는 방법
- @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으로 작성한 문서에 포함되도록 합니다.
애노테이션 프로세서
출처
자바의 정석