J2SE 5.0에 추가된 중요한 기능중 하나로, 어노테이션 유형은 일반 클래스와 비슷해보이지만 독특한 속성이 있다.
표기법은 (@)(at) 표시로 하고, 클래스에서 @(at)기호와 함께 사용하여 다른 자바 코드에 주석을 달 수 있다.
주석태그가 코멘트가 아니라 소스에 포함된다. 여기서 중요한 점은 주석이 선언적 프로그래밍 모델을 체계적으로 지원하기 위한 방법이라는 것이다.

The Override Annotation
{code}
package dfi.study.java;
public class OverrideTest01{
public OverrideTest01() { }
@Override
public String toString() {
return super.toString() + " Override Test";
}
@Override
public int hasCode() {
return toString().hashCode();
}
}
- 위의 @Override 어노테이션은 두 개의 메소드, toString()과 hashCode()가 OverrideTest01 클래스의 수퍼클래스 (java.lang.Object)에서
메소드의 버전을 오버라이드 한다는 것을 나타내고 있다.
- 메소드를 오버라이드 하려다가 메소드 이름의 철자를 틀리거나, 잘못된 인자를 지정하거나, 다른 리턴 타입을 설정했던 적이 무수히 많았을 것이다.
이 어노테이션 유형은 코딩하기엔 너무 늦었거나 무언가를 잘못 타이핑했을 때 빛을 발한다.
bq. *Override Annotation의 오타 찾아내기*
!Annotation02.jpg!
- 위 코드에서 hashCode()가 hasCode()로 잘못 표기되었다. @Override 어노테이션은 {color:red}hasCode(){color}가 메소드를 오버라이드해야 한다는 것을 지시한다.
하지만 컴파일시 오버라이드 할 hasCode()라는 메소드가 없다는 것을 알게 되고. 결과적으로 컴파일러는 에러를 표시한다.
h3. 2.2. Deprecated Annotation
- @Override와 마찬가지로 @Deprecated는 marker 어노테이션이다.
- @Deprecated를 사용하여 더 이상 사용되지 말아야 하는 메소드에 주석을 단다. 주의할 점은 더 이상 사용되지 말아야 하는(depreciated) 메소드와
같은 라인상에 놓여져야 한다는 것이다.
- 컴파일러는 프로그램이 비추천(deprecated) 메소드나 클래스 혹은 변수를 사용할 때마다 경고를 발생시킨다.
- 메소드에 @Deprecated 태그를 플래그하면 해당 메소드나 클래스 사용시 사용자에게 경고 메세지를 보내도록 컴파일러를 환기시키는 효과가 있다.
- 태그는 소문자 'd'로 시작하며, Annotation은 대문자' D'로 시작함을 유의해야한다.
- 일반적으로 프로그래머는 비추천 메소드의 사용을 피해야 하며 그것 대신 무엇을 사용해야 하는지를 확인해야 한다.
h3. 2.2.1. @Deprecated 예제
bq. *The Deprecated Annotation*
!Annotation03.jpg!
- 주석이 붙은 클래스도 주석이 붙지 않은 경우와 동일한 방식으로 컴파일한다.
- 이 클래스를 컴파일 할 때 비정상적인 그 어떤 것도 기대해서는 안된다.
!Annotation03_1.jpg!
- 오버라이드 또는 호출이든 @Depreciated 메소드를 사용하면 컴파일러는 어노테이션을 처리하고
메소드가 사용되어서는 안된다는 것을 알게 되고 에러 메시지를 만든다.
h3. 2.3. SuppressWarnings Annotation
- 마지막 어노테이션 유형은 SuppressWarnings으로 가장 흥미롭다고 할 수 있다.
- @SuppressWarnings은 일반적으로 경고하는 내용을 경고하지 말도록 컴파일러에게 지시하는데, 경고는 일종의 범주에 속하므로 주석에 대해
어떤 종류의 경고를 금지할 것인지 지시해야 한다.
- Override와 Deprecated와는 다르게 SupressWarnings는 변수를 갖고 있다. 따라서 이를 작동하게 하려면 싱글-어노테이션 유형을 사용해야한다.
- javac 컴파일러는 all, deprecation, unchecked, fallthrough, path, serial, finally 등 7개의 금지 옵션을 정의한다.
- 언어 스펙은 이 중에서 두 가지 비추천(deprecation)"과 "비확인(unchecked) 만을 정의한다.
- 하나 이상의 경고 종류를 억제하려면 다음의 문법과 같이 사용하면 된다.
@SuppressWarnings({"unchecked", "deprecation"})
h3. 2.3.1. @SuppressWarnings 예제
bq. *The SuppressWarnings Annotation (type-safe가 아닌 Tiger 코드)*
package dfi.study.java;
import java.util.ArrayList;
public class SuppressWarningsTest01
{
public void SuppressWarningsTest01()
{
ArrayList wordList = new ArrayList(); // no typing information on the List
wordList.add("study"); // causes error on list addition
}
}
bq. *non-typed 코드에서 컴파일러 경고*
!Annotation04.jpg!
-컴파일 라인에 {color:red}-Xlint{color}를 추가하면 무엇이 잘못되었는지 구체적으로 표시할 수 있다.
!Annotation04_1.jpg!
bq. *경고 제거하기*
- SuppressWarnings 어노테이션을 사용하여 번거로운 경고를 제거한다
-{color:red}@SuppressWarnings(value={"unchecked"}){color}를 적용함.
package dfi.study.java;
import java.util.ArrayList;
@SuppressWarnings(value={"unchecked"})
public class SuppressWarningsTest01
{
public void SuppressWarningsTest01()
{
ArrayList wordList = new ArrayList(); // no typing information on the List
wordList.add("study"); // causes error on list addition
}
}
!Annotation05.jpg!