Java
[Java8] Annotation의 변화
나프초
2024. 9. 2. 21:30
Annotation 변화
- Java 8부터 어노테이션을 타입 선언부에도 사용할 수 있게 되었다.
- Java 8부터 어노테이션을 중복으로 사용할 수 있게 되었다.
타입 선언부에 사용
- 타입 선언부
- 제네릭 타입
- 변수 타입
- 매개변수 타입
- 예외 타입
- 타입에 사용할 수 있으려면 @Target에 아래 값을 넣어주어야 한다.
- TYPE_PARAMETER : 타입 변수에만 사용할 수 있다.
- TYPE_USE : 타입 변수를 포함하여 모든 타입 선언부에 사용할 수 있다.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_PARAMETER) //타입 변수에만 사용
public @interface Chicken {
//어노테이션 생성
}
public class App {
public static void main (String[] args) {
}
static class FeelsLikeChicken<@Chicken T> {
public static <@Chicken C> void print(C c){
//<C>의 C는 타입 파라미터, C c의 C는 타입으로 다른 것!
}
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE) //모든 타입 선언부에 사용
public @interface Chicken {
//어노테이션 생성
}
@Chicken
public class App {
public static void main (@Chicken String[] args) throws @Chicken RuntimeException {
List<@Chicken String> names = Arrays.asList("cy");
}
static class FeelsLikeChicken<@Chicken T> {
public static <@Chicken C> void print(@Chicken C c){
//<C>의 C는 타입 파라미터, C c의 C는 타입으로 다른 것!
}
}
}
중복으로 사용
- 중복으로 사용할 수 있는 어노테이션 만들기
- 중복 사용할 어노테이션을 만들고, 이를 감쌀 컨테이너 어노테이션을 선언해야 한다.
- Repeatable이라는 어노테이션을 써서, 여러개의 어노테이션들을 컨테이너 어노테이션이 감싸는 형태
- 컨테이너 어노테이션은 중복 사용 어노테이션과 @Retention(얼마나 유지할 건지) 및 @Target(어디에서 사용 가능한지) 이 같거나 더 넓어야 한다.
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@Repeatable(ChickenContainer.class) //중복 가능하도록 설정
public @interface Chicken {
String value();
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
public @interface ChickenContainer {
//어노테이션 생성
}
@Chicken("후라이드")
@Chicken("양념")
public class App {
public static void main(String[] args) {
// 1. 이 타입에 해당하는 정보를 다 가져와서 배열로 받을 수 있음
Chicken[] chickens = App.class.getAnnotationsByType(Chicken.class);
Arrays.stream(chickens).forEach(c -> System.out.println(c.value()));
// 2. 컨테이너 타입으로 가져오는 방법
ChickenContainer chickenContainer = App.class.getAnnotation(ChickenContainer.class);
Arrays.stream(chickenContainer.value()).forEach(c -> System.out.println(c.value()));
}
}
/*출력 결과*/
후라이드
양념
더 공부해보자
- annotation
- @Retention : 어노테이션 정보를 언제까지 유지할 것인가
- @Target
- generic
- type parameter
이 포스팅은 더 자바, Java 8 강의를 수강하며 작성되었습니다.
더 자바, Java 8 강의 | 백기선 - 인프런
백기선 | 자바 8에 추가된 기능들은 자바가 제공하는 API는 물론이고 스프링 같은 제 3의 라이브러리 및 프레임워크에서도 널리 사용되고 있습니다. 이 시대의 자바 개발자라면 반드시 알아야 합
www.inflearn.com