JAVA8 추가된 Annotation

Ahri·2022년 1월 11일
0

JAVA

목록 보기
6/6

인프런의 더자바, JAVA8 강의를 들으며 정리한 내용입니다.

어노테이션이 궁금하다면 여기부터 읽어보세요:)
어노테이션이란?

JAVA8 추가된 Annotation 변화

1. Annotation 을 타입 선언부에서도 사용할 수 있음

@Target({ElementType.TYPE_PARAMETER}) // 타입 변수에만 사용
@Target({ElementType.TYPE_USE}) // 타입 변수를 포함해서 모든 타입 선언부에 사용

TYPE_PARAMETER 사용예제

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_PARAMETER})
public @interface Chicken {
}

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

타입에 선언하려고 한다면?

TYPE_USE 사용예제

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
public @interface Pizza {
}

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

2. Annotation 을 중복해서 사용할 수 있음

중복 예제

컨테이너 어노테이션은 중복 사용하려는 어노테이션의 @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());
        	});
        // 고르존졸라, 슈퍼슈프림
        }
}

0개의 댓글