본문 바로가기

Java

자바의 애노테이션은 어떻게 사용하는 걸까? @interface의 진짜 의미와 활용법

이번에는 애노테이션에 대해서 학습할게요.

자바를 이용하면서 애노테이션을 많이 사용하는데, 정확한 의미는 잘모르는 것 같아서 찾아볼게 많을 것 같네요. ㅎㅎ

 

주석이라고 해석할 수 있는 Annotation은 자바에서 어떠한 기능을 하는지 찾아보겠습니다.

annotation oracle document

 

애노테이션은 코드의 동작에 직접적인 영향을 미치지않고, 메타데이터의 형태로 프로그램의 데이터를 제공한다고 합니다.

 

  • 컴파일러에 대한 정보 : 컴파일러는 애노테이션을 사용하여 오류를 감지하거나 경고를 억제할 수 있습니다.
  • 컴파일 시간 및 배포 시간 처리 : 소프트웨어 도구는 애노테이션 정보를 처리하여 코드, XML 파일 등을 생성할 수 있습니다.
  • 런타임 처리 : 일부 애노테이션은 런타임 시 검사할 수 있습니다.

 

Where Annotations Can Be Used

애노테이션은 클래스, 필드, 메소드 및 기타 프로그램 요소의 선언부에 사용할 수 있다고 합니다.

 

애노테이션에 대해서 더 찾아보기위해 오랜만에 자바의 정석 책을 찾아봤는데요. 왜 만들어졌는지에 대해 자세하게 나와있더라구요.

글 내용을 요약해보면, /** ~ */ 같은 주석을 코드와 문서를 하나의 파일로 관리하기 위해서 소스코드에 대한 정보를 저장하고, 소스코드의 주석으로 부터 HTML 문서를 생성하는 프로그램 (Javadoc)을 이용했는데요. 여기서 미리 정의된 태그들을 활용해서 주석안에 정보를 저장하고 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 만든 것이 애노테이션입니다.

 

 

1.   애노테이션을 정의 하는방법

애노테이션가 무엇인지, 왜 생겨났는지 조금은 이해하셨으면, 사용하는 방법에 대해 알아 보겠습니다.

/**
 * Describes the Request-For-Enhancement(RFE) that led
 * to the presence of the annotated API element.
 */
public @interface RequestForEnhancement {
    int    id();
    String synopsis();
    String engineer() default "[unassigned]"; 
    String date()    default "[unimplemented]"; 
}

 

oracle 공식 문서에서 발췌했는데요.

@interface 라는 키워드를 앞에 놓고 사용하면 됩니다. 메서드 선언에는 매개 변수나 throws 절이 없어야 합니다. 반환 유형은 이전 유형의 프리미티브, String, Class, enum, 주석 및 배열로 제한됩니다. 메서드는 기본값을 가질 수 있습니다.

 

사용할때는 클래스나 메서드에 이렇게 붙여서 사용하면 됩니다.

@RequestForEnhancement(
  id       = 1,
  synopsis = "test",
  engineer = "lee jae hoon",
  date     = "3/17/2024"
)
public class AnnotationTest {
  public static void main(String[] args) {
    System.out.println("Hello, World!");
  }

}

 

근데 @interface은 주석 유형이라고 컴파일러에 알려주는 키워드라고 만 나와있는데요. 요게 어떻게 동작하는지 궁금합니다.

인터페이스라고 정의한 것을 보니 애노테이션이 인터페이스의 한종류 같은데 말이죠.

 

좀 더 다양한 시선에서 본 것들

@interface 라는 키워드는 뭘까?

문서를 더 찾아보니 인터페이스의 암시적 확장이라고 설명이 나와있어요.

스택오버플로우에서도 interface와 @interface의 차이가 뭔지 이야기하는 내용도 있네요.

https://stackoverflow.com/questions/918393/whats-the-difference-between-interface-and-interface-in-java

 

What's the difference between interface and @interface in java?

I haven't touched Java since using JBuilder in the late 90's while at University, so I'm a little out of touch - at any rate I've been working on a small Java project this week, and using Intellij ...

stackoverflow.com

 

java.lang.annotation의 Annotation 인터페이스를 간접적으로 사용한다라는 것은 이해했는데, 정확하게는 잘 모르겠네요.

