티스토리 뷰
1. 애노테이션 정의하는 방법
@interface 애너테이션 이름 {
타입 요소이름();
...
}
- 애너테이션의 요소(element) : 애너테이션 내에 선언된 메서드
@interface TestInfo {
int count();
String testedBy();
String[] testTools();
TestType testType();
DateTime testDate();
}
@interface DateTime {
String yymmdd();
String hhmmss();
}
@TestInfo (
count=3,testedBy="Kim",
TestTools = {"JUnit", "AutoTester"},
TestType = TestType.FIRST,
TestDate = @DateTime(yymmdd = "160101",hhmmss = "235959")
)
public class NewClass { ... }
- 애너테이션의 요소는 기본 값을 가질 수 있음
@interface TestInfo {
int count() default 1;
String[] info() default {"aaa","bbb"};
String[] info2() default "ccc"; // 기본값이 하나인 경우 괄호 생략 가능
}
- 애너테이션 요소의 규칙
- 요소의 타입은 기본형, String, enum, 애너테이션, Class 만 허용
- () 안에 매개변수를 선언할 수 없음
- 예외를 선언할 수 없음
- 요소를 타입 매개변수로 정의할 수 없음
@interface AnnoTest {
int id = 100; // OK
String major(int i, int j); // Error, 매개변수를 선언할 수 없음
String minor() throws Exception; // Error, 예외를 선언할 수 없음
ArrayList<T> list(); // 요소의 타입에 타입 매개변수 사용불가
}
2. @retention
- 애너테이션이 유지 되는 기간을 지정
유지정책 | 의미 |
SOURCE | 소스파일에만 존재, 클래스 파일에는 존재하지 않음 |
CLASS | 클래스 파일에 존재, 실행시에 사용불가, 기본값 |
RUNTIME | 클래스 파일에 존재, 실행시에 사용가능 |
- 컴파일러가 사용하는 애너테이션은 'SOURCE' 임 ex) @Override, @SuppressWarnings 등
- 컴파일러를 직접 작성할 것이 아니라면 'SOURCE' 쓸 일 없음
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interfac Override {}
- 'RUNTIME' : 실행 시에 'reflection'을 통해 클래스 파일에 저장된 애너테이션의 정보를 읽어서 처리함
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FuntionalInterface {}
- 'CLASS' : 잘 사용되지 않음 <- 컴파일러가 애너테이션의 정보를 클래스 파일에 저장할 수 있게는 하지만, 클래스 파일이 JVM에 로딩될 때는 애너테이션의 정보가 무시되어 실행시에 에너테이션에 대한 정보를 얻을 수 없음
3. @target
- 애너테이션이 적용 가능한 대상을 지정하는데 사용
대상 타입 | 의미 |
ANNOTATION_TYPE | 애너테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드 (멤버변수, enum 상수) |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입 (클래스, 인터페이스, enum) |
TYPE_PARAMETER | 타입 매개변수 (JDK 1.8) |
TYPE_USE | 타입이 사용되는 모든 곳 (JDK 1.8) |
@Target ({FIELD, TYPE, TYPE_USE})
public @interface MyAnnotation() {}
@MyAnnotation // 적용 대상이 TYPE인 경우
class MyClass {
@MyAnnotation // 적용 대상이 FIELD인 경우
int i;
@MyAnnotation // 적용 대상이 TYPE_USE인 경우
MyClass mc;
}
4. @documented
- 애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 함
- @Override, @SuppressWarnings 를 제외하고는 모두 붙어있음
@Documented
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.TYPE)
public @interface FuntionalInterface {}
5. 애노테이션 프로세서
- 컴파일 타임에서 애노테이션 정보를 참고하여 코드를 분석하고 생성하는 작업을 할 수 있는 기능 (코드 변경을 추천하지 않음)
- 소스코드와 별개의 리소스 생성 가능
- 컴파일 시점에 조작하기 때문에 런타임 비용이 없음
- ex ) 롬복(lombok) @Getter, @Setter, @Builder
- ex ) @Override
출처
자바의 정석, 남궁 성 지음
'개발 > Java Study' 카테고리의 다른 글
14주차 : 제네릭 (0) | 2021.03.15 |
---|---|
13주차 : I/O (0) | 2021.03.03 |
11주차 : Enum (0) | 2021.02.21 |
10주차 : 멀티쓰레드 프로그래밍 (0) | 2021.02.20 |
9주차 : 예외 처리 (0) | 2021.02.15 |