어노테이션을 정의하는 경우 사용하는 정책과 관련해서, 적용 대상 정책 말고도 어느 '범위'까지 사용해야 할 지에 대해서도 정의가 가능합니다. 이 어노테이션 리텐션 정책은 java.lang.annotation.RetentionPolicy에 enum(열거 상수)로 정의되어 있습니다.
우선 이 리텐션 정책에 대한 정의는 소스 상에서만 유지 - 컴파일 클래스까지 - 런타임 시에도 유지 할지를 지정하게 됩니다. 이 세 가지 정책에 대한 이해가 필요한데, 이를 설명하기 전에 우선 리플렉션(Reflection)의 개념을 먼저 이해하고 있어야 합니다.
리플렉션은 런타임 시점에 해당 클래스의 메타 정보를 얻는 기능을 의미합니다. 클래스 실행 시 어떤 필드와 메서드가 있으며 어떠한 어노테이션이 적용되었는지를 미리 알 수 있는 것이죠. 이를 통해 사전에 다양한 처리가 가능합니다. 이 때, 클래스에 적용된 어노테이션의 리텐션 범위가 런타임까지로 지정되어 있으면, 이 리플렉션을 통해 다른 필드나 메서드처럼 어노테이션 정보를 얻어 처리를 할 수 있다는 의미입니다.
우선 리텐션 정책에서 정의된 열거 상수를 알아보겠습니다.
RetentionPolicy enum constant | 설명 |
SOURCE | 소스 레벨에서만 어노테이션의 정보를 유지합니다. 소스 분석 시에만 의미있고 바이트 코드 레벨에서는 정보가 없습니다. |
CLASS | 바이트 코드 파일까지 어노테이션 정보를 유지하지만, 리플렉션을 통한 정보 취득은 불가능합니다. |
RUNTIME | 바이트 코드 파일까지 어노테이션 정보를 유지하고, 리플렉션을 통해 런타임 시점에 어노테이션 관련 정보 취득이 가능합니다. |
사실 일반적인 경우라면, 대부분 런타임 레벨에서 어노테이션의 정보를 얻을 필요성이 있을 것입니다. 그래서 RUNTIME 상수를 지정하는 경우가 제일 많을 것으로 예상합니다.
어노테이션 리텐션 정책 적용은, @Retention 어노테이션을 사용합니다. 기본 엘리먼트인 value는 RetentionPolicy 타입으로, 위에 언급한 열거 상수 중 하나를 지정하게 됩니다. 이해가 어려울 수 있으니, 간단한 예시를 보겠습니다.
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName {
// ...
}
'Programming > JAVA' 카테고리의 다른 글
상속(3) - 메서드 재정의(override) 2 (0) | 2023.02.22 |
---|---|
상속(3) - 메서드 재정의(override) 1 (0) | 2023.02.20 |
상속(2) - 부모 생성자의 호출(super) (0) | 2023.02.18 |
상속(1) - 상속의 기본 개념 (0) | 2023.02.17 |
어노테이션(Annotation) - 런타임 시 어노테이션 정보 사용하기 (0) | 2023.02.16 |