Java에서 어노테이션(Annotation)이란?

주의

이 문건은 과거 Hexo 블로그 (2017-02-14) 에서 이동된 문서입니다.

시간이 지남에 따라 최신 기술과 다를 수 있으니 주의 바랍니다.



Java에서 어노테이션(Annotation) 이란?

자바 개발을 하다 보면 클래스 또는 메서드 또는 변수 앞에 @Override 같은 @ 표시를 많이 봤을 것입니다.
이 어노테이션은 JEE5(Java Platform, Enterprise Edition 5)부터 새롭게 추가된 요소입니다.

이 어노테이션으로 인해 데이터의 유효성 검사 등을 쉽게 알 수 있고, 이와 관련한 코드가 깔끔해지게 됩니다.
일단 어노테이션의 용도는 다양한 목적이 있지만 메타 데이터의 비중이 가장 크다 할 수 있습니다.

메타-테이터(Meta-Data) : 데이터를 위한 데이터를 의미하며, 풀어 이야기하면 한 데이터에 대한 설명을 의미하는 데이터. (자신의 정보를 담고 있는 데이터)

Java에서 기본적으로 제공하는 어노테이션 종류

  1. @Override

    • 선언한 메서드가 오버라이드 되었다는 것을 나타냅니다.
    • 만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생 시킵니다.
  2. @Deprecated

    • 해당 메서드가 더 이상 사용되지 않음을 표시합니다.
    • 만약 사용할 경우 컴파일 경고를 발생 키십니다.
  3. @SuppressWarnings

    • 선언한 곳의 컴파일 경고를 무시하도록 합니다.
  4. @SafeVarargs

    • Java7 부터 지원하며, 제너릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시합니다.
  5. @FunctionalInterface

    • Java8 부터 지원하며, 함수형 인터페이스를 지정하는 어노테이션입니다.
    • 만약 메서드가 존재하지 않거나, 1개 이상의 메서드(default 메서드 제외)가 존재할 경우 컴파일 오류를 발생 시킵니다.

어노테이션은 어떻게 구성되어 있을까?

먼저 어노테이션의 구조를 보기 위해서 아래의 코드를 참고해 봅니다. (예를 위해 작성된 커스텀 어노테이션입니다.)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
	boolean isCheck() default true;
}

먼저 1번, 2번의 어노테이션 선언에 쓰인 어노테이션은 메타 어노테이션(Meta Annotation)이라 하며 이를 이용해 커스텀 어노테이션을 작성할 수 있게 됩니다.

메타 어노테이션의 종류

  1. @Retention

    • 자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정합니다.
    • 종류는 다음과 같습니다. - RetentionPolicy.SOURCE : 컴파일 전까지만 유효. (컴파일 이후에는 사라짐) - RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효. - RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능. (리플렉션 사용)
  2. @Target

    • 어노테이션이 적용할 위치를 선택합니다.
    • 종류는 다음과 같습니다.

      • ElementType.PACKAGE : 패키지 선언
      • ElementType.TYPE : 타입 선언
      • ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
      • ElementType.CONSTRUCTOR : 생성자 선언
      • ElementType.FIELD : 멤버 변수 선언
      • ElementType.LOCAL_VARIABLE : 지역 변수 선언
      • ElementType.METHOD : 메서드 선언
      • ElementType.PARAMETER : 전달인자 선언
      • ElementType.TYPE_PARAMETER : 전달인자 타입 선언
      • ElementType.TYPE_USE : 타입 선언
  3. @Documented

    • 해당 어노테이션을 Javadoc에 포함시킵니다.
  4. @Inherited

    • 어노테이션의 상속을 가능하게 합니다.
  5. @Repeatable

    • Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 해줍니다.

어노테이션은 기본적으로 인터페이스 형태를 취하고 있으며, 단지 interface 앞에 @ 표시를 해줍니다.
어노테이션의 필드에서는 enum, String이나 기본 자료형, 기본 자료형의 배열을 사용할 수 있습니다.

어노테이션에 대한 이론적인 부분은 여기까지이며, 이를 활용하여 커스텀 어노테이션을 작성하는 것은 다음 포스트에서 다루도록 하겠습니다.

커스텀 어노테이션 만들고 사용하기


Written by@MHLab
로또는 흑우집합소 🎲
와인관리, 시음노트, 셀러관리는 마와셀 🥂

🫥 My Service|  📜 Contact|  💻 GitHub