어노테이션은 메타데이터라고 볼 수 있다. 메타데이터는 애플리케이션이 처리해야 할 데이터가 아니라, 컴파일 과정과 실행과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보이다.
어노테이션은 세 가지 용도로 사용된다.
- 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공
- 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
- 실행(런타임) 시 특정 기능을 실행하도록 정보 제공
어노테이션은 @interface를 사용해서 정의한다.
public @interface AnnotationName {
}
정의한 어노테이션은 @AnnotationName 으로 사용한다.
어노테이션은 element를 가질 수 있다.
엘리먼트는 타입과 이름으로 구성되고, 디폴트 값을 선택적으로 가질 수 있다.
엘리먼트를 선언하는 방법은 다음과 같다.
public @interface AnnotationName{
String elementName() [default 값];
}
엘리먼트의 타입으로는 int, double, String, 열거타입, Class타입, 그리고 이들의 배열 타입을 사용할 수 있다. 엘리먼트의 이름 뒤에는 메소드처럼 () 를 붙여야 한다.
선언한 엘리먼트 중에 디폴트 값이 없는 엘리먼트는 어노테이션을 사용할 때 반드시 그 값을 넣어줘야 한다.
디폴트 값이 있는 엘리먼트는 어노테이션 사용시 반드시 엘리먼트 값을 넣어줘야할 필요는 없다.
public @interface AnnoName{
String name();
int count() default 0;
}
@AnnoName(name = "아구몬");
// OR
@AnnoName(name = "파피몬", count = 3);
어노테이션 적용 대상
어노테이션이 적용될 대상을 지정할 때는 @Target 어노테이션을 사용한다. @Target의 기본 엘리먼트는 ElementType 배열을 값으로 가진다. 이것은 어노테이션이 적용될 대상을 복수개로 지정하기 위해서이다.
@Target({ElementType.TYPE, Element.FIELD, Element.METHOD})
public @interface AnnotationName {
}
이렇게 만들면 클래스, 필드, 메소드에만 어노테이션을 적용할 수 있다.
어노테이션 유지 정책
어노테이션 사용 용도에 따라 어노테이션을 어느 범위까지 유지할 것이지 지정해야 한다.
RetentionPolicy 열거 상수로 SOURCE, CLASS, RUNTIME 세 종류가 있다.
- SOURCE : 소스상에서만 어노테이션 정보를 유지한다. 소스 코드를 분석할 때만 의미가 있으며, 바이트 코드 파일에는 정보가 남지 않는다.
- CLASS : 바이트 코드 파일까지 어노테이션 정보를 유지한다. 하지만 리플렉션을 이용해서 어노테이션 정보를 얻을 수는 없다.
- RUNTIME : 바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서 런타임 시에 어노테이션 정보를 얻을 수 있다.
리플렉션이란 런타임 시에 클래스의 메타 정보를 얻는 기능이다. 즉, 런타임 시 클래스의 필드, 생성자, 메소드, 어노테이션이 무엇인지 알아내는 것이 리플렉션이다.
어노테이션 유지 정책을 지정할 때는 @Retention 을 사용한다. @Retention의 기본 엘리먼트는 RetentionPolicy 타입으로 SOURCE, CLASS, RUNTIME 셋 중에 하나를 지정하면 된다.
'개발 관련 지식 > JAVA' 카테고리의 다른 글
메소드 재정의 Overriding (0) | 2020.03.31 |
---|---|
상속 (0) | 2020.03.31 |
Getter, Setter 메소드 (0) | 2020.03.31 |
import문 (0) | 2020.03.31 |
싱글톤(Singleton) (0) | 2020.03.31 |