어노테이션(Annotation) - java 1.5 이후
정의 : 프로그램에게 추가적인 정보를 제공해주는 메타데이터(metadata) 이다.
용도
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
ex) @Override : 메소드가 재정의 되었는지 확인할 수 있다.
- SW 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공
ex) XML 설정 파일을 자동 생성하거나 배포를 위한 JAR 압축 파일을 자동 생성할 수 있다.
- 실행시(Runtime) 특정 기능을 실행하도록 정보를 제공
ex) 객체가 애플리케이션 내부에서 해야할 역할을 정의할 수 있다. Servlet, Controller ...
어노테이션 타입 정의
- 소스파일 생성 : AnnotationName.java
- 소스 파일 내용
public @interface AnnotationName { }
어노테이션 타입 적용
@AnnotationName
어노테이션 엘리먼트(element) 멤버
- 어노테이션을 코드에 적용할 때 외부의 값을 입력받을 수 있도록 하는 역할
- 엘리먼트 선언
public @interface AnnotationName {
타입 elementName() [ default 값 ];
......
}
※ 엘리먼트의 타입은 기본타입과 참조타입을 모두 사용할 수 있다.
public @interface AnnotationName {
String elementName1();
int elementName2() default 5;
}
- 어노테이션 적용시 엘리먼트 값을 지정하는 방법
@AnnotationName(elementName1 = "값", elementName2 = 3); 또는
@AnnotationName(elementName1 = "값");
기본 엘리먼트 value
public @interface AnnotationName {
String value(); // 기본 엘리먼트 선언
int elementName() default 5;
}
* 어노테이션을 적용할 때 엘리먼트명을 생략가능
@AnnotationName("값")
@WebServlet("/main")
public class MainServlet { ... }
* 두개 이상의 속성을 기술할 때에는 value=값 형태로 기술
@AnnotationName(value="값", elementName=3);
@WebServlet(value="/main")
public class MainServlet { ... }
어노테이션 적용 대상
- 코드 상에서 어노테이션을 적용할 수 있는 대상
- java.lang.annotation.ElementType 열거 상수로 정의되어 있음
ElementType 열거 상수 |
적용 대상 |
TYPE |
클래스, 인터페이스, 열거 타입 |
ANNOTATION_TYPE |
어노테이션 |
FIELD |
필드 |
CONSTRUCTOR |
생성자 |
METHOD |
메소드 |
LOCAL_VARIABLE |
로컬 변수 |
PACKAGE |
패키지 |
- 어노테이션 적용 대상 지정 방법
* @Target 어노테이션으로 적용 대상 지정
* @Target 의 기본 일리먼트인 value의 타입은 ElementType 배열
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface AnnotationName {
}
소스 예제
@AnnotationName
public class ClassName {
@AnnotationName
private String fieldName;
//@AnnotationName (X)
public ClassName() {}
@AnnotationName
public void methodName() {}
}
어노테이션 유지 정책
- 어노테이션 적용 코드가 유지되는 시점을 지정하는 것
- java.lang.annotation.RetentionPolicy 열거 상수로 정의되어 있음
RetentioinPolicy 열거 상수 |
설명 |
SOURCE |
소스(.java)상에서만 어노테이션 정보를 유지한다. 소스 코드(.java)를 분석할 때만 의미가 있으며, 바이트 코드 파일(.class)에는 정보가 남지 않는다. |
CLASS |
바이트 코드 파일(.class)까지 어노테이션 정보를 유지한다. 하지만, *리플렉션을 이용해서 이노테이션 정보를 얻을 수 없다. |
RUNTIME |
바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서 런타임에 어노테이션 정보를 얻을 수 있다. |
* 리플렉션 : 런타임에 클래스의 메타 정보를 얻는 기능
- 클래스가 가지고 있는 필드, 생성자, 메소드, 어노테이션의 정보를 얻을 수 있다.
- 런타임시에 어노테이션 정보를 얻으려면 유지 정책을 RUNTIME 으로 설정해야 함.
- 유지 정책 지정 방법
@Retention 어노테이션으로 유지 정책을 지정
@Retention의 기본 엘리먼트인 value의 타입은 RetentionPolicy
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName { }
'JAVA Programming' 카테고리의 다른 글
protected 접근 제한자 (0) | 2015.04.27 |
---|---|
어노테이션(Annotation) #2 (0) | 2015.04.23 |
Getter와 Setter (0) | 2015.04.23 |
패키지와 접근 제한자 (0) | 2015.04.23 |
non-static 멤버와 static 멤버의 특징 (0) | 2015.04.23 |