온라인 자바 스터디 #12 - 어노테이션(Annotation)
by coco3o목표
자바의 어노테이션에 대해 학습하세요.
학습할 것 (필수)
- 어노테이션 정의하는 방법
- @target
- @retention
- @documented
- 어노테이션 프로세서
어노테이션 정의하는 방법
어노테이션이란?
- 인터페이스를 기반으로 한 문법이다.
- @를 이용한 주석, 자바코드에 주석을 달아 특별한 의미를 부여한 것
- 프로그램에게 추가적인 정보를 제공 해주는 메타데이터(meta data : 데이터를 위한 데이터)라고 볼 수 있다.
- 어노테이션은 다음 세가지 용도로 사용된다.
- 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공
- 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공
- 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공
JDK에서 제공하는 기본 어노테이션
- @Override : 해당 메소드는 부모 클래스에 있는 메소드를 재정의했다는 것을 명시적으로 선언
- @Deprecated : 더이상 사용되지 않는 클래스나 메소드 앞에 추가
- @SuppressWarnings : 예를들어 어떤 코드가 경고메세지를 수천개씩 쏟아내는데, 그게 보기싫을때 컴파일러 입막음 시켜버림
어노테이션 정의
public @interface MyAnnotation { }
이렇게 정의한 어노테이션은 다음과 같이 사용한다.
@MyAnnotation
어노테이션은 클래스의 필드처럼 엘리먼트를 멤버로 가질 수 있다.
각 엘리먼트는 타입과 이름으로 구성되며,디폴트 값을 가질 수 있다. 엘리먼트 타입으로는 int나 double과 같은 원시 타입이나 String, Class 타입, 그리고 이들의 배열 타입을 사용할 수 있다.
public @interface MyAnnotation {
/* 엘리먼트 선언 */
String value();
int number() default 10;
}
이렇게 정의한 어노테이션을 코드에서 적용할 때는 다음과 같이 기술한다.
@MyAnnotation(value = "coco")
public class AnnotationTest { }
@MyAnnotation(value = "coco", number = 1)
public class AnnotationTest { }
value()은 디폴트 값이 없기 때문에 반드시 값을 기술해야하고, number()는 디폴트 값이 있기 때문에 생략이 가능하다.
@Target, @Retention
어노테이션을 적용할 때는 어노테이션이 어디에 적용되며 언제까지 어노테이션 소스가 유지될 것인가를 설정해야 하는데 소스코드에는 다음과 같이 어노테이션을 정의해 주면 된다.
@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션명] {
public 타입 elementName() [default 값]
...
}
@Target에는 어떠한 값(ex : 클래스, 필드, 메소드 ...)에만 자신이 만든 어노테이션을 사용하게 할것인지 나타낼 수 있는데 넣을 수 있는 값은 다음 표와 같다.
ElementType 열거 상수 | 적용 대상 |
TYPE | 클래스, 인터페이스, 열거 타입 |
ANNOTATION_TYPE | 어노테이션 |
FIELD | 필드 |
CONSTRUCTOR | 생성자 |
METHOD | 메소드 |
LOCAL_VARIABLE | 로컬 변수 |
PACKAGE | 패키지 |
위처럼 만들면 메소드에서만 사용가능한 어노테이션을 정의할 수 있다.
아래와 같이 타겟을 정할 수 있다. 여러 개 정의가 가능하고 @Target을 생략시 아무대서나 사용 가능
@Retention에는 어노테이션 정보를 언제까지 유지할 것인지 값을 설정하는데 각 값이 가지는 의미는 다음 표와 같다.
보통 어노테이션은 Runtime시에 많이 사용하므로 대부분의 어노테이션의 Retention 값은 RUNTIME으로 되어있다.
RetentionPolicy 열거 상수 | 설명 |
SOURCE | 소스상에서만 어노테이션 정보를 유지한다. 소스 코드를 분석할 때만 의미가 있으며, 바이트 코드 파일에는 정보가 남지 않는다. |
CLASS | 바이트 코드 파일까지 어노테이션 정보를 유지한다. 하지만 리플렉션을 이용해서 어노테이션 정보를 얻을 수는 없다. |
RUNTIME | 바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해서 런타임에 어노테이션 정보를 얻을 수 있다. |
@Inherited, @Documented
@Inherited 어노테이션은 이 어노테이션을 사용한 슈퍼클래스를 상속한 서브클래스에서도 해당 어노테이션을 갖도록 한다.
java.lang.annotation.Inherited
@Inherited
public @interface MyAnnotation {
}
@MyAnnotation
public class SuperClass { . . . }
public class SubClass extends SuperClass { . . . }
SubClass 클래스는 @MyAnnotation 을 상속한다.
@Documented 어노테이션의 정보가 JavaDoc의 문서에 포함되도록 하는 어노테이션이다.
java.lang.annotation.Documented
@Documented
public @interface MyAnnotation {
}
@MyAnnotation
public class SuperClass { . . . }
어노테이션 프로세서
annotation processor는 자바 컴파일러 플러그인의 일종으로, 어노테이션에 대한 코드베이스를 검사, 수정, 생성하는 역할이다.
어노테이션을 사용하기 위해서는 어노테이션 프로세서가 필요하다.
동작 구조
1. 어노테이션 프로세서를 사용한다는 것을 자바 컴파일러가 알고 있는 상태에서 컴파일을 수행
2. 어노테이션 프로세서들이 각자의 역할에 맞게 구현되어 있는 상태에서 실행되지 않은 어노테이션 프로세서를 실행
3. 어노테이션 프로세서 내부에서 어노테이션에 대한 처리
4. 자바 컴파일러가 모든 어노테이션 프로세서가 실행 되었는지 검사하고, 모든 어노테이션 프로세서가 실행되지 않았다면 반복
references :
webcoding-start.tistory.com/17
hamait.tistory.com/314?category=79137
cris.joongbu.ac.kr/course/java/api/java/lang/annotation/Documented.html
'🌈Programming > Java' 카테고리의 다른 글
온라인 자바 스터디 #13 - I/O 입출력 스트림 (0) | 2021.02.16 |
---|---|
[Java] String, StringBuffer, StringBuilder 차이와 장단점 (1) | 2021.02.04 |
[Java] static 변수와 static 메소드 (0) | 2021.01.27 |
온라인 자바 스터디 #11 - Enum (0) | 2021.01.26 |
온라인 자바 스터디 #10 - 멀티쓰레드 프로그래밍 (0) | 2021.01.19 |
블로그의 정보
슬기로운 개발생활
coco3o