검색결과 리스트
Repeatable에 해당되는 글 1건
- 2021.06.17 java 8 정리9
글
java 8 정리9
Java 정리
2021. 6. 17. 16:26
인프런 강의 11일차.
- 더 자바, Java 8 (백기선 강사님)
1. 애노테이션의 변화
- 애노테이션 관련 두가지 큰 변화
> 자바 8부터 애노테이션을 타입 선언부에도 사용할 수 있게 됨.
> 자바 8부터 애노테이션을 중복해서 사용할 수 있게 됨.
2. 타입 선언 부
- 제네릭 타입
- 변수 타입
- 매개변수 타입
- 예외 타입
- ...
3. 타입에 사용할 수 있으려면
- TYPE_PARAMETER : 타입 변수에만 사용할 수 있다.
- TYPE_USE : 타입 변수를 포함하여 모든 타입 선언부에 사용할 수 있다.
4. 중복 사용할 수 있는 애노테이션을 만들기
- 중복 사용할 애노테이션 만들기
- 중복 애노테이션 컨테이너 만들기
> 컨테이너 애노테이션은 중복 애노테이션과 @Retention 및 @Target 값이 같거나 더 넓어야 한다.
package me.whiteship.java8to11;
import java.util.Arrays;
import java.util.List;
@Chicken("양념")
@Chicken("마늘간장")
public class App {
public static <List> void main(String[] args) {
//Case 1. Type으로 가져오는 방법
//chiken type이 해당하는 것을 다 가져온다.
//즉, 양념, 마늘간장이 배열로 온다
Chicken[] chickens = App.class.getAnnotationsByType(Chicken.class);
Arrays.stream(chickens).forEach(c -> System.out.println(c.value()));
//Case 2. Container로 가져오는 방법
ChickenContainer chickenContainer = App.class.getAnnotation(ChickenContainer.class);
Arrays.stream((chickenContainer).value()).forEach(cc -> System.out.println(cc.value()));
// List<String> names = Arrays.asList("dhpark");
}
//특정 타입을 사용하는 제네릭 클래스 정의
//이 때 사용하는 T, R 등이 타입 파라미터를 의미한다.
//@Target 애노테이션은 해당 제네릭 타입에 사용할 수 있도록 선언하는 것
//static class FeelsLikeChicken<@Chicken T> //@Target(ElementType.TYPE_PARAMETER)가 선언되어있어야 사용 가능
/*
static class FeelsLikeChicken<@Chicken T> {
//TYPE_USE로 사용 시 타입을 사용하는 모든 곳에 사용 가능하다.
//public static <C> void print(@Chicken c)
public static <C> void print(C c) {
System.out.println(c);
}
}
*/
}
package me.whiteship.java8to11;
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME)
//TYPE_PARAMETER, TYPE_USE : java8에서 추가된 옵션
//@Target(ElementType.TYPE_PARAMETER) //해당 애노테이션을 사용할 곳
@Target(ElementType.TYPE_USE) //TYPE_PARAMETER를 포함한 TYPE을 쓰는 모든 곳에 사용 가능
@Repeatable(ChickenContainer.class) //Repeatable 파라미터로 들어가는 class보다 같거나 더 넓은 영역을 커버해야한다.(여러개의 애노테이션을 감싸고 있을 컨테이너 필요)
public @interface Chicken {
String value();
}
package me.whiteship.java8to11;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface ChickenContainer {
Chicken[] value(); //자기 자신이 감쌀 애노테이션의 변수를 가지고 있어야함.
}
'Java 정리' 카테고리의 다른 글
java 8 정리11 (0) | 2021.07.01 |
---|---|
java 8 정리10 (0) | 2021.06.30 |
java 8 정리8 (0) | 2021.06.02 |
java 8 정리7 (0) | 2021.05.26 |
java 8 정리6 (0) | 2021.05.21 |