애노테이션
자바개발자들은 소스코드와 문서를 하나의 파일로 관리하는 것이 더 낫다고 생각했다.
그래서 소스코드의 주석에 소스코드에 대한 정보를 저장하고, 소스코드의 주석으로부터 HTML문서를 생성해내는 프로그램인 javadoc.exe를 만들어서 사용한다.
이 기능을 응용하여 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이 에노테이션이다.
표준 에노테이션
자바에서 기본적으로 제공하는 에터네이션.
에노테이션 | 설명 |
---|---|
@Override | 컴파일러에게 오버라이딩 하는 메서드라는 것을 알린다. |
@Deprecated | 앞으로 사용하지 않을 것을 권장하는 대상에게 붙인다. |
@SuppressWarnings | 컴파일러의 특정 경고메시지가 나타나지 않게 해준다. |
@SafeVarargs | 지네릭스 타입의 가변인자에 사용한다. |
@FunctionallInterface | 함수형 인터페이스라는 것을 알린다. |
@Native | native 메서드에서 참조되는 상수 앞에 붙인다. |
메타 에노테이션
에노테이션을 정의하는데 사용되는 에노테이션의 에노테이션
에노테이션 | 설명 |
---|---|
@Target | 에노테이션이 적용가능한 대상을 지정하는데 사용한다. |
@Documented | 에노테이션 정보가 javadoc로 작성된 문서에 포함되게 한다. |
@Inherited | 에노테이션이 자손 클래스에 상속되도록 한다. |
@Retention | 에노테이션이 유지되는 범위를 지정하는데 사용한다. |
@Repeartable | 에노테이션을 반복해서 적용할 수 있게한다. |
애노테이션 타입 정의하기
@interface 애노테이션이름 {
타입 요소이름();
}
에노테이션 요소
- 에노테이션 내에 선언된 메서드를 ‘에노테이션의 요소’라 칭한다.
- 에노테이션의 요소는 반환값이 있고 매개변수는 없는 추상메서드의 형태를 가진다.
- 애노테이션을 적용할 때 이 요소들의 값을 빠짐없이 지정해 주어야 한다.
- 에노테이션의 요소에는 기본값을 적용할 수 있으며 기본값이 있을 경우 값을 지정해주지 않아도 된다.
- 에노테이션의 요소가 오직 1개일 경우에는 요소의 이름을 생랴가고 값만 적어도 된다.
- 요소의 타입이 배열인 경우 {}를 사용해서 여러 개의 값을 지정할 수 있다.
@Target
애노테이션이 적용가능한 대상을 지정하는데 사용된다.
- Target 에노테이션 적용대상 종류
대상 타입 | 의미 |
---|---|
ANNOTATION_TYPE | 애노테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드 |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입(클래스, 인터페이스, enum) |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든 곳 |
@Target({TYPE, FIELD, METHOD})
public @interface Exam {
String value;
}
//TYPE, FIELD, METHOD에 사용할 수 있는 애노테이션 Exam
@Retention
애노테이션이 유지되는 기간을 지정하는데 사용된다.
- 애노테이션 유지정책의 종류
유지 정책 | 의미 |
---|---|
SORUCE | 소스 파일에만 존재. 클래스파일에는 존재하지 않음 |
CLASS | 클래스 파일에 존재. 실행시에 사용불가. 기본값 |
RUNTIME | 클래스 파일에 존재. 실행시에 사용가능. |
@Documented
에노테이션에 대한 정보가 javadoc로 작성한 문서에 포함되도록 한다.
자바에서 제공하는 기본 에노테이션 중 @Override와 @SuppressWarnings를 제외하고는 모두 이 어노테이션이 붙어있다.
에노테이션 프로세스
이런 애노테이션도 애노테이션 프로세서가 없다면 그냥 주석에 불가하다.
애노테이션 프로세서란 자바 컴파일러 플러그인의 일종으로 애노테이션에 대한 코드베이스를 검사, 수정, 생성하는 역할을 가진 플러그인을 말한다.
- 동작 구조
- 애노테이션 클래스를 생성한다.
- 에노테이션 파서 클래스를 생성한다
- 애노테이션을 사용한다
- 컴파일시, 애노테이션 파서 클래스가 애노테이션을 처리한다.
- 자동생성된 클래스가 빌드 폴더에 추가된다.