목차
- 자바 8부터 애노테이션을 타입 선언부에도 사용할 수 있다.
- 자바 8부터 애노테이션 중복 사용이 가능하다
자바 8부터 애노테이션을 타입 선언부에도 사용할 수 있다.
타입 선언부: 타입 파라미터 / 타입
타입 파라미터와 타입의 차이
- 타입 파라미터: 제네릭 클래스나 메소드에서 동적으로 타입을 지정하기 위해 사용하는 매개변수이다.
컴파일 시점에 구체적인 타입으로 대체된다. - 타입: 구체적인 데이터 타입이다.
예를 들어, String, Integer, List<String> 등은 타입이다.
이는 타입 파라미터가 대체되는 구체적인 타입이 된다.
타입 파라미터에 적용 → ElementType.TYPE_PARAMETER
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_PARAMETER})
public @interface Chicken {
}
여기 치킨이라는 애노테이션이 있다.
해당 애노테이션의 @Target은 TYPE_PARAMETER 이다.
즉 타입 파라미터에 적용이 가능하다는 뜻이다.
static class FeelsLikeChicken<@Chicken T>{ // 타입 파라미터
public static <@Chicken C> void print(C c){ // <C>: 타입 파라미터 C: 타입
System.out.println(c);
}
}
타입 파라미터에 @Chiken 애노테이션을 적용
타입인 C에는 적용을 하면 컴파일 에러가 발생한다.
모든 타입 선언부 전부 적용 → ElementType.TYPE_USE
@Chicken
public class App {
public static void main(@Chicken String[] args) throws @Chicken RuntimeException{
List<@Chicken String> names = Arrays.asList("jeu");
}
static class FeelsLikeChicken<@Chicken T>{ // 타입 파라미터
public static <@Chicken C> void print(@Chicken C c){ // <C>: 타입 파라미터 C: 타입
System.out.println(c);
}
}
}
애노테이션 중복 사용이 가능하다
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
@Repeatable(ChickenContainer.class)
public @interface Chicken {
String value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
public @interface ChickenContainer {
Chicken[] value();
}
@Chicken("양념")
@Chicken("마늘간장")
@Chicken("후라이")
public class App {
public static void main(String[] args) throws RuntimeException{
Chicken[] chickens = App.class.getDeclaredAnnotationsByType(Chicken.class);
Arrays.stream(chickens)
.forEach(c -> System.out.println(c.value()));
ChickenContainer chickenContainer = App.class.getAnnotation(ChickenContainer.class);
Arrays.stream(chickenContainer.value())
.forEach(c -> System.out.println(c.value()));
}
}
// 출력
양념
마늘간장
후라이
양념
마늘간장
후라이
참고
컨테이너(ChickenContainer)의 @Target 범위와 @Retention의 범위는 @Repeatable로 사용되는 @Chicken 보다 넓어야 한다.
참고 자료
'Computer Sience > Java' 카테고리의 다른 글
[JAVA] JVM 전체 구조 정리 (1) | 2024.10.08 |
---|---|
[JAVA] 자바, JVM, JDK, JRE (0) | 2024.10.08 |
[JAVA] Annotation (0) | 2024.10.07 |
[JAVA8] CompletableFuture (0) | 2024.10.04 |
[JAVA8] Date & Time (2) | 2024.10.03 |