JDK1.1부터 JDK1.4.x까지 사용하던 개발자(나를 포함하여)에게 JDK5(코드명 Tiger)는 어색한 코드 그 자체였다. 그중에서도 메타데이터 개념의 어노테이션(Annotation)은 어색함을 넘어 생소함으로까지 다가오게 된다. 최근 인기있는 Spring과 같은 프레임웤에서는 이 어노테이션을 이해하지 않고는 따라잡을수가 없는 상황이다.

메타데이터(Metadata)는 간단히 말해서 데이터에 대한 데이터이다. 메타데이터는 문서화에 사용될 수 있고 코드 의존성을 트래킹하는데 사용되며 심지어 초기 컴파일 시간 체크를 수행 할 때도 사용될 수 있다. XDoclet 같은 메타데이터용 툴들은 이러한 기능을 핵심 자바 언어로 가져왔고 얼마 동안 자바 프로그래밍 관습의 일부가 되었다고 한다.

 어노테이션은 코드에 추가할 수 있고, 패키지 선언, 유형 선언, 생성자, 메소드, 필드, 매개변수, 변수에 적용할 수 있는 변경자(modifier)이다. Tiger에는 빌트인 어노테이션이 추가되었고 직접 작성할 수 있는 커스텀 어노테이션도 지원한다.

 JSR 175(자바 프로그래밍 언어를 위한 메타테이터 장치) 메타데이터를 핵심 자바 언어로 결합하는 공식 스팩을 제공한다. JSR에 따르면 어노테이션은 "프로그램의 문법에 직접적인 영향을 주지 않는다. 하지만 개발과 전개 툴은 이러한 어노테이션을 읽고 특정 방식으로 처리하면서 부가적인 자바 프로그래밍 언어 소스 파일, XML 문서 등을 만들어내서 어노테이션을 포함하고 있는 프로그램과 결합하여 사용될 수 있게 한다."

메타데이터의 가치는 컴파일러체크와 코드분석을 하는데 유용하다. 어노테이션을 이러한 기능으로 사용할수 있다.


어노테이션의 종류

  • Marker 어노테이션은 변수가 없다. 이 어노테이션은 이름으로 구분되며 추가 데이터 없이 나타난다. 예를 들어, @MarkerAnnotation은 marker 어노테이션이다. 데이터가 없으며 단지 어노테이션 이름만 있을 뿐이다.
  • Single-value 어노테이션은 marker와 비슷하지만 데이터를 제공한다. 싱글 비트 데이트를 제공하기 때문에 간단한 신택스를 사용할 수 있다. (단, 어노테이션 유형이 이 문법을 수용해야 함): @SingleValueAnnotation("my data")이는 @표시만 제외하고는 일반적인 자바 메소드 호출과 비슷하다.
  • Full 어노테이션은 다중 데이터 멤버를 갖고 있다. 결과적으로 전체 신택스를 사용해야 한다. (그리고 어노테이션은 일반 자바 메소드와 더 이상 비슷하지 않다): @FullAnnotation(var1="data value 1", var2="data value 2", var3="data value 3")
  • Default syntax를 통해 어노테이션에 값을 제공하는 것 외에도 한 개 이상의 값을 전달해야 할 때 name-value쌍을 사용할 수도 있고 값 어레이를 제공할 수 있다. 이때는 중괄호({})를 사용한다


    빌트인 어노테이션의 사용예

    (java 5 -Tiger에서는 아래 3개의 표준 어노테이션을 제공한다.)
    Override - Override는 메소드에 대해서만 사용되는 Marker어노테이션이다. (클래스, 패키지 선언, 기타 구조체는 사용불가.) 주석이 첨가된 메소드는 수퍼클래스에서 메소드를 오버라이드한다는 것을 나타낸다. interface를 implements하는데 있어서 제일 많이 사용하게 되는 어노테이션이라 할수 있다.

    Deprecated
    - Marker어노테이션. 더 이상 사용되지 말아야 하는 메소드 또는 클래스나 인터페이스에 주석을 단다.

    SupressWarnings
    - 새로워진 자바 컬렉션의 경우 generics는 모든 유형의 새로운 type-safe 작동을 만든다. 하지만 이를 무시할 경우 컴파일러 경고를 받게 되는데, 이러한 경고를 무시하고 싶다면 이 어노테이션을 사용한다. 변수에 들어갈 값들은 한개 또는 여러개일 경우에는 {}로 묶인 어레이 형태로 들어가게 된다.

    참고문서 : http://www.ibm.com/developerworks/kr/library/j-annotate1/index.html