-
애노테이션의 변화JAVA/JAVA8 관련 2022. 6. 3. 12:57
애노테이션 관련 두가지 큰 변화
- 자바 8부터 애노테이션을 타입 선언부에도 사용할 수 있게 됨.
- 자바 8부터 애노테이션을 중복해서 사용할 수 있게 됨.
타입 선언 부
- 제네릭 타입
- 변수 타입
- 매개변수 타입
- 예외 타입
- ...
타입에 사용할 수 있으려면
- TYPE_PARAMETER : 타입 변수에만 사용할 수 있다.
- TYPE_USE : 타입 변수를 포함해서 모든 타입 선언부에 사용할 수 있다.
@Retention 애노테이션
- 해당 애노테이션이 언제까지 유지할지 알려주는 애노테이션이다.
RetentionPolicy
- Retention에는 3가지 속성이 존재한다.
- SOURCE, CLASS, RUNTIME
Source :
커스텀 애노테이션을 주석처럼 사용하고 싶으면 옵션을 Source로 주면 된다.
애노테이션이 소스코드단까지만 유지되고, 컴파일 후에는 적용이 되지 않는다.
CLASS :
컴파일 한 .class 파일에서도 애노테이션을 유지한다.
런타임 시 클래스를 메모리로 읽어오면 해당 정보는 사라진다.
RunTime :
클래스를 메모리에 읽어왔을 때까지 유지한다.
public class App { public static void main(@Chicken String[] args) throws @Chicken RuntimeException { List<@Chicken String> names = Arrays.asList("jump","HI!","GOGOGO"); FeelsLikeChicken.print(names); } static class FeelsLikeChicken<@Chicken T> { public static <@Chicken C>void print(C c) { System.out.println(c); } } }
@Retention(RetentionPolicy.RUNTIME) //이 어노테이션 정보를 언제까지 유지할것인지. @Target(ElementType.TYPE_USE) //이 어노테이션을 사용할 곳 public @interface Chicken { }
애노테이션 중복 사용
@Repeatable을 사용해서 중복사용이 가능하게 설정할 수 있음.
해당 애노테이션을 사용하여, 중복으로 사용하기 위해서는 애노테이션을 포괄하는 컨테이너 개념의 애노테이션이
존재해야 한다.
@Chicken("양념치킨") @Chicken("후라이드치킨") public class App { public static void main(String[] args) { Chicken[] chickens = App.class.getAnnotationsByType(Chicken.class); Arrays.stream(chickens).forEach(c -> { System.out.println(c.value()); }); } }
@Retention(RetentionPolicy.RUNTIME) //이 어노테이션 정보를 언제까지 유지할것인지. @Target(ElementType.TYPE_USE) //이 어노테이션을 사용할 곳 @Repeatable(ChickenContainer.class) public @interface Chicken { String value(); }
// Chicken 애노테이션을 포괄하는 ChickenContainer 애노테이션 생성 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE_USE) public @interface ChickenContainer { Chicken[] value(); }
'JAVA > JAVA8 관련' 카테고리의 다른 글
CompletableFuture2 (0) 2022.05.31 CompletableFuture1 (0) 2022.05.31 Callable과 Future (0) 2022.05.28 Concurrent - Executor (0) 2022.05.22 Concurrent 프로그래밍 소개 (0) 2022.05.20