어노테이션이란?
메타데이터로서 프로그램에 추가적인 정보를 제공해준다. Java5에서 추가됨.
자바 애너테이션은 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다.
컴파일러에게 정보 제공 - 어노테이션은 컴파일러에게 에러나 suppress warnings를 알림
Compile-time and deployment-time processing - 소프트웨어 툴에서 코드 , XML 파일등을 생성하는데 사용될 수 있음
Runtime processing - 런타임에서 일부 어노테이션을 사용할 수 있음
에노테이션 정의하는 방법
클래스나 메서드위에 붙음. 클래스가 컴파일되거나 실행될 때 어노테이션을 통해 클래스가 다르게 실행이 가능.
자바가 제공하는 기본 어노테이션
docs.oracle.com/javase/tutorial/java/annotations/predefined.html
@Deprecated
Deprecated가 붙은 대상은 deprecate (중요도가 떨어져 더 이상 사용되지 않고 앞으로는 사라지게 될 ) 되어 더 이상 쓰이지 않음을 알림
// Javadoc comment follows
/**
* @deprecated
* explanation of why it was deprecated
*/
@Deprecated
static void deprecatedMethod() { }
@Override
Override가 붙은 대상은 superclass를 override를 했음을 알림
// mark method as a superclass method
// that has been overridden
@Override
int overriddenMethod() { }
@SuppressWarning
컴파일러에게 발생할 수 있는 경고를 제한하는 역할을 한다
// use a deprecated method and tell
// compiler not to generate a warning
@SuppressWarnings("deprecation")
void useDeprecatedMethod() {
// deprecation warning
// - suppressed
objectOne.deprecatedMethod();
}
커스텀 어노테이션 만들기
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Study {
public String name();
}
public class MyStudy {
@Study(name = "Java")
public void joinWhiteShip(){
System.out.println("study, halle?");
}
}
public class Main {
public static void main(String[] args) throws NoSuchMethodException {
final Method method = MyStudy.class.getMethod("joinWhiteShip");
if (method.isAnnotationPresent(Study.class)) {
final Annotation annotation = method.getAnnotation(Study.class);
final Study study = (Study) annotation;
System.out.println(study.name()); // Prints Java
}
MyStudy myStudy = new MyStudy();
try {
method.invoke(myStudy); //study, halle?
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
myStudy.joinWhiteShip(); // study, halle?
}
}
@Retention
Annotation으로 명시된 대상이 얼마나 유지되는지 알림
- RetentionPolicy.SOURCE – 소스 단계에서 유지되며, 컴파일러에 결정
- RetentionPolicy.CLASS – compile time에서 유지되며 , Java Virtual Machine (JVM)에 결정
- RetentionPolicy.RUNTIME – JVM에서 유지되며 runtime 환경에 결정
@Target 어떤 종류의 자바 대상에 적용할 것인지를 알림
- ElementType.ANNOTATION_TYPE - 어노테이션 타입에 적용
- ElementType.CONSTRUCTOR - 생성자에 적용
- ElementType.FIELD - 변수에 적용
- ElementType.LOCAL_VARIABLE - 지역변수에 적용
- ElementType.METHOD - 메서드에 적용
- ElementType.PACKAGE - 패키지에 적용
- ElementType.PARAMETER - 메서드 파라미터에 적용
- ElementType.TYPE - 클래스 내 아무 대상이나 적용
@Document
Document 가 붙은 어노테이션이 Javadoc 에 문서화되는 것을 알림
어노테이션 프로세서
어노테이션에 대한 컴파일 타임에 어노테이션을 스캔하고 처리하기 위한 도구
어노테이션만으로도 여러 모델 클래스들을 만들어낼 수 있는 팩토리를 구성할 수 있다.