목적
자바의 애노테이션에 대해 학습하세요.
학습할 것
- 애노테이션 정의하는 방법
- @retention
- @target
- @documented
- 애노테이션 프로세서
1. 애노테이션 정의하는 방법
애너테이션이란
프로그램의 소스코드 안에 다른 프로그램의 위한 정보를 미리 약속된 형식으로 포함시킨 것
프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공하는 장점
작성법
@interface 애너테이션이름 {
타입요소 이름();
...}
@애너테이션이름 -> 애너테이션
애너테이션이름 -> 애너테이션 타입
애너테이션 내에 선언된 메서드를 애너테이션의 ‘요소’ 라고 하며 요소들을 통해 값을 정의할 수 있다.
요소들은 반환값이 있고 매개변수가 없는 추상 메서드 형태이며, 상속을 통해 구현하지 않아도 된다.
다만 요소들의 값은 빠짐없이 지정해줘야 한다. (default를 옆에 붙여주면 기본 값을 가질 수 있다.)
@interface TestInfo{
String[] testTools() default {"test1", "test2", ""}
}
@TestInfo(testTools = {"aaa", "bbb", "ccc"})
class or method { ~~ }
만약 이름의 요소가 value 이면 요소이름 생략 가능
java.lang.annotation.Annotation
애너테이션은 상속이 허용되지 않으므로, 명시적으로 Annotation을 조상으로 지정할 수 없다.
2. @retention
애너테이션이 유지되는 기간을 지정하는데 사용한다.
유지정책 | 의미 | |||
---|---|---|---|---|
SOURCE | 소스파일에만 존재. 클래스파일에는 존재하지 않음 | |||
CLASS | 클래스파일에 존재. 실행시에 사용불가. 기본값 | RUNTIME | 클래스파일에 존재. 실행시에 사용가능. |
컴파일러가 사용하는 애너테이션은 유지 정책이 SOURCE이다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override { ...}
- SOURCE : 컴파일러가 사용하는 애너테이션, 직접작성할 것 아니면 이 유지정책은 필요 없다.
- RUNTIME : , 실행 시 리플랙션을 통해 클래스파일에 저장된 애너테이션 정보를 읽어서 처리할 수 있다.
- CLASS : 클래스 파일에 저장할 수 있게는 하지만 클래스파일이 JVM 로딩될 때는 정보가 무시되어 애너테이션 정보를 얻을 수 없다.
3. @target
애너테이션이 적용가능한 대상을 지정하는데 사용.
대상타입 | 의미 |
---|---|
ANNOTATION_TYPE | 애너테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드 |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입 |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든 곳 |
- TYPE은 타입을 선언할 때 붙일 수 있고, TYPE_USE는 해당 타입의 변수를 선언할 때 붙일 수 있다.
- FIELD는 기본형에, TYPE_USE는 참조형에 사용된다.
4. @documented
애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다. 자바에서 제공하는 기본 애너테이션 중, @Override, @SuppressWarnings를 제외하고는 이 메타 애너테이션이 붙어있다.
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface{}
5. 애노테이션 프로세서
어노테이션을 프로세싱 즉, 내가 보았던 것은 lombok이 대표적이며, 이 외에 이것을 어떻게 작성해야 될 지 모르겠다. 그래서 강의를 들으면서 작성하려고 한다.
Reference
남궁성. Java의 정석