어노테이션
이란 무엇이며 어떤 상황에서 사용되나요?
자바의 어노테이션
은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @
기호를 앞에 붙여 사용한다. JDK 1.5 버전 이상에서 사용 가능하다. 자바 어노테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다.
주로 컴파일러, 런타임, 개발 도구 등에게 특정한 정보를 전달하거나 프로그램의 동작을 제어하기 위해 사용된다.
어노테이션을 사용하여 컴파일러에게 특정한 동작을 지시할 수 있다.
예를 들어 @Deprecated
어노테이션은 해당 요소가 더 이상 권장되지 않는다는 것을 표시하여 컴파일러가 경고를 표시할 수 있도록 한다.
어노테이션을 사용하여 런타임에 동적으로 처리할 수 있는 정보를 제공할 수 있습니다. 예를 들어, @RequestMapping
어노테이션은 웹 애플리케이션 URL 경로와 요청 핸들러 메서드를 매핑하는데 사용한다.
어노테이션을 사용하여 코드 분석 도구나 문서 생성 도구에게 추가 정보를 제공할 수 있다. 예를 들어 Javadoc 도구는 @param, @return, @throws
등의 어노테이션을 사용하여 메서드의 매개변수, 반환값, 예외 정보를 문서화할 수 있다.
어노테이션을 사용하여 개발자가 자신의 애플리케이션에 맞는 기능을 확장할 수 있다. 예를 들어 프레임워크에서는 사용자는 특정 클래스를 컴포넌트로 등록하기 위해 @Component 어노테이션을 정의하고 사용할 수 있다.
@Override
public void overrideMethod() {
super.overrideMethod();
}
메소드를 오버라이드하겠다는 의미로 메소드의 선언 앞에 붙여준다. 만약 상속받은 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드가 없다면 컴파일 오류가 발생한다.
@Deprecated
public void deprecatedMethod() {
super.deprecatedMethod();
}
메소드를 Deprecated
시킨다. 이 메소드를 사용하는 애플리케이션을 컴파일 할 경우 컴파일 경고가 발생한다. 하위호환을 위해서 메소드 자체를 없애지는 못하지만 사용하지 말 것을 사용자에게 알리고 싶을 때 붙여준다.
@SuppressWarnings("all")
public void supressWarningsMethod() {
System.out.println("hello");
}
컴파일러 경고를 출력하지 않도록 설정한다. SuppressWarnings
어노테이션은 인자를 받는데 인자에 따른 의미는 다음과 같다.
제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시
자바에서 람다 함수를 위한 인터페이스를 지정한다. 함수형 인터페이스에 사용하기 적합하지 않은 경우(메소드가 없거나 두 개 이상이라면)에는 컴파일 오류가 발생한다.
메타 어노테이션은 어노테이션을 정의할 때 사용되는 어노테이션이다. 이는 어노테이션을 정의할 때 메타 어노테이션을 적용하여 어노테이션의 동작 방식이나 범위를 지정할 수 있다.
주요한 메타 어노테이션으로는 다음과 같은 것들이 있다:
@Target
: 어노테이션을 적용할 수 있는 대상(클래스, 메서드, 필드 등)을 지정한다. 예를 들어, @Target(ElementType.METHOD)
와 같이 사용하면 해당 어노테이션은 메서드에만 적용될 수 있다.
@Retention
: 어노테이션의 유지 정책을 지정한다. 즉, 해당 어노테이션 정보가 언제까지 유지될지를 결정한다. 주로 RetentionPolicy.SOURCE
, RetentionPolicy.CLASS
, RetentionPolicy.RUNTIME
중 하나를 선택하여 사용한다.
@Documented
: 어노테이션에 대한 문서화 여부를 지정한다. @Documented
가 적용된 어노테이션은 Javadoc과 같은 문서 생성 도구를 통해 어노테이션 정보가 문서에 포함된다.
@Inherited
: 상속이 가능한 어노테이션을 지정한다. 즉, 부모 클래스에 적용된 어노테이션이 자식 클래스에도 상속된다.
주어진 코드는 자바에서 어노테이션을 사용하여 메서드에 적용된 어노테이션 값들을 가져와 출력하는 예시이다.
MyAnnotation
은 메서드에 적용할 수 있는 어노테이션이다.value
라는 속성을 가지며, 기본값으로 "MyAnnotation : default value"를 가진다.@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "MyAnnotation : default value";
}
@MyAnnotation
public void customTest() {
System.out.println("custom hello!");
}
@MyAnnotation(value = "change custom!")
public void changeCustomTest() {
System.out.println("change!!!");
}
customTest()
메서드에 @MyAnnotation
어노테이션이 적용됐다.changeCustomTest()
메서드에는 @MyAnnotation(value = "change custom!")
어노테이션을 적용했다.public class Main {
public static void main(String args[]) {
Method[] methods = Child.class.getMethods();
for (Method method : methods) {
if (method.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = method.getDeclaredAnnotation(MyAnnotation.class);
String value = annotation.value();
System.out.println(method.getName() + "// value = " + value);
}
}
}
}
main()
메서드에서 Child
클래스의 메서드들에 적용된 어노테이션 값을 가져와 출력한다.Child.class.getMethods()
를 사용하여 Child
클래스의 모든 메서드를 배열로 가져온다.MyAnnotation
어노테이션이 적용되어 있는지 확인한다.value
속성 값을 출력한다.customTest()
메서드의 어노테이션 값은 기본값인 "MyAnnotation : default value"가 출력된다.changeCustomTest()
메서드의 어노테이션 값은 "change custom!"가 출력된다.