-
AnnotationJava/이론&문법 2023. 9. 15. 19:02
정의
- 클래스, 메소드, 변수등의 선언시에 @를 사용하는 것
- JDK 5부터 등장, 메타데이터라고 불리기도 한다.
- 컴파일러에게 정보를 알려주거나, 컴파일할 때와 설치시의 작업을 지정하거나, 실행할 때 별도의 처리가 필요할 때 사용
종류(JDK 6 기준)
- @Override
- 해당 메소드가 부모 클래스에 있는 메소드를 Override했다는 것을 명시적으로 선언
- 이 메소드는 Override 된 것이니까 무언가 잘못 코딩되어 있다면 컴파일러에게 알려달라고 지정해주는 것과 같다.
- 즉, 개발자가 제대로 Override 한 것인지 컴파일 시 확인이 가능하다.
- @Deprecated
- 미리 만들어져 있는 클래스나 메소드가 더 이상 사용되지 않는 경우가 있는데, 컴파일러에게 이 클래스 / 메소드는 더 이상 사용하지 않으며, 사용시 warning 날려주게끔 알려준다.
- @Deprecated 메소드 만들고 호출하면 경고 메시지 띄워준다.
- 하위호환성을 위해 Deprecated 선언이 꼭 필요하다.
- @SupressWarnings
- 얘는 일부러 이렇게 코딩한 거니까 컴파일 시 경고 알리지 않아도 돼~
- 속성값을 지정 ex ) @SuppressWarnings("deprecation") : deprecated 경고 메시지가 나오지 않는다.
MetaAnnotation : 직접 어노테이션을 선언할 수 있다.
- @Target : 어노테이션을 어떤 것에 적용할 것인가
- @Target(ElementType.METHOD) 이런식으로 사용이 가능하다.
- CONSTRUCTOR : 생성자 선언 시
- FIELD : enum 상수를 포함한 필드 값 선언 시
- LOCAL_VARIABLE : 지역변수 선언 시
- METHOD : 메소드 선언 시
- PACKAGE : 패키지 선언 시
- PARAMETER : 매개변수 선언 시
- TYPE : 클래스, 인터페이스, enum 선언 시
- @Target(ElementType.METHOD) 이런식으로 사용이 가능하다.
- @Retention : 얼마나 오래 어노테이션 정보가 유지되는지
- @Retention(RetentionPolicy.RUNTIME) 이런 식으로 사용이 가능
- SOURCE : 컴파일 시 사라짐
- CLASS : 클래스파일에 있는 어노테이션 정보가 컴파일러에 의해 참조 가능, JVM에서는 사라짐
- RUNTIME : 실행 시 어노테이션 정보가 JVM에 의해 참조 가능
- @Retention(RetentionPolicy.RUNTIME) 이런 식으로 사용이 가능
- @Documented
- 해당 어노테이션에 대한 정보가 Javadocs에 포함된다는 뜻
- @Inherited
- 모든 자식 클래스에서 부모 클래스의 어노테이션을 사용 가능하다
예제 코드
- @interface : @UserAnnotation으로 어노테이션 사용이 가능
- 만약 생성자에도 이 어노테이션 쓰고 싶다 하면 @Target({ElementType.METHOD, ElementType.TYPE}) 이런식으로 사용가능
@Target(ElementType.METHOD)// 이 어노테이션은 메소드에 사용할 수 있다고 지정 @Retention(RetentionPolicy.RUNTIME) // 어노테이션 유지 정보를 지정하는데 사용, 실행 시 참조하게 됨 public @interface UserAnnotation { public int number(); public String text() default "This is first Annotation"; }
public class UserAnnotationClass { @UserAnnotation(number = 0) public static void main(String[] args) { UserAnnotationClass sample = new UserAnnotationClass(); } @UserAnnotation(number = 1) public void annotationSample () { } @UserAnnotation(number = 2, text = "Second") public void annotationSample2 () { } }
'Java > 이론&문법' 카테고리의 다른 글
java.lang package (0) 2023.09.22 Mutable & Immutable 객체 (0) 2023.09.15 Nested Class (0) 2023.09.15 Java의 Exception (0) 2023.09.15 Interface, abstract class, enum (0) 2023.09.10