Nested Annotation

Annotation 중첩

필요에 의해 Annotation을 중첩하여 작성해야 하는 경우가 있다. 이 문서에서는 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을 생성할 수 있다.

중첩 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 = "파이리")
})

Last updated