Java ‐ 어노테이션 - thought-corner/Backend-PlayGround GitHub Wiki
어노테이션 정의
- 프로그램 실행 중에 읽어 사용할 수 있는 주석을 어노테이션(Annotation)이라고 한다.
어노테이션 정의 규칙
- 데이터 타입
- 기본 타입
- String
- Class 또는 인터페이스
- enum
- 다른 어노테이션 타입
- 위의 타입들의 배열
- 앞서 설명한 타입 외에는 정의 불가
- default값
- 요소 이름
- 메서드 형태로 정의
- 괄호를 포함하되 매개변수는 없어야 한다.
- 반환 값
- 예외
- 예외는 선언할 수 없다.
- void는 사용 불가
메타 어노테이션
- 어노테이션을 정의하는데 사용하는 특별한 어노테이션을 메타 어노테이션이라고 한다.
@Retention
- 어노테이션의 생존 기간을 지정한다.
RetentionPolicy.SOURCE : 소스코드에만 남아있다. 컴파일 시점에 제거된다.
RetentionPolicy.CLASS : 컴파일 후 class 파일까지는 남아있으나 자바 실행 시점에 제거된다.
RetentionPolicy.RUNTIME : 자바 실행 중에도 남아있다. 대부분 이 설정을 사용한다.
@Target
- 어노테이션을 적용할 수 있는 위치를 지정한다.
@Documented
- 자바 API 문서를 만들 때 해당 어노테이션이 함께 포함되는가를 지정한다.
@Inherited
- 자식 클래스가 애노테이션을 상속 받을 수 있다.
어노테이션과 상속
- 클래스 상속과 인터페이스 구현의 차이
- 클래스 상속은 자식 클래스가 부모 클래스 속성과 메서드를 상속받는 개념이다.
- 즉, 자식 클래스는 부모 클래스 특성을 이어받으므로 부모 클래스에 정의된 어노테이션을 자식 클래스가 자동으로 상속받을 수 있는 논리적 기반이 있다.
- 인터페이스는 메서드 시그니처만을 정의할 뿐, 상태나 행위를 가지지 않기 때문에 인터페이스 구현체가 어노테이션을 상속한다는 개념은 잘 맞지 않는다.
- 인터페이스와 다중 구현, 다이아몬드 문제
- 인터페이스는 다중 구현이 가능하다. 만약 인터페이스의 어노테이션을 구현 클래스에서 상속하게 되면 여러 인터페이스의 어노테이션 간의 충돌이나 모호한 상황이 발생할 수 있다