Annotation
Java 8 부터 어노테이션을 1)타입 선언부에도 사용 가능하게, 2)중복해서 사용할 수 있게 바뀌었다.
타입 선언부
- 제네릭 타입
- 변수 타입
- 매개변수 타입
- 예외 타입
타입에 사용하기 위한 준비 사항
@Target 을 통해 해당 클래스가 어노테이션으로써 사용될 수 있는 곳을 정의할 수 있다.
Java 8에 TYPE_PARAMETER와 TYPE_USE 두 가지 타입이 추가되었다.
1) ElementType.TYPE_PARAMETER
해당 클래스를Type Parameter에만 사용 가능해진다.
Cf. 하나 이상의 타입 매개변수(Type Parameter)를 선언하고 있는 클래스 혹은 인터페이스를 제네릭 클래스(제네릭 인터페이스)라고 하며,이를 모두 제네릭 타입이라고 한다.
예시로, 어노테이션으로 만든 클래스를 Item 이라고 하겠다.
static class ExClass<@Item C> {
public static <@Item C> void print(C c) { ... }
}
2) ElementType.TYPE_USE
해당 클래스를Type에 모두 사용 가능해진다.
public class App {
public static void main(@Item String[] args) throws @Item RuntimeException {
List<@Item String> names = Arrays.asList("yhlee");
}
static class ExClass<@Item C> {
public static <@Item C> void print(@Item C c) { ... }
}
}
중복 사용할 수 있는 어노테이션 생성
중복 사용할 어노테이션 생성
@Retention(RetentionPolicy.RUNTIME) // Retention 전략(얼마나 유지할지)
@Target(ElementType.TYPE_USE) // TYPE_PARAMETER 사용 시 타입 매개변수에만 사용 가능
@Repeatable(ItemContainer.class) // 컨테이너 어노테이션 타입을 선언해주어야 함
public @interface Item {
String value();
}
중복 어노테이션 컨테이너 생성
이 때 어노테이션 컨테이너는 기본적으로 반드시 어노테이션 목록을 가져야 한다. 이를 value라는 이름으로 정의한다.
@Retension(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface ItemContainer {
Item[] value();
}
어노테이션 정보 가져오기
특정 클래스에 등록된 어노테이션'목록' 조회
<A extends Annotation>A[] getAnnotationsByType(Class<A>annotationClass)
특정 타입의 클래스의 어노테이션 조회
Repeatable한 어노테이션을 컨테이너로 감싸서 가져오기 위해서는 해당 메서드를 사용하되 인자로 컨테이너 클래스를 전달할 수 있다.
<A extends Annotation>A getAnnotation(Class<A>annotationClass)
Cf. 참고로, 어노테이션을 중복 사용할 경우에만 컨테이너 클래스 타입으로 가져올 수 있다. 클래스에서 특정 어노테이션이 중복 사용되지 않으면, 어노테이션 타입으로는 가져와지지만 컨테이너 타입으로 조회하면 null을 반환한다.
'Backend > Java' 카테고리의 다른 글
Java 소스 코드의 동작 원리(JVM은 어떻게 동작할까? 메모리와 GC) (0) | 2024.04.08 |
---|---|
Java) 어노테이션(Annotation)이란? (0) | 2022.12.26 |
Java8) Java 비동기 프로그래밍과 CompletableFuture (0) | 2022.10.31 |
Java8) Java에서 날짜 및 시간을 나타내는 방식 - Date, Time (0) | 2022.10.31 |
Java8) Optional이란? (null을 처리하는 또 다른 방법) (0) | 2022.10.31 |