웹(WEB)/자바(Java)

[Java] 자바 annotation

마달랭 2024. 12. 31. 00:21
반응형

개요

annotation이란 컴파일러, JVM, 프레임워크 등이 보는 주석이다.

소스코드에 메타 데이터를 삽입하는 형태로 나타낸다.

코드에 대한 정보를 추가하여 소스 코드의 구조 변경, 환경 설정 정보 추가 등의 작업을 진행한다.

 

🔍 자바 어노테이션(Annotation)이란?

  • 어노테이션은 코드에 추가적인 메타데이터를 제공하는 데 사용
  • 컴파일러에게 정보 제공, 런타임 처리, 코드 분석 도구프레임워크에서 활용
  • 주석처럼 사용하지만, 프로그램 동작에 직접적인 영향을 미칠 수 있음

 

주요 자바 내장 어노테이션

어노테이션 설명 사용 대상
@Override 메서드가 상위 클래스의 메서드를 오버라이드함을 명시 메서드
@Deprecated 해당 메서드/클래스가 더 이상 사용되지 않음을 알림 클래스, 메서드
@SuppressWarnings 컴파일 경고를 무시함 클래스, 메서드
@SafeVarargs 가변 인자에서의 타입 안정성 보장 생성자, 메서드
@FunctionalInterface 해당 인터페이스가 함수형 인터페이스임을 명시 인터페이스
@Retention 어노테이션의 유지 정책 설정 어노테이션
@Target 어노테이션의 적용 위치 설정 어노테이션
@Inherited 상위 클래스의 어노테이션을 하위 클래스에 상속 클래스
@Documented Javadoc 문서에 어노테이션 정보 포함 어노테이션

 

 

어노테이션 기본 사용법

이전에 오버라이딩 관련하여 다룬 자료를 보면 @Override 라고 명시해 준 적이 있을 것이다.

이와 같이 마치 사용자가 주석을 쓰듯 컴파일러에게 알리듯 주석처럼 사용해 주면 된다.

 

1. @Override 사용 예시

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

 

@Override : 메서드가 상위 클래스의 메서드를 오버라이드했음을 명시



2. @Deprecated 사용 예시

class OldAPI {
    @Deprecated
    public void oldMethod() {
        System.out.println("This method is deprecated.");
    }
}

 

  • oldMethod()는 더 이상 사용되지 않음을 나타낸다.
  • IDE에서 경고를 표시한다.

3. @SuppressWarnings 사용 예시

 

@SuppressWarnings("unchecked")
public void uncheckedMethod() {
    ArrayList list = new ArrayList();
    list.add("Hello");
}


비검사 형변환 관련 경고를 무시한다.

 

 

메타 어노테이션

메타 어노테이션은 어노테이션을 정의하는 어노테이션이다.

어노테이션 자체를 구성할 때 사용되며, 이를 통해 커스텀 어노테이션을 생성할 수 있다.

어노테이션 설명
@Retention 어노테이션의 유지 기간 설정 (CLASS, RUNTIME, SOURCE)
@Target 어노테이션의 적용 대상 설정
@Inherited 상속 가능한 어노테이션을 정의
@Documented Javadoc 문서에 어노테이션 정보 포함

 

🔄 Retention 정책 종류

정책 설명
SOURCE 컴파일 시 제거, 바이트코드에 포함되지 않음
CLASS 컴파일러가 클래스 파일에 유지, 런타임에는 사라짐
RUNTIME 런타임까지 유지, 리플렉션으로 조회 가능

 

 

커스텀 어노테이션 만들기

 

import java.lang.annotation.*;
import java.lang.reflect.Method;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface MyAnnotation {
    String value();
    int count() default 1;
}

class Example {
    @MyAnnotation(value = "Hello", count = 3)
    public void myMethod() {
        System.out.println("My Method");
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        Method method = Example.class.getMethod("myMethod");

        if (method.isAnnotationPresent(MyAnnotation.class)) {
            MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
            System.out.println("Value: " + annotation.value());
            System.out.println("Count: " + annotation.count());
        }
    }
}

 

  • @Retention(RetentionPolicy.RUNTIME) : 런타임까지 어노테이션이 유지됨.
  • @Target(ElementType.METHOD) : 메서드에만 적용 가능.
  • 런타임에 리플렉션(Reflection)을 통해 어노테이션 정보를 읽을 수 있다.
  • isAnnotationPresent()를 통해 어노테이션 존재 여부를 확인한다.
  • getAnnotation()을 통해 어노테이션 객체를 가져온다.
  • 어노테이션 값(value, count)을 읽어 출력한다.

 

728x90
반응형

'웹(WEB) > 자바(Java)' 카테고리의 다른 글

[Java] 자바 람다 Lambda  (0) 2024.12.31
[Java] 자바 자료구조, Collection  (0) 2024.12.31
[Java] 자바 Enum  (0) 2024.12.31
[Java] 자바 Generics  (0) 2024.12.30
[Java] 자바 인터페이스  (0) 2024.12.30