본문 바로가기

Programming/JAVA

어노테이션(Annotation) - 어노테이션 유지(Retention) 정책

 

 

어노테이션을 정의하는 경우 사용하는 정책과 관련해서, 적용 대상 정책 말고도 어느 '범위'까지 사용해야 할 지에 대해서도 정의가 가능합니다. 이 어노테이션 리텐션 정책은 java.lang.annotation.RetentionPolicy에 enum(열거 상수)로 정의되어 있습니다. 

 

 

 

RetentionPolicy (Java Platform SE 7 )

 

docs.oracle.com

 

우선 이 리텐션 정책에 대한 정의는 소스 상에서만 유지 - 컴파일 클래스까지 - 런타임 시에도 유지 할지를 지정하게 됩니다. 이 세 가지 정책에 대한 이해가 필요한데, 이를 설명하기 전에 우선 리플렉션(Reflection)의 개념을 먼저 이해하고 있어야 합니다. 

 

리플렉션은 런타임 시점에 해당 클래스의 메타 정보를 얻는 기능을 의미합니다. 클래스 실행 시 어떤 필드와 메서드가 있으며 어떠한 어노테이션이 적용되었는지를 미리 알 수 있는 것이죠. 이를 통해 사전에 다양한 처리가 가능합니다. 이 때, 클래스에 적용된 어노테이션의 리텐션 범위가 런타임까지로 지정되어 있으면, 이 리플렉션을 통해 다른 필드나 메서드처럼 어노테이션 정보를 얻어 처리를 할 수 있다는 의미입니다. 

 

우선 리텐션 정책에서 정의된 열거 상수를 알아보겠습니다. 

 

RetentionPolicy enum constant 설명
SOURCE 소스 레벨에서만 어노테이션의 정보를 유지합니다. 소스 분석 시에만 의미있고 바이트 코드 레벨에서는 정보가 없습니다.
CLASS 바이트 코드 파일까지 어노테이션 정보를 유지하지만, 리플렉션을 통한 정보 취득은 불가능합니다.
RUNTIME 바이트 코드 파일까지 어노테이션 정보를 유지하고, 리플렉션을 통해 런타임 시점에 어노테이션 관련 정보 취득이 가능합니다.

 

사실 일반적인 경우라면, 대부분 런타임 레벨에서 어노테이션의 정보를 얻을 필요성이 있을 것입니다. 그래서 RUNTIME 상수를 지정하는 경우가 제일 많을 것으로 예상합니다. 

 

 


 

어노테이션 리텐션 정책 적용은, @Retention 어노테이션을 사용합니다. 기본 엘리먼트인 value는 RetentionPolicy 타입으로, 위에 언급한 열거 상수 중 하나를 지정하게 됩니다. 이해가 어려울 수 있으니, 간단한 예시를 보겠습니다.

 

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName {
	// ...
}