[Java 8] 애노테이션의 변화

홍정완·2022년 7월 2일
0

Java

목록 보기
15/25
post-thumbnail

두 가지 큰 변화

  • 자바 8부터 애노테이션을 타입 선언부에도 사용할 수 있게 됨
  • 자바 8부터 애노테이션을 중복해서 사용할 수 있게 됨



타입 선언 부

  • 제네릭 타입
  • 변수 타입
  • 매개변수 타입
  • 예외 타입
  • ...



타입에 사용할 수 있으려면


  • TYPE_PARAMETER

    • @Target({ElementType.TYPE_PARAMETER})
    • 타입 변수에만 사용할 수 있다.



@Chicken

@Retention(RetentionPolicy.RUNTIME) // 이 애노테이션 정보를 언제까지 유지할 것인가
@Target(ElementType.TYPE_PARAMETER) // 이 애노테이션을 사용할 곳
public @interface Chicken {

}

public static <@Chicken C>/*타입 파라미터*/ void print(C c/* 타입 */){
	System.out.println(c);
}



  • TYPE_USE

    • @Target({ElementType.TYPE_USE})
    • 타입 변수를 포함해서 모든 타입 선언부에 사용할 수 있다.



@Pizza

@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이 같거나 더 넓어야 한다.



@Chicken

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@Repeatable(ChickenContainer.class)
public @interface Chicken {
    String value();
}

ChickenContainer

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface ChickenContainer {
    Chicken[] value();
}

@Chicken("양념")
@Chicken("마늘")
@Chicken("간장")
@Chicken("후라이드")
public class AppForJava8Annotation {

    public static void main(String[] args) {
        Chicken[] chickens = AppForJava8Annotation.class.getAnnotationsByType(Chicken.class);

        Arrays.stream(chickens).forEach(c -> {
            System.out.println(c.value());
        });

        System.out.println(" ");

        ChickenContainer chickenContainer = AppForJava8Annotation.class.getAnnotation(ChickenContainer.class);
        Arrays.stream(chickenContainer.value()).forEach(c -> {
            System.out.println(c.value());
        });
    }
}
profile
습관이 전부다.

0개의 댓글