12주차 과제: 애노테이션 #12
목표
자바의 애노테이션에 대해 학습하세요.
학습할 것 (필수)
애노테이션 정의하는 방법
Annotation: 메타데이터(Metadata) 즉 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보
패키지명이나 클래스 선언, 메소드 선언, 인자값 선언 앞에 붙이며, @이름(인자) 으로 사용할 수 있다.
애노테이션의 용도
- 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공 (@Override)
- 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공 (@Getter, @Setter)
- 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공 (@Controller)
public @interface myannotation { // @interface를 사용하여 정의
String value();
}
@Retention
애노테이션 유지정책으로 사용 시 어디까지 유지할 것인지를 지정한다.
java.lang.annotation.RetentionPolicy.java
enum | Description |
---|---|
SOURCE | 소스상에서만 애노테이션 정보를 유지 소스 코드를 분석할때만 의미가 있고, 바이트 코드 파일에는 정보가 남지 않음 |
CLASS | 바이트 코드 파일까지 애노테이션 정보를 유지 리플렉션을 이용해 애노테이션의 정보를 얻을 수는 없음 |
RUNTIME | 바이트 코드 파일까지 애노테이션 정보를 유지 리플렉션을 이용해 애노테이션의 정보를 얻을 수 있음 |
@Retention(RetentionPolicy.SOURCE)
public @interface myannotation{
String value();
}
@Target
애노테이션이 적용될 대상을 지정할 때 사용하며, ElementType의 열거상수를 배열 값으로 가질 수 있다.
java.lang.annotation.ElementType.java
enum | Description |
---|---|
TYPE | 클래스, 인터페이스, 열거타입 |
FIELD | 필드 |
METHOD | 메소드 |
PARAMETER | 파라미터 |
CONSTRUCTOR | 생성자 |
LOCAL_VARIABLE | 로컬 변수 |
ANNOTATION_TYPE | 애노테이션 타입 |
PACKAGE | 패키지 |
TYPE_PARAMETER | 타입 파라미터 |
TYPE_USE | 타입 사용 |
@Target(value = {ElementType.FIELD, ElementType.METHOD})
public @interface myannotation{
String value();
}
@documented
애노테이션을 사용한 코드의 문서에 그 애노테이션에 대한 정보를 표기할지를 결정한다.
애노테이션 프로세서
컴파일 단계에서 애노테이션을 분석하고 처리하기 위해 자바 컴파일러 플러그인의 일종
동작 구조
- 애노테이션 프로세서를 사용한다는 것을 자바 컴파일러가 알고 있는 상태에서 컴파일을 수행한다.
- 애노테이션 프로세서들이 각자의 역할에 맞게 구현되어 있는 상태에서 실행되지 않은 애노테이션 프로세서를 실행한다.
- 애노테이션 프로세서 내부에서 애노테이션에 대한 처리를 한다.
- 자바 컴파일러가 모든 애노테이션 프로세서가 실행 되었는지 검사하고, 모든 애노테이션 프로세서가 실행되지 않았다면 반복한다.