ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 애노테이션의 변화
    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
Designed by Tistory.