[JAVA8] 자바 8 애노테이션의 변화

이재훈·2023년 5월 24일
0

JAVA8

목록 보기
15/23

인프런 강의 "더 자바, JAVA8"(백기선님)의 강의를 듣고 정리한 글 입니다.
JAVA8에 추가된 핵심 기능들을 이해하기 쉽게 설명해 주시니 한번씩 들어보시는 것을 추천드립니다.

"더 자바, JAVA8 바로가기"


애노테이션 관련 두가지 변화

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

타입 선언부

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

타입에 사용할 수 있으려면

  • TYPE_PARAMETER: 타입 변수에만 사용할 수 있다.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_PARAMETER) // ElementType.TYPE_PARAMETER 사용 시
public @interface Pasta {

}
public class LikePasta<@Pasta T> { // 이 부분에 사용이 가능하다.
        public static <@Pasta C> void print(C c) { // 이 부분에 사용이 가능하다.

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

}

@Pasta
public class App {
    public static void main(@Pasta String[] args) throws @Pasta Exception{
        List<@Pasta String> names = Arrays.asList("jay");
    }

    static class LikePasta<@Pasta T> {
        public static <@Pasta C> void print(@Pasta C c) {

        }
    }
}

중복 사용할 수 있는 애노테이션 만들기

  • 중복 사용할 애노테이션 만들기
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@Repeatable(PastaContainer.class)
public @interface Pasta {
    String value();
}
  • 중복 애노테이션 컨테이너 만들기
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface PastaContainer {

    Pasta[] value();
}
  • 컨테이너 애노테이션은 중복 애노테이션과 @Retention 및 @Target이 같거나 더 넣어야 한다.
@Pasta("a")
@Pasta("b")
@Pasta("c")
public class App {
    public static void main(String[] args){
        Arrays.stream(App.class.getAnnotationsByType(Pasta.class)).forEach(s -> System.out.println(s.value()));
    }
}
// 출력값
a
b
c
profile
부족함을 인정하고 노력하자

0개의 댓글