[JAVA] 어노테이션(Annotation)

FE.1·2024년 4월 11일
3
post-thumbnail

자바 어노테이션


  • 어노테이션의 사전적의미는 주석이라는 뜻을 가지고 있다.
  • 인터페이스를 기반으로 한 문법이다.
  • 소스코드에 추가해서 사용할 수 있는 메타 데이터의 일종이다.
  • 어노테이션은 클래스 파일에 내장되어 컴파일러에 의해 생성된 이후 JVM에 포함되어 동작한다.
  • 자바에서 기본으로 제공하는 어노테이션이 많이 있다. 필요에 따라 사용자가 직접 커스텀 어노테이션을 만들어서 사용할 수도 있다.

💡 메타 데이터란?
애플리케이션이 처리해야할 데이터가 아니라 컴파일 과정과 실행 과정에서 코드를 어떻게 처리해야 하는지를 알려주기 위한 추가 정보


어노테이션은 다음 세 가지 용도로 사용된다.

  • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공
  • 소프트웨어 개발 환경이 빌드나 배포 시 코드를 자동으로 생성할 수 있도록 정보 제공
  • 런타임에 특정 기능을 실행하도록 정보 제공

자바 빌트인 어노테이션

  • @Override

    • “메서드를 오버라이드하겠다”는 의미로 메서드의 선언 앞에 붙여준다.
  • @Deprecated

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

    • 컴파일러 경고를 출력하지 않도록 설정한다.(컴파일러 입막음)
    • 여러 설정을 할 수 있는데, 해당 어노테이션이 필요한 경우 그때 찾아보자!
  • @SafeVarargs

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

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

메타 어노테이션

커스텀 어노테이션을 만들 때 사용하는 메타 어노테이션이다.

  • @Retention

    • 어노테이션의 보유 기간을 명명한다.

      RetentionPolicy.Class바이트 코드 파일까지 어노테이션 정보 유지, 리플렉션을 이용해서 어노테이션 정보를 얻을 수 없다.
      RetentionPolicy.Runtime바이트 코드 파일까지 어노테이션 정보를 유지, 리플렉션을 이용해 런타임에 어노테이션 정보를 가져올 수 있다.
      RetentionPolicy.Source컴파일 이후에는 삭제된다.
  • @Documented

    • 자바 Docs에도 어노테이션 정보가 표현된다.
  • @Target

    • 생성할 어노테이션이 적용될 수 있는 위치

      ElementType.TYPE클래스, 인터페이스, 열거 타입
      ElementType.ANNOTATION_TYPE어노테이션
      ElementType.FILED필드
      ElementType.CONSTRUCTOR생성자
      ElementType.METHOD메서드
      ElementType.LOCAL_VARIABLE로컬 변수
      ElementType.PACKAGE패키지
  • @Inherited

    • 자식 클래스가 어노테이션을 상속 받을 수 있다.
  • @Repeatable

    • 반복적으로 어노테이션을 선언할 수 있다.

커스텀 어노테이션 생성


커스텀 어노테이션을 생성하려면 @interface 어노테이션명 형태로 정의해야 한다.

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
	// 어노테이션 속성 정의
	String value() default "기본값 지정";
}

타깃은 메서드로 설정하였고, 메서드를 선언하는 것처럼 어노테이션 속성을 정의할 수 있다.

public class CustomAnnotationRunner {

	@CustomAnnotation(value = "커스텀 어노테이션 적용")
	public static void testMethod1() {
		System.out.println("CustomAnnotationRunner.testMethod1");
	}
}

이렇게 만든 어노테이션은 리플렉션을 활용하여 특정 목적으로 사용할 수 있다.

public class ReflectionMain {

	public static void main(String[] args) {
		Method[] methods = CustomAnnotationRunner.class.getMethods();

		for (Method method : methods) {
			if(method.isAnnotationPresent(CustomAnnotation.class)){
				CustomAnnotation annotation = method.getDeclaredAnnotation(CustomAnnotation.class);
				System.out.println(annotation.value());
			}
		}
	}
}

출력 결과

기본값 지정

참고

profile
공부하자!

0개의 댓글