인프런의 더자바, JAVA8 강의를 들으며 정리한 내용입니다.
어노테이션이 궁금하다면 여기부터 읽어보세요:)
어노테이션이란?
@Target({ElementType.TYPE_PARAMETER}) // 타입 변수에만 사용
@Target({ElementType.TYPE_USE}) // 타입 변수를 포함해서 모든 타입 선언부에 사용
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_PARAMETER})
public @interface Chicken {
}
public static <@Chicken C>/*타입파라미터*/ void print(C c/* 타입 */){
System.out.println(c);
}
타입에 선언하려고 한다면?
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
public @interface Pizza {
}
public static <@Pizza C>/*타입파라미터*/ void println(@Pizza C c/* 타입 */){
System.out.println(c);
}
컨테이너 어노테이션은 중복 사용하려는 어노테이션의 @Retention, @Target 보다 같거나 더 넓어야 함
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
public @interface PizzaContainer {
Pizza[] value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
@Repeatable(PizzaContainer.class) //컨테이너 추가
public @interface Pizza {
String value();
}
@Pizza("고르곤졸라")
@Pizza("슈퍼슈프림")
public class Main {
public static void main(String[] args){
Pizza[] pizzas = Main.class.getAnnotationsByType(Pizza.class);
Arrays.stream(pizzas).forEach(c->{
System.out.println(c.value());
});
// 고르존졸라, 슈퍼슈프림
}
}