Java - annotation

청포도봉봉이·2023년 12월 28일
1

java

목록 보기
7/20
post-thumbnail

어노테이션이란 무엇이며 어떤 상황에서 사용되나요?

Annotation


자바의 어노테이션은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종이다. 보통 @기호를 앞에 붙여 사용한다. JDK 1.5 버전 이상에서 사용 가능하다. 자바 어노테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동한다.

주로 컴파일러, 런타임, 개발 도구 등에게 특정한 정보를 전달하거나 프로그램의 동작을 제어하기 위해 사용된다.

역할


컴파일러 지시

어노테이션을 사용하여 컴파일러에게 특정한 동작을 지시할 수 있다.
예를 들어 @Deprecated 어노테이션은 해당 요소가 더 이상 권장되지 않는다는 것을 표시하여 컴파일러가 경고를 표시할 수 있도록 한다.

런타임 처리

어노테이션을 사용하여 런타임에 동적으로 처리할 수 있는 정보를 제공할 수 있습니다. 예를 들어, @RequestMapping 어노테이션은 웹 애플리케이션 URL 경로와 요청 핸들러 메서드를 매핑하는데 사용한다.

코드 분석 및 문서화

어노테이션을 사용하여 코드 분석 도구나 문서 생성 도구에게 추가 정보를 제공할 수 있다. 예를 들어 Javadoc 도구는 @param, @return, @throws 등의 어노테이션을 사용하여 메서드의 매개변수, 반환값, 예외 정보를 문서화할 수 있다.

커스텀 기능 확장

어노테이션을 사용하여 개발자가 자신의 애플리케이션에 맞는 기능을 확장할 수 있다. 예를 들어 프레임워크에서는 사용자는 특정 클래스를 컴포넌트로 등록하기 위해 @Component 어노테이션을 정의하고 사용할 수 있다.

자바 빌트인 어노테이션


@Overriding

@Override
public void overrideMethod() {
	super.overrideMethod();
}

메소드를 오버라이드하겠다는 의미로 메소드의 선언 앞에 붙여준다. 만약 상속받은 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드가 없다면 컴파일 오류가 발생한다.

@Deprecated

@Deprecated
public void deprecatedMethod() {
	super.deprecatedMethod();
}

메소드를 Deprecated 시킨다. 이 메소드를 사용하는 애플리케이션을 컴파일 할 경우 컴파일 경고가 발생한다. 하위호환을 위해서 메소드 자체를 없애지는 못하지만 사용하지 말 것을 사용자에게 알리고 싶을 때 붙여준다.

@SuppressWarnings

@SuppressWarnings("all")
public void supressWarningsMethod() {
    System.out.println("hello");
}

컴파일러 경고를 출력하지 않도록 설정한다. SuppressWarnings 어노테이션은 인자를 받는데 인자에 따른 의미는 다음과 같다.

  • @SuppressWarnings("all") : 모든 경고를 억제
  • @SuppressWarnings("cast") : 타입 캐스트관련 경고 억제
  • @SuppressWarnings("dep-ann") : 사용하지 말아야할 주석 관련 경고 억제
  • @SuppressWarnings("deprecation") : Deprecated 메소드를 사용한 경우 발생하는 경고 억제
  • @SuppressWarnings("fallthrough") : switch문에서 break 구문 누락 관련 경고 억제
  • @SuppressWarnings("finally") : finally 블럭 관련 경고 억제
  • @SuppressWarnings("null") : null 관련 경고 억제
  • @SuppressWarnings("rawtypes") : 제너릭을 사용하는 클래스 매개 변수가 특정되지 않았을 때의 경고 억제
  • @SuppressWarnings("unchecked") : 검증되지 않은 연산자 관련 경고 억제
  • @SuppressWarnings("unused") : 사용하지 않는 코드 관련 경고 억제

@SafeVarargs

제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시

@FunctionalInterface

자바에서 람다 함수를 위한 인터페이스를 지정한다. 함수형 인터페이스에 사용하기 적합하지 않은 경우(메소드가 없거나 두 개 이상이라면)에는 컴파일 오류가 발생한다.

메타 어노테이션


메타 어노테이션은 어노테이션을 정의할 때 사용되는 어노테이션이다. 이는 어노테이션을 정의할 때 메타 어노테이션을 적용하여 어노테이션의 동작 방식이나 범위를 지정할 수 있다.

주요한 메타 어노테이션으로는 다음과 같은 것들이 있다:

  1. @Target: 어노테이션을 적용할 수 있는 대상(클래스, 메서드, 필드 등)을 지정한다. 예를 들어, @Target(ElementType.METHOD)와 같이 사용하면 해당 어노테이션은 메서드에만 적용될 수 있다.

  2. @Retention: 어노테이션의 유지 정책을 지정한다. 즉, 해당 어노테이션 정보가 언제까지 유지될지를 결정한다. 주로 RetentionPolicy.SOURCE, RetentionPolicy.CLASS, RetentionPolicy.RUNTIME 중 하나를 선택하여 사용한다.

  3. @Documented: 어노테이션에 대한 문서화 여부를 지정한다. @Documented가 적용된 어노테이션은 Javadoc과 같은 문서 생성 도구를 통해 어노테이션 정보가 문서에 포함된다.

  4. @Inherited: 상속이 가능한 어노테이션을 지정한다. 즉, 부모 클래스에 적용된 어노테이션이 자식 클래스에도 상속된다.

커스텀 어노테이션


코드 설명

주어진 코드는 자바에서 어노테이션을 사용하여 메서드에 적용된 어노테이션 값들을 가져와 출력하는 예시이다.

MyAnnotation 어노테이션

  • MyAnnotation은 메서드에 적용할 수 있는 어노테이션이다.
  • 어노테이션의 유지 정책은 런타임까지 유지한다.
  • value라는 속성을 가지며, 기본값으로 "MyAnnotation : default value"를 가진다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    String value() default "MyAnnotation : default value";
}

Child 클래스

@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!") 어노테이션을 적용했다.

Main 클래스

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!"가 출력된다.
profile
서버 백엔드 개발자

0개의 댓글