필요에 의해 Annotation을 중첩하여 작성해야 하는 경우가 있다. 이 문서에서는 Annotation을 중첩하기 위한 내용을 다룬다.
예를 들어 개발자 정보를 명시하기 위한 Annotation을 만든다고 가정해보자.
@Target({ElementType.CLASS, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Developer {
String name();
String department() default "";
String comment() default "";
}
이 경우에는 어떤 클래스의 개발자가 3명이라면 다음과 같이 작성해야 한다.
@Developer(name="피카츄")
@Developer(name="라이츄")
@Developer(name="파이리")
public class TestApplication {
public static void main(String[] args){
//생략
}
}
구조화가 되지 않기 때문에 다른 Annotation과 섞일 경우 구분이 어려운 상황이 발생할 수 있다. 이러한 상황을 해결하기 위해 다음과 같이 Annotation을 생성할 수 있다.
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Developers {
public @interface Developer {
String name();
String department() default "";
String comment() default "";
}
Developer[] value();
}
개발자 한 명의 정보를 보관할 수 있는 Developer와 개발자 명단을 보관할 수 있는 Developers를 중첩하여 만들고, Developers에 Developer를 배열로 넣을 수 있도록 선언한다. 이 경우 다음과 같이 표현이 가능하다.
@Developers({
@Developer(name = "피카츄"),
@Developer(name = "라이츄"),
@Developer(name = "파이리")
})
public class TestApplication {
public static void main(String[] args) {
//생
}
}
Developers를 만들 때 Developer의 이름을 value로 만들어서 이름 생략이 가능하도록 구현하였다. 만약 value가 아니라 list로 설정했다면 Annotation의 형태는 다음과 같이 이름을 명시해야 한다.
@Developers(list={
@Developer(name = "피카츄"),
@Developer(name = "라이츄"),
@Developer(name = "파이리")
})