[JAVA] 어노테이션(Annotation)
- 주석이라는 의미
- 자바 5버전부터 추가된 메타데이터의 일종
- 클래스 파일에 임베디드되어 컴파일러에 의해 생성 된 후 JVM에 포함되어 동작한다
메타 어노테이션
1. @Retention
-
어노테이션이 유지되는 시간을 지정
-
RetentionPolicy.SOURCE
: 소스파일(.java)까지만 유지 (=컴파일에는 이후 제거된다) -
RetentionPolicy.CLASS
: 클래스파일(.class)까지만 유지 (=실행되면 제거된다) -
RetentionPolicy.RUNTIME
: 런타임때도 JVM에 의해 계속 참조가능
2. @Target
-
어노테이션 적용 대상을 지정
- ElementType.PACKAGE
- ElementType.TYPE : 클래스, 인터페이스, 이넘
- ElementType.ANNOTATION_TYPE : 어노테이션
- ElementType.CONSTRUCTOR
- ElementType.FIELD
- ElementType.LOCAL_VARIABLE
- ElementType.METHOD
- ElementType.PARAMETER
- ElementType.TYPE_PARAMETER
- ElementType.TYPE_USE
3. @Documented
- Javadoc에 작성한 문서를 포함시킬 때 사용
4. @Inherited
- 자식 클래스가 어노테이션을 상속 받을 때 사용
5.@Repeatable
- 반복적으로 어노테이션을 선언할 수 있다
ex) RequestMapping
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping { // 인터페이스 어노테이션 정의
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
...
}
public static void main(String[] args) {
@RequestMapping(value="main", method="get") // 어노테이션 호출
}
커스텀 어노테이션
public @interface Name{
타입 요소 이름();
...
}
●Reflection
- 실행중인 프로그램이 자신의 구조, 동작을 검사, 조사, 수정 하는 것.
- 객체지향 프로그래밍 언어에서 reflection을 사용하면 컴파일할 때 인터페이스, 필드, 메서드의 이름을 알지 못해도 실행 중인 클래스, 인터페이스, 필드 및 메소드에 접근할 수 있음
- 새로운 객체의 인스턴스화 및 메소드 호출을 허용
- 보통의 어노테이션은 동작을 하지 않는 주석일 뿐이지만 reflection을 사용하면 어노테이션 적용 여부와 엘리먼트 값을 읽고 처리할 수 있음