본문 바로가기

Java Programming

Annotations

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
자바 공부를 하다보면 간혹가다가 '@' 이렇게 생긴 특수 문자를 사용하는 경우를 볼 수 있습니다. 일단 제가 봤던 경우를 예로 들자면 메소드 오버라이딩 할때 쓰거나, Junit에서 Test할 메소드 위에 @Test 이런식으로 붙여 줬었는데요.

한번은 이런적이 있었습니다. 이클립스를 사용하면서 보면 클래스 명에 노란색 밑줄이 그어지면서 warning 메시지가 보이는 현상이 있는데 정말 신경쓰이더군요. 해결을 해주면 @SuppressWarnings()가 클래스 선언부 위쪽에 생성되면서 경고 메시지가 사라집니다.

도대체 저 어노테이션이라는 것은 무엇을 하는것일까? 너무 궁금해서 조사를 해보았습니다. 출처는 역시 Sun에서 제공하는 Java Tutorial입니다.

일단 어노테이션의 의미 자체는 '주석' 이라는 의미입니다. 어느정도 대충 짐작은 가지만.. 일단 먼저 알아보도록 하겠습니다.

Annotations
Annotations provide data about a program that is not part of the program itself. They have no direct effect on the operation of the code they annotate.

Annotations have a number of uses, among them:

  • Information for the compiler — Annotations can be used by the compiler to detect errors or suppress warnings.

  • Compiler-time and deployment-time processing — Software tools can process annotation information to generate code, XML files, and so forth.

  • Runtime processing — Some annotations are available to be examined at runtime.
Annotations can be applied to a program's declarations of classes, fields, methods, and other program elements.
어노테이션은 어떤 프로그램에 대해서 데이터를 제공을 한답니다. 하지만 프로그램의 일부는 아니라는 겁니다. (내부적으로는 크게 영향을 주지 않는다는 의미 같습니다.) 어노테이션의 역할은 크게 세가지로 분류를 할수 있습니다.

컴파일러를 위한 정보를 제공- 컴파일러에게 에러를 찾거나 경고메시지를 없애도록 알려준다.

컴파일 시간과 분산 시간의 수행 - 코드를 생성하거나 XML 파일을 만드는등 주석정보를 소프트웨어 툴이 만들수 있다(정확한 의미를 모르겠군요)

런타임 프로세싱 - 어떤 어노테이션들은 실행중에 검사될 수 있다.
어노테이션 자체는 로직에 영향을 미치지 않기 때문에 크게 중요한 역할을 가지고 있는것 같지는 않습니다. 튜토리얼을 살펴보면 Documentation, Annotation used by the compiler, Annotation Processing 이렇게 세 단락으로 나누어서 정리를 해놓았는데요. Documentation에서는 그야말로 주석처럼 특히 개발 그룹을 위한 코드의 주요 정보에 대해서 어노테이션을 활용하여 기록을 남기는 방법을 써놓았습니다. 그 중에서 interface 선언문 앞에 어노테이션을 사용하는 경우가 있었는데 그 경우는 튜토리얼에서 자세히 알아보지 않은 관계로.. 그냥 넘어가도록 하겠습니다.

Annotation used by the Compiler 단락에서는 @Override, @Deprecated, @SuppressWarnings에 대해서 설명을 했으며 이것 역시 단순히 경보를 지워주는 역할을 담당하고 주석을 통해서 자세한 정보를 알려주는 역할을 합니다.

Annotation Processing 단락에서는 @Retention(RetentionPolicy.RUNTIME) 이런 기호를 사용하는데 자세한건잘 이해할수가 없었습니다.