본문 바로가기
Computer Sience/Java

[JAVA8] 애노테이션의 변화

by 제우제우 2024. 10. 7.

목차

    • 자바 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 보다 넓어야 한다.


참고 자료 

인프런 백기선님 더 자바, Java 8

 

더 자바, Java 8 강의 | 백기선 - 인프런

백기선 | 자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합

www.inflearn.com

 

 

'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