목표
자바의 애노테이션에 대해 학습하기
학습할 것
- 애노테이션 정의하는 방법
- @Retention
- @Target
- @Documented
- 애노테이션 프로세서
과제 마감
2021.02.06 1PM
Annotation이란?
- 주석. 메타 데이터(데이터에 관한 데이터)의 한 형태
- 프로그램에 대한 데이터 제공
- 코드에 직접적인 영향을 주지 않음
애노테이션 정의하는 방법
이것은 가장 간단한 형태의 애노테이션이다.
@Entity
' @ ' 는 컴파일러에게 이다음에 오는 것이 주석임을 알린다.
@Override
void myJavaStudyMethod() { ... }
애노테이션은 이름(name)이 있을 수도, 없을 수도 있다. 그리고 그 요소에 대한 값이 있다.
// 이름이 있는 경우
@Author(
name = "whiteship study",
date = "2020-11-21"
)
class myStudy() { ... }
// 이름이 없는 경우
@SuppressWarnings(value = "unchecked")
void myStudy2() { ... }
value 요소가 하나만 있는 경우, 다음처럼 생략할 수 있다.
// 값이 1개인 경우 이름 생략 가능
@SuppressWarnings("unchecked")
void myStudy2() { ... }
하나의 선언에 여러 개의 주석을 사용할 수 있다.
@Author(name = "whiteship")
@EBook
class myStudy { ... }
애노테이션을 사용하는 곳?
클래스, 필드, 메소드, 다른 프로그램의 요소의 선언 시 등.
기본적으로 제공되는 내장 애노테이션
7개의 표준 애노테이션 중, 3개가 java.lang, 4개가 java.lang.annotation에 존재한다.
자바 코드에 적용되는 애노테이션
@Override
- 메소드가 오버라이드 되었음을 나타낸다.
- 부모 클래스 또는 구현된 인터페이스에서 해당 메서드를 찾지 못하면 컴파일 에러가 발생한다.
@Deprecated
- 메서드를 사용하지 않는 것을 나타낸다.
- 만약 해당 메서드가 사용되면 컴파일 경고가 발생한다.
@SuppressWarnings
- 컴파일러에게 컴파일 시 경고를 억제하도록 한다.
그 외 애노테이션에 적용되는 애노테이션 (메타 애노테이션)
- 4가지가 java.lang.annotation에 정의되어 있음.
- @Retention (아래에서 설명)
- @Documented
- @Target
- @Inherited : 주석은 하위 클래스에 의해 상속되지 않지만, 이 애노테이션을 사용하면 애노테이션을 상속할 수 있다.
@Retention
표시된 애노테이션의 정보가 언제까지 유지되는지 나타낸다.
- RetentionPolicy.SOURCE : 소스단에서만 유지되기에 컴파일 전까지 유지. 이후에 컴파일러에 의해 무시된다.
- RetentionPolicy.CLASS : 컴파일 시까지 컴파일러에 의해 유지되지만, 이후에 JVM에서는 무시된다.
- RetentionPolicy.RUNTIME : 런타임 시까지 JVM에 의해 유지된다.
@Target
@Target 애노테이션은 애노테이션이 적용되는 요소의 종류를 지정할 수 있다.
다음 중 하나의 값을 가진다.
- ElementType.ANNOTATION_TYPE : 어노테이션 타입
- ElementType.CONSTRUCTOR : 생성자
- ElementType.FIELD : 멤버 변수
- ElementType.LOCAL_VARIABLE : 지역 변수
- ElementType.METHOD : 메서드
- ElementType.PACKAGE : 패키지
- ElementType.PARAMETER : 메서드의 매개변수
- ElementType.TYPE : 클래스의 모든 요소
@Retention(RetentionPolicy.RUNTIME) // 런타임시까지 접근 가능
@Target({ElementType.METHOD}) // 클래스 메서드에만 적용 가능
public @interface Tweezable { ... }
@Documented
@Documented 애노테이션은 선언된 요소가 Javadoc 문서에 애노테이션을 표시하도록 지정한다.
애노테이션 프로세서
- 자바 소스 코드가 컴파일되면, '애노테이션 프로세서(Annotation Processor)'라는 컴파일러 플러그인이 애노테이션을 처리할 수 있다. 이 애노테이션 프로세서는 정보 메시지를 생성하거나 자바 소스파일 또는 리소스를 생성할 수 있고, 이것은 차례대로 컴파일 및 처리될 수 있다. 그러나 애노테이션 프로세서는 애노테이션이 있는 코드 자체는 수정할 수 없다.
- 자바 컴파일러는 애노테이션에 CLASS 또는 RUMTIME의 RetentionPolicy가 있을 경우, 클래스 파일에 애노테이션 메타데이터를 저장한다.
- 추후에 JVM이나 다른 프로그램이 메타데이터를 찾아 프로그램의 동작을 바꾸거나 변경할 수 있다.
- 애노테이션 프로세서를 사용해서 애노테이션을 처리하기 위한 또다른 방법은 reflection을 사용하는 것이다.
- java.lang.reflect 패키지에 AnnotatedElement 인터페이스가 있는데, 자바 reflection으로 구현된다.
- 이 인터페이스의 구현은 현재 JVM에서 실행중인 프로그램의 애노테이션을 나타낼 수 있다. 이 인터페이스를 통해 애노테이션을 reflectively하게 읽을 수 있다.
+ Annotation에 대해 막연하게 알고 있었는데 이번에 정리할 기회였던 것 같다.
그치만 아직 와닿지 않..는다
여전히 설명이 많이 부족하지만 내일 라이브를 보며 더 채워야겠다! 감사합니다 :-)
< reference >
docs.oracle.com/javase/tutorial/java/annotations
en.wikipedia.org/wiki/Java_annotation
'Java Live Study' 카테고리의 다른 글
Live Study 14주차 : 제네릭 (0) | 2021.03.06 |
---|---|
Live Study 13주차 : I/O (0) | 2021.03.05 |
Live Study 9주차 : 예외 처리 (0) | 2021.01.16 |
Live Study 8주차 : 인터페이스 (0) | 2021.01.16 |
Live Study 7주차 : 패키지 (0) | 2021.01.02 |