애노테이션(Annotation)
자바 개발을 하다 보면 클래스 또는 메서드 또는 변수 앞에 @Override 같은 표시를 많이 본다. Spring처럼 각종 프레임워크나 라이브러리도 애노테이션을 많이 활용한다.
애노테이션은 메타 데이터(데이터에 대한 설명을 하기 위한 데이터)의 역할을 주로 한다.
애노테이션은 내부적으로 어떻게 동작할까? 구현하면 어떤 문제를 해결할 수 있을까? 에 대해 알아보자.
Java에서 제공하는 애노테이션 종류
예를 위해 자바에서 제공하는 애노테이션을 살펴보자. 주로 해당 데이터를 설명하기 위해서 사용한다.
1. @Override
- 선언한 메서드가 오버라이드 되었다는 것을 나타낸다.
- 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생한다.
2. @Deprecated
- 해당 메서드가 더 이상 사용되지 않음을 표시한다.
- 만약 사용할 경우 컴파일 경고를 발생한다.
3. @SuppressWarnings
- 선언한 곳의 컴파일 경고를 무시한다.
4. @SafeVarargs
- Java7 부터 지원하며, 제너릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시한다.
5. @FunctionalInterface
- Java8 부터 지원하며, 함수형 인터페이스를 지정하는 어노테이션이다.
- 만약 메서드가 존재하지 않거나, 1개 이상의 메서드(default 메서드 제외)가 존재할 경우 컴파일 오류를 발생한다.
애노테이션 구현
애노테이션은 아래의 구조로 구현하게 된다. 이를 메타 애노테이션(Meta Annotation)이라 하고 이를 이용해 커스텀 애노테이션을 작성한다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
boolean isCheck() default true;
}
메타 애노테이션
메타 애노테이션의 종류에 대해 알아보자.
- @Retention
- 자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정한다.
- 종류는 다음과 같다.
- RetentionPolicy.SOURCE : 컴파일 전까지만 유효.
- RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효.
- RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능 (리플렉션 사용)
- @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 : 타입 선언
- @Documented
- 해당 어노테이션을 Javadoc에 포함시킵니다.
- @Inherited
- 어노테이션의 상속을 가능하게 합니다.
- @Repeatable
- Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 해줍니다.
애노테이션은 기본적으로 인터페이스 형태를 가지고, interface 앞에 @표시를 해준다. 애노테이션의 필드에서는 enum, String, 기본 자료형, 배열을 사용할 수 있다.
Reference
'Language > Java' 카테고리의 다른 글
Effective Java - try-finally 대신 try-with-resources 사용하기! (0) | 2022.08.31 |
---|---|
Effective Java - 빌더 패턴 안전하게 사용하기 (+Use Lombok) (0) | 2022.06.18 |
Java - 제네릭(Generic)타입을 제한하는 방법! (2) (0) | 2022.05.08 |
Java - 제네릭(Generic)은 무엇인가? 에 대한 정리! (1) (0) | 2022.05.08 |
Java - ArrayList가 가변적일 수 있는 이유 (+ Size 지정하는 이유) (0) | 2022.05.07 |