저번에 Java Spring 을 공부할 때 @ 기호를 처음 알았다.
이것이 바로 어노테이션을 나타내는 기호이며, 이번 기회에 확실히 정리하기로 했다.
1️⃣ Java Annotation 이란?
어노테이션 (Annotation) 은 메타데이터(metadata) 라고 볼 수 있다.
메타데이터란 애플리케이션이 처리해야하는 데이터가 아니라, 컴파일 과정과 실행 과정에서
코드를 어떻게 컴파일하고 처리할 것인지 알려주는 정보를 말한다.
쉽게 설명하면 주석의 역할을 한다고 보면 되겠다.
어노테이션은 @AnnotationName 의 형태로 작성된다.
어노테이션은 다음과 같은 용도로 사용된다.
1. 컴파일러에게 코드의 문법 에러를 체크하도록 정보를 제공한다.
2. 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
3. 실행 (런타임) 시 특정 기능을 실행하도록 정보를 제공한다.
java.lang 과 java.lang.annotation 을 import 하여 사용할 수 있다.
2️⃣ Annotation Type 정의와 적용
어노테이션을 정의하는 방법은 인터페이스를 정의하는 것과 유사하다.
아래 코드와 같이 정의할 수 있다.
public @interface AnnotationName{
[Data Type] elementName() [default value];
...
}
어노테이션은 element 를 멤버로 가질 수 있고, 이는 각각 자료형과 이름으로 구성된다.
또한 초기값 (default) 을 가질 수 있다.
element 의 타입으로는 int, double 등 기본 자료형과 String, Enum, Class 타입 등을 사용할 수 있다.
element 정의시 메소드를 정의하는 것 처럼 ()를 붙여야 한다.
한 예시로 어노테이션을 정의하면 다음과 같다.
public @interface AnnotationName{
String value();
int elementName() default 5;
}
클래스나 인터페이스를 정의하는 방식과 유사하지만, 다른 점이 분명이 있으니 주의하도록 하자.
3️⃣ Annotation 종류
우선 Java 에서 지원하는 중요한 어노테이션들을 소개하겠다.
1. @Override
- 선언된 메소드가 오버라이드 된 것을 나타낸다.
- 만약 상위 클래스 또는 인터페이스에서 해당 메소드가 없다면 컴파일 에러가 발생.
- 오버라이딩시 새로운 메소드가 생성되는 것을 방지하기 위해 사용.
- 오버라이딩시 필수는 아니지만 사용하는 것이 좋다.
2. @Deprecated
- 해당 클래스 또는 메소드 등이 더이상 사용되지 않는다는 것을 나타댄다.
- 만약 해당 클래스 또는 메소드를 사용한다면, 경고 메시지가 발생한다.
3. @SuppressWarnings
- 해당 메소드에 대해서 컴파일러의 경고를 무시한다.
4. @Retention
- 어노테이션 유지 정책을 지정할 때 사용한다.
- 사용 용도에 따라 어노테이션을 어느 범위까지 유지할 것인지 지정해준다.
- java.lang.annotation.RetentionPolicy 열거 상수로 다음과 같이 정의된다.
RetentionPolicy 열거 상수 | 설명 |
RetentionPolicy.SOURCE | 소스상에서만 어노테이션 정보를 유지함. |
RetentionPolicy.CLASS | 바이트 코드 파일까지 어노테이션 정보를 유지함. |
RetentionPolicy.RUNTIME | 바이트 코드 파일까지 어노테이션 정보를 유지, 리플렉션을 이용하여 런타임시 어노테이션 정보를 얻음. |
5. @Target
- 어노테이션이 적용되는 위치를 선택한다.
- @Target({ElementType.위치}) 로 정의
종류 | 설명 |
ElemetType.PACKAGE | 패키지 선언 |
ElemetType.TYPE | 타입 선언 |
ElemetType.ANNOTATION_TYPE | 어노테이션 타입 선언 |
ElemetType.FIELD | 멤버 변수 선언 |
ElemetType.LOCAL_VARIABLE | 지역 변수 선언 |
ElemetType.CONSTRUCTOR | 생성자 선언 |
ElemetType.METHOD | 메소드 선언 |
ElemetType.PARAMETER | 파라미터 선언 |
ElemetType.TYPE_PARAMETER | 파라미터 타입 선언 |
6. @Inherited
- 어노테이션의 상속을 가능하게 해준다.
- 해당 어노테이션을 사용한 상위 클래스를 상속한 하위 클래스에서도 해당 어노테이션을 갖도록 한다.