애너테이션이란 소스 코드가 컴파일되거나 실행될 때에 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해주는 문법 요소이다.
@로 시작하며 클래스, 인터페이스, 필트, 메서드 등에 붙여서 사용할 수 있다.
애너테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속받을 수 없다.
class SuperClass {
public void example() {
System.out.println("example() of SuperClass");
}
}
class SubClass extends SuperClass {
// 올바른 예시
@Override
public void example() {
System.out.println("example() of SubClass");
}
// 잘못된 예시 -> 런타임 에러 발생
public void exapmle() { // 메서드 이름에 오타가 있습니다.
System.out.println("example() of SubClass");
}
}
| 애너테이션 | 설명 |
|---|---|
| @SuppressWarnings("all") | 모든 경고를 억제 |
| @SuppressWarnings("deprecation") | Deprecated 메서드를 사용한 경우에 발생하는 경고를 억제 |
| @SuppressWarnings("fallthrough") | switch문에서 break 구문이 없을 때 발생하는 경고를 억제 |
| @SuppressWarnings("finally") | finally와 관련된 경고를 억제 |
| @SuppressWarnings("null") | null과 관련된 경고를 억제 |
| @SuppressWarnings("unchecked") | 검증되지 않은 연산자와 관련된 경고를 억제 |
| @SuppressWarnings("unused") | 사용하지 않는 코드와 관련된 경고를 억제 |
메타 애너테이션은 애너테이션을 정의하는 데에 사용되는 애너테이션으로 애너테이션의 적용 대상 및 유지 기간을 지정하는 데에 사용된다.
| 대상 타입 | 적용범위 |
|---|---|
| ANNOTATION_TYPE | 애너테이션 |
| CONSTRUCTOR | 생성자 |
| FIELD | 필드(멤버변수, 열거형 상수) |
| LOCAL_VARIABLE | 지역변수 |
| METHOD | 메서드 |
| PACKAGE | 패키지 |
| PARAMETER | 매개변수 |
| TYPE | 타입(클래스, 인터페이스, 열거형) |
| TYPE_PARAMETER | 타입 매개변수 |
| TYPE_USE | 타입이 사용되는 모든 대상 |
@Inherited // @SupAnnotatio이 하위 클래스까지 적용
@interface SupAnnotation{ }
@SupAnnotation
class Super { }
class Sub extends Super{ } // Sub에 애너테이션이 붙은 것으로 인식
// Work 애너테이션을 여러 번 반복해서 쓸 수 있게 함
@Repeatable(Works.class)
@interface Work{
String value();
}
@Work("코드 업데이트")
@Work("메서드 오버라이딩")
class Main{
... 생략 ...
}
// 여러개의 Work애너테이션을 담을 컨테이너 애너테이션 Works
@interface Works {
Work[] value();
}
@Repeatable(Works.class) // 컨테이너 애너테이션 지정
@interface Work {
String value();
}
사용자가 직접 애너테이션을 정의해서 사용하는 것을 의미한다.
// 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있음
@interface 애너테이션명 {
타입 요소명(); // 애너테이션 요소를 선언
}