애노테이션이란?
프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨것.
자바는 소스코드와 문서를 하나의 파일로 관리. 따라서 주석에 소스코드에 대한 정보를 저장하고 소스코드의 주석으로부터 HTML문서를 생성해내는 javadoc.exe를 사용.
(=미리 정의된 태그들을 이용해서 주석안에 정보를 저장하고 javadoc.exe 프로그램이 이 정보를 읽어서 문서를 작성)
<애너테이션 요소의 규칙>
요소의 타입은 기본형, String, enum, 어노테이션, Class만 허용됨.
()안에 매개변수는 선언할 수 없음.
예외를 선언할 수는 없음.
요소를 타입 매개변수로 정의 할 수 없음.
<표준 애노테이션>
애너테이션 | 설명 |
---|---|
@Override | 컴파일러에게 오버라이딩 메서드라는 것을 알림 |
@Deprecated | 앞으로 사용하지 않을 것을 권장하는 대상에 붙임 |
@SuppressWarnings | 컴파일러의 특정 경고메세지가 나타나지 않게 해줌 |
@SafeVarags | 지네릭스 타입의 가변인자에 사용 |
@FunctionalInerface | 함수형 인터페이스임을 알림 |
@Native | native메서드에서 참조되는 상수 앞에 붙임 |
@Target* | 애너테이션이 적용가능한 대상을 지정하는데 사용 |
@Documented* | 애너테이션 정보가 javadoc으로 작성한 문서에 포함되게 함. |
@Inherited* | 애너테이션이 자손 클래스에 상속되도록함 |
@Retention* | 애너테이션이 유지되는 범위를 지정 |
@Repeatable* | 애너테이션이 반복해서 적용할 수 있게 함. |
메타 애너테이션
-애너테이션을 위한 애너테이션 = 애너테이션에 붙이는 애너테이션으로 애너테이션을 정의할 때 적용대상이나 유지기간등을 지정하는데 사용.
-java.lang.annotation 패키지에 포함되어 있음
애너테이션이 유지되는 기간을 지정하는데 사용
<애너테이션 유지정책의 종류>
유지 정책 | 의미 |
---|---|
SOURCE | 소스파일에만 존재. 클래스 파일에는 존재하지 않음 |
CLASS | 클래스 파일에 존재. 실행시에 사용불가. 기본값 |
RUNTIME | 클래스파일에 존재. 실행시에 사용가능. |
@Override, @SuppressWarnings (컴파일러가 사용하는 애너테이션) ⇒ SOURCE
@FunctionalInterface(컴파일러 확인, 실행시 유지) ⇒ RUNTIME
애너테이션이 적용가능한 대상을 지정하는데 사용.
→ 여러개의 값을 지정할 경우 배열을 사용.
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
<@Target 애너테이션 적용대상의 종류>
대상 타입 | 의미 |
---|---|
ANNOTATION_TYPE | 애너테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드(멤버변수, enum상수), 기본형 |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입(클래스, 인터페이스, enum) |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든 곳, 참조형 |
애너테이션에 대한 기본 정보가 javadoc으로 작성한 문서에 포함되도록함.
@Override, @SuppressWarnings 제외한 나머지는 모두 해당 메타 애너테이션이 붙어있음.
(참고 강의 : www.inflearn.com/course/the-java-code-manipulation/dashboard 인프런 - 더 자바, 코드를 조작하는 다양한 방법)
https://www.notion.so/37d183f38389426d9700453f00253532
애노테이션 프로세서는 소스코드 레벨에서 소스코드에 붙어있음.
애노테이션을 읽어서 컴파일러가 컴파일 하는 중에 새로은 소스코드를 생성하거나 기존 소스코드를 바꿀 수 있음.
또는, 클래스(바이트코드) 도 생성할 수 있고 별개의 리소스파일을 생성할 수 있는 강력한 기능.
단점은 기존의 코드를 고치는 방법은 현재로써는 public 한 API 가 없음.
Lombok
AST(Abstract Syntax Tree)
를 조작
한다.