JAVA 및 여러 프레임워크에서 쓰이는 애너테이션의 개념에 대해 소개하려 한다.
Annotation
소스 코드가 컴파일되거나 실행될 때, 컴파일러 및 다른 프로그램에 필요한 정보를 전달해주는 문법 요소
표준 애너테이션
: JDK에 내장된 일반 애너테이션
- @로 시작하며, 클래스/인터페이스/필드/메서드 등에 붙여 사용한다.
애너테이션 | 설명 |
@Override | 컴파일러에게 오버라이드한 메서드라는 것을 알린다. 컴파일러는 이 애너테이션을 입력받으면, 상위클래스의 동일한 이름의 메서드가 존재하는지 검사한다. 만약 없다면, 컴파일 에러가 발생한다. |
@Deprecated | 다른 코드와의 호환성 문제로 삭제하기 곤란해 남겨두어야 하지만, 더 이상 사용을 권장하지 않을 때 사용한다. |
@SuppressWarnings | 컴파일러의 특정 경고 메시지가 나타나지 않도록 하는 애너테이션. 개발자의 의도가 있는 코드에 사용한다. (아래 표 상세 기능 추가) |
@SafeVarargs | 제네릭 같은 가변인자 매개변수 사용시 경고를 무시한다. (JDK 1.7 이상) |
@FunctionalInterface | 함수형 인터페이스라는 것을 알린다. (JDK 1.8 이상) 컴파일러가 함수형 인터페이스가 올바르게 선언되었는지 검사한다. 함수형 인터페이스는 단 하나의 추상 메서드만을 가져야 한다. |
@Native | native 메서드에서 참조되는 상수 앞에 붙인다. (JDK 1.8) |
애너테이션 | 설명 |
@SuppressWarnings(”all”) | 모든 경고 억제한다. |
@SuppressWarnings(”deprecation”) | Deprecated 메서드 사용 시 발생하는 경고 억제>한다. |
@SuppressWarnings(”fallthrough”) | switch 문에서 break 구문이 없을 때 발생하는 경고 억제한다. |
@SuppressWarnings(”finally”) | finally와 관련된 경고 억제한다. |
@SuppressWarnings(”null”) | null과 관련된 경고 억제한다. |
@SuppressWarnings(”unchecked”) | 검증되지 않은 연산자와 관련된 경고 억제한다. |
@SuppressWarnings(”unused”) | 사용하지 않는 코드와 관련된 경고 억제한다. |
메타 애너테이션
: 다른 애너테이션을 정의하기 위한 애너테이션
- 애너테이션 위에 붙여 사용한다
애너테이션 | 설명 |
@Target | 애너테이션이 적용가능한 대상을 지정하는데 사용한다. |
@Documented | 애너테이션 정보가 javadoc 문서에 포함되도록 한다. 표준, 메타애너테이션 중 @Override와 @SuppressWarnings를 제외하고 모두 적용되어 있다. |
@Inherited | 하위 클래스가 애너테이션을 상속받도록 한다. 상위 클래스에 붙이면, 하위 클래스에도 상위 클래스에 붙은 애너테이션들이 적용된다. |
@Retention | 애너테이션의 지속 시간을 결정하기 위해 사용한다. |
@Repeatable | 애너테이션 반복 사용 (JDK 1.8) |
@Target
:Target 애너테이션을 사용해 지정할 수 있는 대상의 타입
대상 타입 | 범위 적용 | 대상 타입 | 범위 적용 |
ANNOTATION_TYPE | 애너테이션 | PACKAGE | 패키지 |
CONSTRUCTOR | 생성자 | PARAMETER | 매개변수 |
FIELD | 필드(멤버변수, 열거형 상수) | TYPE | 타입(클래스, 인터페이스, 열거형) |
LOCAL_VARIABLE | 지역변수 | TYPE_PARAMETER | 타입 매개변수 |
METHOD | 메서드 | TYPE_USE | 타입이 사용되는 모든 대상 |
@Retention
유지 정책 | 설명 |
SOURCE | 소스 파일에 존재, 클래스파일에는 존재하지 않음 |
CLASS | 클래스 파일에 존재, 실행 시에 사용 불가, 기본값 |
RUNTIME | 클래스 파일에 존재, 실행 시에 사용가능 |
사용자 정의 애너테이션
: 직접 생성하여 정의하여 사용한다.
- 애너테이션은 java.lang.annotaion 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속 받을 수 없다.
- 인터페이스 앞에 @를 붙여 애너테이션을 정의할 수 있다.
@interface 애너테이션명 { // 인터페이스 앞에 @기호를 붙여 애너테이션을 정의
타입 요소명(); // 애너테이션 요소 선언
}
'JAVA' 카테고리의 다른 글
[JAVA] Stream(1) Stream 생성하기 (0) | 2023.07.17 |
---|---|
[JAVA] Lambda (0) | 2023.07.15 |
[JAVA] Map을 순회하는 방법 (0) | 2023.07.14 |
[JAVA] 예외처리 (0) | 2023.07.14 |
[JAVA] 제네릭 (0) | 2023.07.14 |