본문 바로가기
Backend/Java

[Java] Annotation

by unknownomad 2023. 12. 5.

정의

  • 자바 애너테이션(Java Annotation)은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종
  • 보통 @ 기호를 앞에 붙여 사용
  • JDK 1.5 버전 이상에서 사용 가능
  • 자바 애너테이션은 클래스 파일에 임베디드되어 컴파일러에 의해 생성된 후 자바 가상머신에 포함되어 작동

 

종류

  • 표준(내장) 어노테이션 : 자바가 기본적으로 제공해주는 어노테이션
  • 메타 어노테이션 : 어노테이션을 위한 어노테이션
  • 사용자 정의 어노테이션 : 사용자가 직접 정의하는 어노테이션

 

배경

  • 자바 코드는 변경돼도 설정 파일은 업데이트되지 않는 문제
  • 설정과 코드가 분리되어 있어, 개발에 대한 어려움
  • ➡️ 어노테이션 통해 하나의 파일에서 코드와 설정 관리 가능해짐

https://velog.io/@jkijki12/annotation


표준 어노테이션

  1. @Override
  2. @Deprecated
  3. @SuppressWarnings

@Override

  • 오버라이딩을 올바르게 했는지 컴파일러가 체크
class Parent {
    void parentMethod() {}
}

class Child extends Parent {
    @Override
    void pparentmethod() {} // compile error
}

@Deprecated

  • 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙임
@Deprecated
public int getDate() {
    return normalize().getDayOfMonth();
}

@FunctionalInterface

  • 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크
  • 해당 어노테이션은 함수형 인터페이스의 "하나의 추상메서드만 가져야 한다는 제약"을 확인해줌

@SuppressWarnings

  • 컴파일러의 경고메세지가 나타나지 않게 함
@SuppressWarnings("unchecked")
ArrayList list = new ArrayList(); // generic type missed
list.add(obj);
  • 보통 경고가 많을 때, 확인된 경고는 해당 어노테이션을 붙임
  • ➡️ 새로운 경고를 알아보지 못하는 것을 방지하기 위해 사용

 

메타 어노테이션

  • 어노테이션을 위한 어노테이션

@Target

  • 어노테이션 정의 시, 적용 대상을 지정하는데 사용
@Target({TYPE, FIELD, TYPE_USE})
@Retention(RetentionPolicy.SOURCE)
public @interface MyAnnotation{}

@MyAnnotation // 적용 대상 TYPE : 클래스, 인터페이스
class MyClass{

    @MyAnnotation //적용 대상 FIELD
    int i;
    
    @MyAnnotation //적용 대상 TYPE_USE
    MyClass mc;
}

@Retention

  • 어노테이션이 유지되는 기간을 지정하는데 사용
  • SOURCE : 소스 파일에만 존재
  • RUNTIME : 클래스 파일에 존재. 실행 시 사용 가능
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{}

@Documented 

  • javadoc 으로 작성한 문서에 포함시킬 때 해당 어노테이션 붙임

@Inherited 

  • 어노테이션도 상속 가능
  • 어노테이션을 자손 클래스에 상속할 때, @Inherited 붙임
@Inherited
@interface SuperAnno{}

@SuperAnno
class Parent{}

// <- 여기에 @SuperAnno 가 붙은 것으로 인식
class Child extends Parent{}

@Repeatable 

  • 반복해서 붙일 수 있는 어노테이션을 정의할 때 사용
@Repeatable(ToDos.class)
@interface ToDo{
	String value();
}

@ToDo("delete test codes.")
@ToDo("override inherited methods")
class MyClass{
	~~
}

@interface ToDos{
	ToDo[] value();
}
  • @Repeatable 어노테이션은 위의 "ToDos"처럼 "컨테이너 어노테이션"도 정의해야 함

마커 어노테이션 

  • 요소가 하나도 정의되지 않은 어노테이션
  • 대표적으로 "@Test" : 해당 어노테이션은 테스트 프로그램에게 테스트 대상임을 알리는 어노테이션

어노테이션 규칙

어노테이션에도 반드시 지켜주어야 하는 규칙 존재

  • 요소의 타입 : 기본형, String, enum, 어노테이션, Class 만 허용
  • 괄호() 안에 매개변수 선언 X
  • 예외 선언 X
  • 요소의 타입을 매개변수로 정의 X (<T>)
@interface AnnoConfigTest {
    int id = 100; // 상수 ok
    String major(int i, int j) // 매개변수 x
    String minor() throws Exception; // 예외 x
    ArrayList<T> list(); // 요소의 타입을 매개변수로 x

출처

https://velog.io/@jkijki12/annotation

'Backend > Java' 카테고리의 다른 글

자바 리플렉션(Reflection)  (0) 2024.07.30
인스턴스 생성과 정적 팩토리 메서드  (0) 2024.03.25
[Java] Exception  (0) 2023.12.05
[Java] Enum  (0) 2023.12.05
[Java] Pass by Value vs. Pass by Reference  (0) 2023.12.05

댓글