본문 바로가기

IT/java

[java] java Annotation

Java Annotation


 

@Deprecated

메소드, 클래스, 필드가 더 이상 사용하지 않을 것을 권장한다.

현재는 backward compatiblity 차원에서 지원되나, 차후 버전에는 지원되지 않을 수 있다.

컴파일러는 이 Annotation이 붙은 요소를 사용하면 컴파일 시 경고 메시지를 보여준다.

-- 설명

기존에 있는 해당 메소드를 쓰지 말고 필요하면 다른걸로 만들어서 써달라는 의미로 사용한다.

즉 여러분이 이 프로그램을 만들었는데 지금은 이 기능을 지원하지만 다음 버전업된 프로그램에서는 이런 기능을 없애려 한다던지 다음부터는 더 향상된 다른 기능으로 대체하려고 계혹하고 있는데 기존에 지원하던 기능을 계속해서 쓴다면 나주에 여러분이 계획했던 프로그램을 만들때 많은 비용과 시간에 차질이 생길 수 밖에 없을 것이다. 이런 것을 방지하고자 만든 기능이다.

컴파일시는 아래 메세지를 준다.

Note: C:\Test.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

 

@Override

메소드를 명시적으로 오버라이드한다.

오버라이드할 때 이 Annotation이 필요하지는 않다.

다만 상위 메소드를 하위 메소드에서 명시적으로 오버라이드함을 표기함으로써

컴파일러가 컴파일 시 오버라이드가 발생하는지를 검사한다.

상위 메소드명과 다르게 작성함으로써

오버라이딩이 아닌 오버로딩의 발생을 조기에 차단할 수 있다.

-- 설명

위의 예제에서는 @Override를 썼지만 two( ) 메소드의 오버라이드를 정확히 구현하였으니 문제가 없어 컴파일시 아무런 에러도 나지 않고 프로그램이 실행된다. 하지만 여러분이 void two( ) 메소드 대신에 void twp( ) 메소드로 이름을 잘못 썼다던지 void two(int a) 메소드로 매개변수를 넣었다던지 하면 컴파일시 에러가 난다. 직접 이런 식으로 고쳐서 실행해 보기 바란다. 에러가 나서 실행이 되지 않을 것이다. 정말 대단하지 않은가? 만약 two( ) 메소드앞에 @Override 어노테이션이 없었다면 철자가 틀리든 매개변수가 있든 상관하지 않고 에러없이 실행된다. 상속받았다고 해서 오버라이드만 하라는 법은 없으니까 말이다. twp( )라고 썼으면 자바는 메소드를 새롭게 인식해서 실행할 것이고 two(int a)도 자바의 다형성 중에 하나인 오버로딩한 형태로 인식하므로 전혀 문제될것이 없다. 이런 기능이 굳이 필요할까? 라고 반문하는 이가 있을지 모르겠다.

 

@SuppressWarnings

컴파일러가 컴파일 시에 경고 메시지를 보여주지 않도록 한다.

현재 사용가능한 경고는 "deprecation"과 "unchecked"가 있다.

"unchecked"는 Generics를 사용하지 않을 경우 발생하는 경고이다.

 

@SuppressWarnings("rawtypes")


all : 모든 경고  
cast : 캐스트 연산자 관련 경고
dep-ann : 사용하지 말아야 할 주석 관련 경고
deprecation : 사용하지 말아야 할 메서드 관련 경고
fallthrough : switch문에서 break 누락 관련 경고
finally : 반환하지 않는 finally 블럭 관련 경고
null : null 분석 관련 경고
rawtypes : 제너릭을 사용하는 클래스 매개 변수가 불특정일 때의 경고
unchecked : 검증되지 않은 연산자 관련 경고
unused : 사용하지 않는 코드 관련 경고

 



## 처리 용 Annotation

JDK 5부터 Annotation Processing Tool인 apt를 제공하고,

JDK 6부터는 자바 컴파일러의 일부가 되었다.

실행 시에 Annotation 정보를 사용하기 위해서 다음과 같이 Annotation Type 정의 앞에

@Retention(RetentionPolicy.RUNTIME)라는 Annotation을 붙인다.

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@interface AnnotationForRuntime {

 // Elements that give information
 // for runtime processing

}

 

 

Reference:
http://java.sun.com/docs/books/tutorial/java/javaOO/annotations.html