@Repeatable

@Repeatable은 Java 8버전 이후 메타 어노테이션으로, 어노테이션을 반복 적용할 수 있게 한다. Java8 이전에는 반복 적용하고 싶은 어노테이션은 다음과 같이 적용했다.

// case 1
@GreenColor
@BlueColor
@RedColor
public class RGBColor { ... }

// case 2
@Color(colors={"green", "blue", "red"}
public class RGBColor { ... }

@GreenColor, @BlueColor, @RedColor 이렇게 각각의 어노테이션을 생성하거나, 배열 매개변수를 받아 구현하였다.

Java 8이후 부터는 @Repeatable 어노테이션을 제공해주며, 사용방법은 다음과 같다.

  1. Repeatable Annotation 타입을 선언(실 사용할 어노테이션)

    • @Repeatable에 Container annotation 전달

      @Repeatable(value = Colors.class) // 
      @Retention(RetentionPolicy.RUNTIME)
      public @interface Color {
        String value(); // 
      }
  2. 컨테이너 어노테이션 타입을 포함하여 선언(묶음 값을 관리하는 컨테이너 어노테이션)

    • 컨테이너 어노테이션은 내부 어노테이션을 반환하는 value() 메서드를 정의해야한다.

      @Target(ElementType.TYPE)
      @Retention(RetentionPolicy.RUNTIME)
      @Documented
      public @interface Colors {
        Color[] value();  
      }

위와 같이 @Repeatable 어노테이션으로 구현하면 다음과 같이 어노테이션을 사용할 수 있다.

@Color("green")
@Color("blue")
@Color("red")
public class RGBColor { ... }

이때, 한가지 주의할 점이 있다. 하위 어노테이션(@Color)가 한개만 정의된 경우 컨테이너 어노테이션(@Colors)로 묶이지 않으므로, 하위 어노테이션(@Color)에도 @Retention(RetentionPolicy.RUNTIME)를 선언해주어야한다.

참고

Last updated