github.com/whiteship/live-study/issues/12
목표자바의 애노테이션에 대해 학습하세요. 학습할 것 (필수)
|
0. 애노테이션의 용도
- 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공 ex) @Override
- 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성하도록 정보를 제공
- 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공
1. 애노테이션 정의하는 방법
인터페이스 정의와 유사
public @interface AnnotationName {
}
어노테이션은 element를 멤버로 가질 수 있다. 기본 element인 value 선언도 가능
public @interface AnnotationName {
타입 Value(); // 기본 엘리먼트 선언
타입 elementName() [default 값] ; //엘리먼트 선언
}
정의한 어노테이션을 코드에서 적용할 때
@AnnotaionName(elementName1 = "값");
@AnnotationName("값"); //기본 element인 value에 값을 줄 때 name 생략 가능
2. @retention
@retention : 애노테이션 유지 정책 정의하는 애노테이션
애노테이션 유지 정책은 아래와 같다.
RetentionPolicy 열거 상수 | 설명 |
SOURCE | 소스상에서만 정보를 유지한다. 바이트 코드 파일에는 정보 남지 않는다. |
CLASS | 바이트 코드 파일까지 정보를 유지한다. 리플렉션을 이용해서(런타임 시)는 정보를 얻을 수 없다. |
RUNTIME | 런타임까지 정보 얻을 수 있다. |
3. @target
@target : 애노테이션 적용 대상 정의하는 애노테이션
애노테이션 적용 대상은 java.lang.annotation.ElementType에 열거 상수로 정의되어있다.
적용 대상 지정 : @Target 사용한다.
ElementType 열거 상수 | 적용 대상 |
TYPE | 클래스, 인터페이스, 열거타입 |
ANNOTATION_TYPE | 어노테이션 |
FIELD | 필드 |
CONSTRUCTOR | 생성자 |
METHOD | 메소드 |
LOCAL_VARIABLE | 로컬 변수 |
PACKAGE | 패키지 |
4. @documented
형태를 가지는 어노테이션이 javadoc 및 같은 툴에 의해 디폴트로 문서화 되는 것. @documented 애노테이션이 붙었다면, 공개 API 일부가 된다.
출처 : cris.joongbu.ac.kr/course/java/api/java/lang/annotation/Documented.html
5. 애노테이션 프로세서
애노테이션 프로세서 : 소스코드 레벨에서 소스코드에 있는 애노테이션 정보를 읽어서 컴파일러가 컴파일 중에 새로운 소스코드를 생성하는 것. 컴파일러가 컴파일 중에 새로운 소스코드를 생성 / 기존의 코드를 변경할 수 있는 강력한 기능이다. ByteCode, resource file까지 생성이 가능하다.
- 사용 예 : lombok library , @Override(java5. 오버라이드 가능하지 않은 메소드라면 컴파일러가 에러 알림)
- 장점 : 런타임 비용이 없다.
- 단점 : 기존 클래스 코드를 변경할 때 hack이 필요하다. (현재까지 공식적인 API가 없다. public한 기술은 아님)
출처 : 이것이 자바다 (신용권 저), 더 자바, 코드를 조작하는 다양한 방법 (인프런 강의, 백기선 강사)
'Programming > Java' 카테고리의 다른 글
[whiteship 온라인 스터디] 13주차 과제: I/O (0) | 2021.02.27 |
---|---|
[whiteship 온라인 스터디] 14주차 과제: 제네릭 (0) | 2021.02.27 |
[whiteship 온라인 스터디] 11주차 과제: Enum (0) | 2021.02.24 |
[whiteship 온라인 스터디] 10주차 과제 - 멀티쓰레드 프로그래밍 (0) | 2021.02.24 |
[whiteship 온라인 스터디] 9주차 과제 - 예외처리 (0) | 2021.02.13 |