-
목표
자바의 애노테이션에 대해 학습하세요.
학습할 것 (필수)
- 애노테이션 정의하는 방법
- @retention
- @target
- @documented
- 애노테이션 프로세서
Annotation ?
Java 1.5부터 등장한 기능으로 인터페이스를 기반으로 한 문법이다.
사전적 의미로는 주석으로 주석처럼 클래스, 메소드, 필드등에 특별한 의미를 부여하거나 기능을 주입할 수 있다.
즉, 프로그램에게 추가적인 정보를 제공해주는 메타 데이터(데이터를 위한 데이터)라고 볼 수 있다.
애노테이션이 왜 필요했는가 ?
기존의 자바 웹 애플리케이션에서 구성과 설정값을 XML 설정 파일을 통해서 명시하고 관리하였다.
이는 변경될 수 있는 데이터들을 코드가 아닌 외부 파일로 분리함으로써 컴파일 없이 변경사항을 적용하기 위함이었다.
근데 이런 방법이 프로그램 작성 때마다 많은 설정을 작성해야 하는 불편함을 만들었다.
웹 애플리케이션이 커짐에 따라 이는 더 극대화되었고 결국 이를 해결하기 위한 방법이 필요하게 되었다.
그 방법으로 나온 것이 애노테이션이다.
애노테이션의 쓰임
1. 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공
2. 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공
3. 실행시 (런타임시) 특정 기능을 실행하도록 정보 제공 등으로 사용할 수 있다.
애노테이션의 종류
모든 애노테이션의 조상은 java.lang.annotation.Annotation 이며 4개의 추상메소드로 이루어져있다.
1. Built-in Annotation : 자바에서 기본적으로 제공하는 애노테이션
- @Override
선언한 메서드가 오버라이드 되었다는 것을 나타낸다.
부모클래스 또는 인터페이스 에서 해당 메서드를 찾지 못하면 컴파일 에러 발생.
메소드앞에 선언시 오타가 나더라도 IDE 상에서 에러를 쉽게 찾을 수 있다.
- @Deprecated
해당 메서드가 더이상 사용되지 않음을 표시합니다.
해당 메서드를 사용할 경우 컴파일 경고를 발생.
(안쓰는 메소드니 그냥 삭제해도 된다고 생각할 수 있지만 하위버전과의 호환성 때문에 삭제하지않음)
- @SuppressWarnings
선언한 곳의 컴파일 경고를 무시.
- @SafeVarargs
제네릭 가은 가변인자 매개변수를 사용할 때의 경고를 무시한다.(Java 7 이상)
생성자나 메소드의 가변인자 파라미터가 안전하게 사용된다는 것을 나타내기 위해 사용한다.
- @FunctionalInterface
람다 함수등을 위한 인터페이스 지정.(Java 8 이상)
함수형 인터페이스에는 하나의 추상 메서드만 가져야 한다는 제약이 있는데 이 애노테이션이 올바르게 작동했는지 확인해준다.]
2. Meta Annotation : 커스텀 애노테이션을 만들 수 있게 제공된 애노테이션
- @Documented
javadoc 및 기타 문서툴에 의해 문서화될 때, 해당 애노테이션이 문서에 표시된다.
- @Retention
자바 컴파일러가 애노테이션 값들을 언제까지 유지할 것인지, 어느 시점까지 영향을 미칠 것인지를 결정한다.
즉, 애노테이션의 LifeTime이다. 코드 자동 생성 툴을 개발하지 않는 이상, 우리가 만드는 대부분의 애노태이션은 Runtime시에 사용하기 위한 용도로 만들어 진다. 그래서 대부분의 어노테이션의 Retention 값은 RUNTIME으로 되어있다.
※ 유지정책(Retention policy)
- RetentionPolicy.Source : 컴파일 전까지만 유효
- RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효
- RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조 가능
- @Target
애노테이션 적용 가능한 대상을 지정할 수 있다.
※ 사용종류
* ElementType.PACKAGE : 패키지선언
* ElementType.TYPE : 타입선언
* ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
* ElementType.CONSRTUCTOR : 생성자 선언
* ElementType.FIELD : 멤버변수 선언
* ElementType.LOCAL_VARIABLE : 지역 변수 선언
* ElementType.METHOD : 메서드 선언
* ElementType.PARAMETER : 전달인자 선언
* ElementType.TYPE_PARAMETER : 전달인자 타입 선언
* ElementType.TYPE_USE : 타입 선언
- @Inherited
자식클래스에서 부모클래스에 선언된 애노테이션을 상속받을 수 있다.
- @Repeatable
동일한 위치에 같은 애노테이션을 여러 개 선언할 수 있다.
3. Custom Annotation : Meta Annotation 을 이용하여 커스텀하게 만든 애노테이션
커스텀 애노테이션 정의 방법
public @interface CustomAnnotation { }
@Rentation(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.TYPE}) public @interface TestAnnotation { String element1(); int element2() default 5; String[] element3() default {"test"}; }
애노테이션 분류
애노테이션은 메타데이터 저장을 위해 클래스처럼 멤버를 가질 수 있는데, 이때 멤버의 개수에 따라 분류할 수 있다.
- Marker Annotation
멤버 변수가 없으며, 단순히 표식으로서 사용되는 애노테이션이다.
컴파일러에게 어떤 의미를 전달한다.
ex) @Override, @Deprecated
- Single Value Annotations
멤버로 단일변수만을 갖는 애노테이션이다.
단일변수 밖에 없기 때문에 (값)만을 명시하여 데이터를 전달할 수 있다.
ex) @TestAnnotation("testing")
- Full Annotations
멤버를 둘 이상의 변수로 갖는 애노테이션으로, 데이터를 (값=쌍)의 형태로 전달된다.
ex) @TestAnnotation(owner=”Rahul”, value=”Class Geeks”)
애노테이션 프로세서
자바가 제공하는 기능으로, "컴파일 시점"에 특정한 애노테이션이 붙어있는 소스코드를 참조해서 애노테이션에 정의된 액션(새로운 소스코드를 생성하거나, 기존의 코드를 수정하거나, resource 파일 생성)등의 작업을 할 수 있는 기능이다.
즉, 컴파일 단계에서 어노테이션을 분석하고 처리하기 위해 자바 컴파일러에 동봉된 hook이다.
- 애노테이션 프로세서 동작구조
1. 애노테이션 클래스를 생성한다.
2. 애노테이션 파서 클래스를 생성한다.
3. 애노테이션을 사용한다.
4. 컴파일하면, 애노테이션 파서가 애노테이션을 처리한다.
5. 자동 생성된 클래스가 빌드 폴더에 추가된다.
※ 스터디
github.com/whiteship/live-study/issues/12
※ 참조
chohongjae.github.io/livestudy/live-study-week12/#애노테이션-정의하는-방법
'Java' 카테고리의 다른 글
java validation (0) 2021.02.26 13. I/O (0) 2021.02.24 11. Enum (0) 2021.01.29 10. 멀티쓰레드 프로그래밍 (0) 2021.01.27 9. 예외처리 (0) 2021.01.17