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