Java
Annotation 정리
민트초코 개발자
2023. 7. 17. 19:35
annotation이란
- 주석이라는 뜻으로, 코드에 다른 프로그램을 위한 미리 약속된 형식으로 포함
- 즉 다른 프로그램을 위한 메타 데이터
- 프로그래밍 언어에 영향이 없다.
- 다른 프로그램에 유용한 정보를 제공한다.
- 자바 5부터 제공
annotation 예시 - @Override
- @Override는 컴파일러에게 부모 클래스의 메서드를 오버라이드 했다는 것을 알려준다.
- 그렇기 때문에 실행 전 오류를 알 수 있다.
- 또한 코드에서 명시적으로 상속 메서드가 무엇인지 쉽게 파악할 수 있다.
public class Parent {
public int calculate(int a, int b) {
return a + b;
}
}
public class Child extends Parent {
@Override
public int calculate(int a) {
return a;
}
}
오버라이드 calculate의 매개변수를 하나 제거하면 Override에 빨간줄이 생겨 실행 전에 오류를 발견할 수 있다.
게다가 이 예제에서 @Override가 없다면 오버로딩으로 의도치 않게 사용될 수 있다.
어노테이션 종류
1. 표준 어노테이션
- @Override
- 컴파일러에게 오버라이딩하는 메서드임을 알림
- @Deprecated
- 앞으로 사용하지 않을 것을 권장
- 기존 기능이 대체되거나 개선된 기능이 추가될 때, 기존 기능을 삭제하기보단 해당 어노테이션을 이용
- @SuppressWarnings
- 컴파일러의 경고 메시지가 나타나지 않게 한다.
- 경고 메시지는 deprecation, unchecked, rawtypes, varargs 등 있다.
- deprecation은 Deprecated 로 인해 발생하는 경고를 제외
- unchecked는 제네릭으로 타입을 지정하지 않았을 때 발생하는 경고를 제외
- rawtypes는 제네릭을 사용하지 않아 발생하는 경고를 제외
- varargs는 가변인자의 타입이 제네릭 타입일 때 발생하는 경고를 제외
- 이 외에도 다양한 경고 메시지들이 있다.
- 경고는 안정성이 확실할 때만 사용하는 것이 좋다. 예를들어 unchecked 사용 시 왜 형 안전성을 위반하지 않는지 밝히는 주석을 추가해야 한다.
2. 메타 어노테이션
- 어노테이션에 붙이는 어노테이션
- 어노테이션을 정의할 때, 적용대상(target)이나 유지기간(retention) 등 지정하는데 사용
- @Target
- 어노테이션의 적용가능한 대상을 지정
- 종류
- ElementType.PACKAGE : 패키지 선언
- ElementType.TYPE : 타입 선언
- ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
- ElementType.CONSTRUCTOR : 생성자 선언
- ElementType.FIELD : 멤버 변수 선언
- ElementType.LOCAL_VARIABLE : 지역 변수 선언
- ElementType.METHOD : 메서드 선언
- ElementType.PARAMETER : 전달인자 선언
- ElementType.TYPE_PARAMETER : 전달인자 타입 선언
- ElementType.TYPE_USE : 타입 선언
- @Retention
- 어노테이션이 유지되는 기간 지정
- 유지 정책
- RetentionPolicy.SOURCE
- 소스 파일에만 존재
- @Override 과 같은 컴파일러가 사용하는 어노테이션
- RetentionPolicy.CLASS
- 클래스 파일에 존재
- 런타임 시 사용불가. JVM에 로딩될 때 해당 어노테이션은 무시됨
- 디폴트 값
- RetentionPolicy.RUNTIME
- 클래스 파일에 존재
- 런타임 시 사용가능
- 리플렉션을 통해 클래스 파일에 저장된 어노테이션 정보를 읽어 처리할 수 있다.
- RetentionPolicy.SOURCE
- @Inherited
- 어노테이션의 상속을 가능하게 한다.