-
Annotation자바 스터디 2021. 3. 1. 20:45
백기선님의 자바 스터디를 진행하며 찾아 본 내용입니다.
목표
자바의 애노테이션에 대해 학습하세요.
학습할 것
- 애노테이션 정의하는 방법
- @retention
- @target
- @documented
- 애노테이션 프로세서
Annotation이란
Annotation은 JDK 1.5에서 추가 된 기능이다. 어노테이션은 메타데이터 즉 다른 데이터를 설명하기 위한 데이터이다.
전체 소스코드에서 코드의 로직에는 영향을 주지 않지만 해당 타겟의 연결 방법이나 소스코드의 구조를 변경한다.
다음과 같은 특징을 가지고 있다.
- '@'로 시작된다.
- metadata를 프로그램에 연결하는데 유용하게 사용된다.
- Annotatoion은 순수한 '주석'은 아니고 컴파일러가 프로그램을 컴파일 하는 과정을 변화시켜 줄 수 있다.
다음과 같은 코드가 있을 때에
@Override라는 annotation이 display() 메소드가 오버라이드 되어야 한다고 강제하고 있어서
컴파일러 에러가 나타나는 것을 볼 수 있다.
9번 라인의 메소드 display(int x)를 display()로 변경하면 정상적으로 출력된다.
Custom Annotation 정의하는 방법
Annotation의 종류
다음과 같은 Annotation의 종류가 존재한다
1. Marker Anntation
'선언'을 표기하는 목적만 가지고 있는 Annotation으로써 Annotation 내에 변수를 가지고 있지 않다.
@Override등이 여기에 포함된다.
Example
Example) @TestAnnotation()
2. Single value Annotation:
단일 변수를 가지는 Annotation으로, 값을 명시하여 데이터를 전달 할 수 있다.
Example: - @TestAnnotation("testing");
3. Full Annotation
두 개 이상의 변수를 가지는 어노테이션으로 여러 데이터를 key=value 형식으로 전달 할 수 있다.
Example:- @TestAnnotation(owner="Rahul", value="Class Geeks")
4. Type Annotation
Type이 있는 곳에 사용하는 Annotation, 메소드의 리턴타입등에 사용 할 수 있으며 @Target Annotation과 같이 사용된다.
Example)
Output:
Repeating Annotation
@Repeatable 어노테이션과 함께 써서 여러개의 동일한 어노테이션을 선언 할 수 있도록 해주는 어노테이션
안에 들어가는 변수는 container type을 지정한다.
Output:
자바에서 제공되는 Annotation
자바에서는 7개의 빌트인 어노테이션을 제공한다.
java.lang.annotation에서 4가지
@Retention, @Documented, @Target, @Inherited
java.lang에서 세가지
@Deprecated, @Override, @SuppressWarnings
@Deprecated
Marker annotation의 종류로써 다음 버전부터 지원되지 않을 수 있기 때문에 앞으로 사용하지 말라고 경고를 띄운다.
@deprecated 태그는 documentation을 위한 것이고 @Deprecated 태그는 런타임 리플렉션을 위한 것이다.
@deprecated 태그는 @Deprecated 어노태이션보다 보다 높은 우선순위를 가진다.
Example)
Output
@Override
@Override가 붙은 메소드는 반드시 Override 슈퍼클래스로부터 메소드를 오버라이드해야한다.
만약 오버라이드를 하지 않는다면 컴파일 에러가 발생한다.
Output
@SuppressWarnings
컴파일러에게 warning이 뜨지 않도록 알려준다.
Output:
@Documented Annotations
maker inteface로써 대상 Annotation에 대한 정보를 Javadoc에 나타내는 Annotation이다.
@Retention
적용된 대상 Annotation이 어느 시점까지 정보를 유지할 것인지 정의하는 Annotation이다.
Retention을 생략한다면 RetentionPolicy.CLASS가 적용되어진다.
필드변수
- SOURCE: Annotation 정보가 컴파일 타임 때 사라진다.
- CLASS: Annotation 정보가 Compiler에 의해 참조되고 Runtime 시점에서 사라지게 된다.
- RUNTIME: Annotation 정보가 Runtime 시점에 JVM이나 Reflection API에 의해 참조가 가능하다.
@Target
다른 어노테이션을 사용하기 위해서 사용되어진다.
변수로 enum인 ElementType[]을 받는다.
ElementType은 다음을 포함한다.
Target Constant Annotation Can be Applied To ANNOTATION_TYPE Another annotation CONSTRUCTOR Constructor FIELD Field LOCAL_VARIABLE Local Variable METHOD Method PACKAGE Package PARAMETER Parameter TYPE Class, Interface, or enumeration TYPE_PARAMETER 자바 8에서부터 추가되었으며, 타입 파라미터에만 적용 가능 TYPE_USE 자바 8에서 추가되었으며 JLS의 15가지 타입과 타입 파라미터에 적용 가능 Retention Annotation과 함께 사용해 얼마나 적용할지 결정 해줄 수 있다.
@Inherited
어노테이션 선언에서만 사용 할 수 있는 marker 어노테이션이다. 클래스를 선언할 때 사용되는 annotation에만 영향을 미친다. 이 어노테이션을 사용하면 자식클래스가 어노테이션을 상속받을 수 있다.
Annotation Processor
어노테이션 프로세서는 소스코드 레벨에서 소스코드에 붙어있는 애노테이션을 읽어서
컴파일러가 컴파일 하는 도중에 새로운 소스코드를 생성하거나 기존 소스코드를 바꿀 수 있다.
또는 클래스도 생성 할 수 있고 별개의 리로스 파일을 생성 할 수도 있는 강력한 기능이다.
Reference
www.geeksforgeeks.org/annotations-in-java/
www.notion.so/37d183f38389426d9700453f00253532