Java에서 제공하는 표준 애너테이션
| 애너테이션 | 설명 |
|---|
| @Override | 컴파일러에게 오버라이딩하는 메서드라는 것을 알린다. |
| @Deprecated | 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다. |
| @SuppressWarnings | 컴파일러의 특정 경고메시지가 나타나지 않게 해준다. |
| @SafeVarargs | 지네릭스 타입의 가변인자에 사용한다.(JDK1.7) |
| @FunctionalInterface | 함수형 인터페이스라는 것을 알린다.(JDK1.8) |
| @Native | native 메서드에서 참조되는 상수 앞에 붙인다.(JDK1.8) |
| @Target* | 애너테이션이 적용가능한 대상을 지정하는데 사용한다. |
| @Documented* | 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다. |
| @Inherited* | 애너테이션이 자손 클래스에 상속되도록 한다. |
| @Retention* | 애너테이션이 유지되는 범위를 지정하는데 사용한다. |
| @Repeatable* | 애너테이션을 반복해서 적용할 수 있게 한다.(JDK1.8) |
@Override
- 오버라이딩을 올바르게 했는지 컴파일러가 체크하게 함
- 오버라이딩할 때 메서드 이름을 잘못 적는 실수를 하는 것을 방지
- 오버라이딩할 때는 메서드 선언부 앞에 @Override 붙이기
class Child extends Parent {
@Override
void parenMethod() {}
}
@Deprecated
- 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙임
- 이전 버전과의 호환성의 가치 떄문에 권장만 할 뿐 대상을 제거하지는 않았음
- @Deprecated가 붙은 대상이 사용된 코드를 컴파일하면 경고 메세지가 나타남
@FUnctionallInterface
- 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크
- 함수형 인터페이스에는 하나의 추상메서드만 가져야 한다는 제약 있음
- 물론 함수형 인터페이스에 해당 애너테이션을 '반드시'붙여야 하는 것은 아님
@SuppressWarnings
- 컴파일러의 경고메세지가 나타나지 않게 억제함
- 괄호()안에 억제하고자 하는 경고의 종류를 문자열로 지정
@SuppressWarnings("unchecked")
ArrayList list = new ArrayList();
list.add(obj);
- 둘 이상의 경고를 동시에 억제하려면 다음과 같이 함
@SuppressWarnings({"deprecation", "unchecked", "varags"})
- 'Xlint' 옵션으로 컴파일하면, 경고메세지 확인 가능
메타 애너테이션
- 애너테이션을 만들때 사용
- java.lang.annotation 패키지에 포함
| 애너테이션 | 설명 |
|---|
| @Target | 애너테이션이 적용 가능한 대상을 지정하는데 사용한다. |
| @Documented | 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다. |
| @Inherited | 애너테이션이 자손 클래스에 상속되도록 한다. |
| @Retention | 애너테이션이 유지되는 범위를 지정하는데 사용한다. |
| @Repeatable | 애너테이션을 반복해서 적용할 수 있게 한다. (JDK 1.8) |
@Target
- 애너테이션을 정의할 때, 적용대상 지정에 사용
| 대상 타입 | 의미 |
|---|
| ANNOTATION_TYPE | 애너테이션 |
| CONSTRUCTOR | 생성자 |
| FIELD | 필드(멤버변수, enum 상수) |
| LOCAL_VARIABLE | 지역변수 |
| METHOD | 메서드 |
| PACKAGE | 패키지 |
| PARAMETER | 매개변수 |
| TYPE | 타입(클래스, 인터페이스, enum) |
| TYPE_PARAMETER | 타입 매개변수 (JDK 1.8) |
| TYPE_USE | 타입이 사용되는 모든 곳 (JDK 1.8) |
@Retention
- 애너테이션이 유지(retention)되는 기간을 지정하는데 사용
| 유지 정책 | 의미 |
|---|
| SOURCE | 소스 파일에만 존재. 클래스 파일에는 존재하지 않음. |
| CLASS | 클래스 파일에 존재. 실행시에 사용 불가. 기본값 |
| RUNTIME | 클래스 파일에 존재. 실행시에 사용 가능. |
- 컴파일에 의해 사용되는 애너테이션의 유지 정책은 SOURCE
- 실행시에 사용 가능한 애너테이션의 정책은 RUNTIME
@Documented
- javadoc으로 작성한 문서에 포함시킬때 붙임
@Inherited
- 애너테이션을 자손 클래스에 상속하고자 할 때, @Inherited를 붙임
@Repeatable
- 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용
- @Repeatable이 붙은 애너테이션은 반복해서 붙일 수 있음