본문 바로가기
개발 관련 지식/JAVA

어노테이션

by 권태일1147 2020. 3. 31.

어노테이션은 메타데이터라고 볼 수 있다. 메타데이터는 애플리케이션이 처리해야 할 데이터가 아니라, 컴파일 과정과 실행과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보이다.

 

어노테이션은 세 가지 용도로 사용된다.

  • 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공
  • 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
  • 실행(런타임) 시 특정 기능을 실행하도록 정보 제공

어노테이션은 @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