Java ‐ 어노테이션 - dnwls16071/Backend_Study_TIL GitHub Wiki

📚 어노테이션 정의

  • 프로그램 실행 중에 읽어 사용할 수 있는 주석을 어노테이션(Annotation)이라고 한다.

어노테이션 정의 규칙

데이터 타입

  • 기본 타입
  • String
  • Class 또는 인터페이스
  • enum
  • 다른 어노테이션 타입
  • 위의 타입들의 배열
  • 앞서 설명한 타입 외에는 정의 불가

default값

  • 요소에 default값을 지정할 수 있다.

요소 이름

  • 메서드 형태로 정의
  • 괄호를 포함하되 매개변수는 없어야 한다.

반환 값

  • void를 반환 타입으로 사용할 수 없다.

예외

  • 예외는 선언할 수 없다.
  • void는 사용 불가

📚 메타 어노테이션

  • 어노테이션을 정의하는데 사용하는 특별한 어노테이션을 메타 어노테이션이라고 한다.

[ @Retention ]

  • 어노테이션의 생존 기간을 지정한다.
  • RetentionPolicy.SOURCE : 소스코드에만 남아있다. 컴파일 시점에 제거된다.
  • RetentionPolicy.CLASS : 컴파일 후 class 파일까지는 남아있으나 자바 실행 시점에 제거된다.
  • RetentionPolicy.RUNTIME : 자바 실행 중에도 남아있다. 대부분 이 설정을 사용한다.

[ @Target ]

  • 어노테이션을 적용할 수 있는 위치를 지정한다.

[ @Documented ]

  • 자바 API 문서를 만들 때 해당 어노테이션이 함께 포함되는가를 지정한다.

[ @Inherited ]

  • 자식 클래스가 애노테이션을 상속 받을 수 있다.

📚 어노테이션과 상속

어노테이션을 정의할 떄 @Inherited가 클래스 상속에만 적용되는 이유

  1. 클래스 상속과 인터페이스 구현의 차이
  • 클래스 상속은 자식 클래스가 부모 클래스 속성과 메서드를 상속받는 개념이다. 즉, 자식 클래스는 부모 클래스 특성을 이어받으므로 부모 클래스에 정의된 어노테이션을 자식 클래스가 자동으로 상속받을 수 있는 논리적 기반이 있다.
  • 인터페이스는 메서드 시그니처만을 정의할 뿐, 상태나 행위를 가지지 않기 때문에 인터페이스 구현체가 어노테이션을 상속한다는 개념은 잘 맞지 않는다.
  1. 인터페이스와 다중 구현, 다이아몬드 문제
  • 인터페이스는 다중 구현이 가능하다. 만약 인터페이스의 어노테이션을 구현 클래스에서 상속하게 되면 여러 인터페이스의 어노테이션 간의 충돌이나 모호한 상황이 발생할 수 있다

📚 어노테이션 활용

📚 자바 기본 어노테이션