코드에 관한 데이터를 제공하며, 효용성으로는 문서화, 컴파일러 체크, 코드분석에서 사용한다.
annotation은 데코레이션, 클래스, 인터페이스, 필드에 적용되어 툴과 라이브러리를 활용할 수 있게 함으로써, 코드에 명시적 프로그래밍을 줄이고 좀 더 많은 선언문을 제공한다. annotation은 프로그램의 의미적인 부분에 직접 영향을 주지 않고, 툴이 프로그램을 어떻게 다루어야 하는지에 알려준다. 툴이 실행 중인 프로그램의 의미적인 부분에 영향을 줄 수 있다.
annotation은 런타임에 소스 파일 또는 클래스 파일 등에서 읽을 수 있다. annotation은 javadoc 태그의 기능을 보안하고 있다. 마크업을 문서 생성시 필요한 정보를 제공하기 위해 사용하고자 할 경우, javadoc 태크 또는 annotation을 사용해야 한다. 일반적으로 어플리케이션 프로그래머는 annotation 타입을 정의하는 경우가 거의 없지만, annotation 타입을 정의하는작업은 어렵지 않다.
1. 컴파일러가 에러를 탐지하거나 경고등을 무시하는 등등의 용도
2. 컴파일 또는 설치시에 소프트웨어 도구가 코드, XML 파일 등을 처리하기 위한 용도
3. 실행시 별도의 처리 루틴이 필요한 경우(실행 루틴 점검 등과 같은)
* Annotation의 종류
Marker Annotation : 이름으로 구분하기 위하여 사용하며 추가적인 데이터를 필요하지 않음
Single-Value Annotation : 간단한 신텍스를 사용하며 단일 데이터를 필요로 함
Full Annotation : 복잡한 신텍스이며, 다중 데이터를 사용하며 name=value 형태를 취함
--> 데이터가 Array 인 경우 "{ }"를 이용
* Annotation Type의 정의
1. Annotation 타입 선언은 인터페이스를 선언하는 방법과 유사하다.
2. Annotation 타입 선언 시에는 interface 키워드 앞에 @ 기호를 붙인다.
3. 메소드는 파라메터를 가질 수 없다.
4. 메소드는 throws 절을 가질 수 없다.
5. 메소드의 리턴 타입 : 프리미티브(Primitive), String, Class, 열거형(Enum), annotation, 앞에서 열거한 타입들의 배열
6. 메소드는 기본값(Default Value)를 가질 수 있다.
* 기본 Annotation
@Deprecated : 더 이상 사용하지 말아야할 메소드를 알림 (비추천 메소드)
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface Deprecated {
}
@Override : 상위 요소를 오버라이드 할 것임을 알림
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
@SuppressWarnings : 경고를 하지 않도록 억제 시킴
- unchecked : 비확인
- deprecate : 비사용
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
* Built-in Annotation
Target : Annotation의 대상을 무엇으로 할 것인지를 기록 (CONSTRUCTOR, FIELD, METHOD, PACKAGE, ...)
- ANNOTATION_TYPE : annotation 타입(Annotation Type)선언
- CONSTRUCTOR : 생성자 함수 선언
- FIELD : 필드 선언(enum 상수 포함)
- LOCAL_VARIABLE : 로컬 변수 선언
- METHOD : 메소드 선언
- PACKAGE : package 선언
- PARAMETER : parameter 선언
- TYPE : 클래스, 인터페이스 (annotation타입(AnnotationType)포함), enum선언
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
Retention : 어느 과정에서 Annotation을 사용할 것인지를 기록 (여러개의 값 중 선택 가능) (SOURCE, CLASS, RUNTIME)
- SOURCE : 소스파일에서만 사용하며 컴파일 이후는 사용하지 않음
- CLASS : 컴파일 과정까지 사용하며 Runtime에서는 사용하지 않음
- RUNTIME : Runtime에서까지 사용함
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
Documented : Javadoc에 포함(문서화)되어야 함을 알리는 Marker Annotation
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
Inherited : 하위 클래스에 상속되어야 함을 알리는 Marker Annotation
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
* Custom Annotation
개발자가 정의하는 어노테이션으로 class 형태로 만들어진다. 어노테이션의 선언은 @interface 로 한다.
이름 앞에 '@'문자가 오는 것 외에는 기본적으로 인터페이스를 선언하는 것과 동일(메소드들의 내용은 없고 형태만 선언)하다.
default 가 찍히지 않은 메소드는 필수로 입력해야 한다
@Retention(RetentionPolicy.RUNTIME)
public @interface Maker {
int num();
String id();
String name();
String date() default "unsigned";
}
@Maker(num=1, id="dryang", name="junsun.yang")
public class UseMaker {
...
}
'Program > Java' 카테고리의 다른 글
Spring MVC - Annotation Base HandlerInterceptor (0) | 2009.12.27 |
---|---|
Spring MVC Annotation 기초 (2) | 2009.12.27 |
About JAXB (0) | 2009.12.27 |
StringUtils (0) | 2009.12.22 |
Annotation (since tiger / 1.5) (0) | 2009.12.15 |