기본 콘텐츠로 건너뛰기

[ JAVA ] @interface? Annotation??

  Annotation 이란 사전적인 의미대로 주석을 작성하는 것이고, 프로그램적으로 사용할 수 있도록 몇 가지 규칙을 적용한 것이다. 제일 흔한 활용 방식은 부가적인 정보를 제공하기 위한 것이다.

  예를 들어 웹 어플리케이션에서 Controller 에 대한 설정을 하려면 해당 규칙 (Spring Framework 등을 사용한다면 그에 맞도록) 을 xml 설정 파일에 정의를 하고 프레임워크가 구동되면 그 정보를 로드해서 운영되는 것이다. 그러나 Annotation 방식을 사용하게 되면 xml 설정 파일에는 컴포넌트 스캔 정보와 같은 단순한 정보를 설정하고 나머지 부가 정보들은 해당 클래스에 Annotation으로 설정을 해 놓으면 같은 동작을 하게 된다. 좀 더 관리 포인트가 줄어들고 해당 클래스의 Annotation을 보면 어떤 역할을 담당하는지를 알 수 있기 때문에 많이 활용된다.

  실제 구성된 코드에서 보면 "@" 가 붙은 것들을 볼 수 있다. "@" 는 Annotation을 의미하는 것이고, 가장 많이 볼 수 있는 것이 "@Override", "@SupressWarnings", "@Deprecated", "@Controller", "@RequestMapping", ... 등이다.

  Annotation은 다음과 같이 정의를 해서 직접 만들어서 사용할 수도 있다. 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Simple {
    public String defaultVal() default "OK";
    public String val();
}
  위의 코드는 단순한 기능을 제공하는 Annotation을 정의한 것으로 Annotation 의 값을 "val" 이라는 항목으로 받아들일 수 있으며, 값이 지정되지 않은 경우는 기본 값인 "OK" 가 사용될 수 있도록 한 것이다.

  Annotation  구성을 위해 사용되는 항목들은 다음과 같다. 
  • @Target - Annotation이 적용될 대상을 의미하는 것으로 Package, Type (Class),  Constructor, Field, Enum, Local Variable, Method, Parameter 등이 된다.
  • @Retention - Annotation의 정보가 유지되는 범위를 의미하는 것으로 Source, Class, Runtime 등이 된다.
  • @Documented - Annotation이 javadoc 에 포함되도록 한다.
  • @Inherited - Annotation의 상속이 가능하도록 한다.
   위에서 정의된 Annotation은 아래와 같이 사용할 수 있다.

@Simple(val = "Simple Annotation!") 
public class User { 
.....
}
  @Target으로 TYPE을 지정했기 때문에 클래스를 대상으로 지정하면 된다. 그리고 개발할 경우는 다음과 같이 Annotation에 정보를 사용할 수 있다.

...
User user = new User();
System.out.println(user.getClass().getAnnotation(Simple.class).val());
System.out.println(user.getClass().getAnnotation(Simple.class).defaultVal());
...
  위의 코드에서 User 클래스에 정의된 Annotation의 정보를 찾아서 출력을 하고 있기 때문에 실행을 해 보면 다음과 같은 출력을 확인할 수 있다.

Simple Annotation!
OK
  단순한 코드만을 작성한다면 Annotation을 만들어서 사용할 기회가 그렇게 많지는 않겠지만 Framework 과 Library 를 구성하는 경우에는 상당히 유용하게 쓸 수 있는 것이 Annotation 이다. 

댓글