왜 @interface라는 키워드로 만들었을까? 의 궁금증이 풀리진 않네요. 더 찾아보면 공유 해보겠습니다.

 

 

2.   자바의 표준 애노테이션

자바에는 이미 정의된 여러 표준 애노테이션이 있습니다. 가장 대표적인 몇 가지 애노테이션에 대해 소개 해보겠습니다.

 

@Deprecated

더 이상 사용되지 않으며, 향후 버전에서 제거될 수 있음을 나타냅니다. 이 애노테이션이 붙은 요소를 사용할 경우 컴파일러는 경고 메시지를 출력합니다.

@Deprecated
public void oldMethod() {
    // 더 이상 사용되지 않는 메서드
}

 

@Override

메서드가 부모 클래스 또는 인터페이스의 메서드를 오버라이드(재정의)하고 있음을 명시합니다. 이를 통해 컴파일러가 오버라이드 여부를 검사하여 실수를 방지할 수 있습니다.

@Override
public String toString() {
    return "Custom toString method";
}

 

@SuppressWarnings

컴파일러가 특정 경고를 무시하도록 합니다. 예를 들어, 제네릭 타입 미지정으로 인한 경고를 억제할 수 있습니다.

@SuppressWarnings("unchecked")
public void addItems(List items) {
    // 경고 억제
}

 

 

@Retention

애노테이션이 언제까지 유지될지를 결정합니다. 예를 들어, 런타임까지 유지되거나 소스 코드에서만 유지될 수 있습니다.

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    // 커스텀 애노테이션
}

 

@Target

애노테이션이 적용될 수 있는 대상을 지정합니다. 클래스, 메서드, 필드 등 특정 요소에만 애노테이션을 적용할 수 있도록 제한할 수 있습니다.

@Target(ElementType.METHOD)
public @interface MethodAnnotation {
    // 메서드에만 적용 가능
}

 

@Documented

이 애노테이션이 적용된 다른 애노테이션은 Javadoc 같은 문서 생성기에서 자동으로 문서화됩니다.

// @Documented 애노테이션을 적용한 사용자 정의 애노테이션
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface MyCustomAnnotation {
    String author();
    String date();
}

 

3.   애노테이션 프로세서는 어떻게 동작할까?

애노테이션 프로세서는 주로 컴파일 타임에 애노테이션을 분석하고 처리하는데 사용됩니다. 자바에서 애노테이션을 정의했을 때, 이 애노테이션의 정보를 활용해 코드, XML 파일 등을 생성하거나 검증하는 프로세스를 자동화할 수 있습니다. 예를 들어, Lombok 라이브러리를 사용하면 반복되는 코드를 생략하고, 애노테이션 프로세서가 컴파일 타임에 이를 자동으로 추가해줍니다.

  • 애노테이션 프로세서의 작동 과정:
    1. 소스 코드에 적용된 애노테이션을 분석합니다.
    2. 프로세서가 해당 애노테이션에 대한 정의를 확인한 후, 관련 작업을 수행합니다. 예를 들어, 애노테이션에 따라 보일러플레이트 코드(중복 코드)를 자동으로 생성하거나 검증 로직을 추가합니다.

 

자바의 애노테이션에 대해 다루게 되었는데요. 애노테이션을 잘 활용한다면 편리하게 사용할 수 있게 될 것 같습니다.
부족한 글 읽어 주셔서 감사합니다. 또한 잘못된 내용 있으면 지적해주시면 감사하겠습니다. 🙏
하얀종이개발자

 

Reference

[Annotations]

https://docs.oracle.com/javase/tutorial/java/annotations/index.html - oracle 애노테이션 document

https://docs.oracle.com/javase/8/docs/technotes/guides/language/annotations.html - 애노테이션 document

https://docs.oracle.com/javase/tutorial/java/annotations/predefined.html

https://www.geeksforgeeks.org/annotations-in-java/ - geeksforgeeks.org 애노테이션

https://www.baeldung.com/java-custom-annotation - 커스텀 애노테이션

https://www.youtube.com/watch?v=i4V8ZI9Undc - 자바의 정석 애노테이션

 

[@interface]

https://stackoverflow.com/questions/918393/whats-the-difference-between-interface-and-interface-in-java

 

 

'Java' 카테고리의 다른 글

JVM (Java Virtual Machine) 자바가상머신 이란?  (0) 2021.12.21