[프레임워크]어노테이션

Kingyj·2024년 12월 17일

어노테이션?

어노테이션 (annotation)은 주석이나 메타데이터를 의미한다. 주로 코드에 추가적인 정보나 기능을 부여할 때 사용 한다.
다른 프로그램에게 유용한 정보를 제공하기 위해 사용되는 것으로 주석과 같은 의미를 가진다.


어노테이션의 역할

  • 컴파일러에게 문법 에러를 체크하도록 정보를 제공한다.
  • 프로그램을 빌드 할 때 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
  • 런타임에 특정 기능을 실행하도록 정보를 제공한다.

어노테이션의 종류

어노테이션의 종류는 크게 3가지로 구분된다.

  • 자바에서 기본적으로 제공하는 표준 어노테이션
  • 어노테이션을 정의하는데 사용되는 메타 어노테이션
  • 마지막으로 사용자 어노테이션
  1. 표준 어노테이션

표준 어노테이션은 Java에서 자주 사용되는 어노테이션들로, JDK에 기본적으로 제공되는 어노테이션이다. 주로 컴파일러에 정보 제공이나 코드 품질 개선을 위해 사용된다.

@Override 
// 설명 : 부모 클래스의 메서드를 재정의 한다는 것을 명시한다.
// 용도 : 컴파일러가 해당 메서드가 부모 클래스에 존재하는지 검사하도록 도와준다.

//예시 코드
class Parent {
    void display() {
        System.out.println("부모 클래스 메서드");
    }
}

class Child extends Parent {
    @Override
    void display() {  // 부모의 메서드를 재정의
        System.out.println("자식 클래스 메서드");
    }
}
@ FunctionalInterface
// 설명 : 인터페이스가 함수형 인터페이스임을 명시한다.
// 용도 : 함수형 프로그래밍에서 람다식을 사용할 수 있도록 보장한다.
// 조건 : 단 하나의 추상 메서드만 존재해야 한다.

//예시 코드
@FunctionalInterface
interface MyFunctionalInterface {
    void myMethod();
}
@Documented
// 설명 : 어노테이션이 Javadoc에 포함되도록 표시한다.
// 용도 : API 문서에 어노테이션 정보가 나타나도록 할 때 사용한다.


//예시 코드
@Documented
@interface MyAnnotation {
    String value();
}
@Ingerited
// 설명 : 어노테이션이 상속될 수 있도록 명시한다.
// 용도 : 부모 클래스에 선언된 어노테이션이 자식 클래스에 자동으로 적용되도록 한다.

//예시 코드
@Inherited
@interface MyAnnotation {}

@MyAnnotation
class Parent {}

class Child extends Parent {}  // 자동으로 MyAnnotation 적용
  1. 메타 어노테이션

메타 어노테이션은 어노테이션을 위한 어노테이션이다. 즉, 어노테이션을 정의하거나 설정할 때 사용하는 어노테이션이다. 메타 어노테이션은 Java 표준 어노테이션 중 일부로 제공되며, 어노테이션의 동작 방식과 범위를 제어한다.

@Target
// 설명 : 어노테이션을 적용할 대상(타겟)을 지정한다.
// 용도 : 어노테이션이 클래스, 메서드, 필드 등 어디에 적용될 수 있는지 명시한다.

// 사용 가능한 대상들
//ElementType.TYPE : 클래스, 인터페이스 열거형
//ElementType.METHOD : 메서드
//ElementType.FIELD : 필드
//ElementType.PARAMETER :  파라미터
//ElementType.CONSTRUCTOR : 생성자
//ElementType.LOCAL_VARIABLE : 지역 변수
//ElementType.ANNOTATION_TYPE : 다른 어노테이션
//ElementType.PACKAGER : 패키지

//예시 코드
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.FIELD})
@interface MyAnnotation {}
@Retention 
// 설명 : 어노테이션의 유지 정책을 지정한다.
// 용도 : 어노테이션이 어느 시점까지 유지되는지 설정한다.

//RetentionPolicy 옵션
// SOURCE : 컴파일시 삭제됨. (컴파일러만 사용)
// CLASS : 클래스 파일에 남아있지만, 런타임에는 읽히지 않음.
// RUNTIEM : 런타임 시에도 유지되며 리플렉션을 통해 읽을 수 있음.

//예시 코드
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {}
@Inherited
// 설명 : 어노테이션이 상속될 수 있도록 설정한다.
// 용도 : 부모클래스의 어노테이션이 자식 클래스에 자동으로 적용되도록 한다.
// 제한 : 클래스에만 적용되며 메서드나 필드에는 적용되지 않는다.

//예시 코드
import java.lang.annotation.Inherited;

@Inherited
@interface MyAnnotation {}

@MyAnnotation
class Parent {}

class Child extends Parent {}
@Documented
// 설명 : 어노테이션이 Javadoc 문서에 포함되도록 설정한다.
// 용도 : API 문서에 어노테이션 정보를 노출시키고 싶을 때 사용한다.

//예시 코드
import java.lang.annotation.Documented;

@Documented
@interface MyAnnotation {
    String value();
}
@Repeatable
// 설명 : 어노테이션을 반복해서 사용할 수 있도록 설정한다.
// 용도 : 같은 어노테이션을 여러 번 작용할 수 있게 해준다.
// 주의 : 반복될 어노테이션을 담을 컨테이너 어노테이션을 따로 정의해야 한다.

//예시 코드
import java.lang.annotation.Repeatable;

@Repeatable(Schedules.class)
@interface Schedule {
    String day();
}

@interface Schedules {
    Schedule[] value();
}

@Schedule(day = "Monday")
@Schedule(day = "Tuesday")
class MyClass {}
  1. 사용자 어노테이션

사용자 어노테이션은 사용자가 직접 정의하는 것이다.

0개의 댓글