목표
자바의 애노테이션에 대해 학습하세요.
학습할 것 (필수)
- 애노테이션 정의하는 방법
- @retention
- @target
- @documented
- 애노테이션 프로세서
Annotation
읽는 것 부터 햇갈린다.
어노테이션?, 애노테이션?. 애너테이션?, 어너테이션?, 언노테이션?, 아노타션 이 중에 원래발음 애녀 테이션 이다.
애노테이션
주석이라는 기능은 가지고 있지 않지만 뜻을 가지고 있으면서 메타데이터(징표, 마크)를 가지고 있다.. (ex. @Controller, @Deprecated...)
애노테이션 정의
Target 과 Retention 그리고 @interface 를 사용해서 정의는 다음과 같이 할 수 있다.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface SampleAnnotation {
}
컴파일 되었을 때도 변경되지 말아야 하는 값들이 들어가야 하기 때문에 정적인 요소이다. 따라서 애노테이션에서는 Rumtime 중에 알아내는 값은 못들어 간다.
Target (대상 타입)
@Target은 애노테이션이 적용 가능한 대상을 지정하는데 사용된다. (여러개 선언 가능!)
TYPE | Class, Interface 등의 Level에 선언 가능하다. | @Transactional (트랜잭션 처리) |
ANNOTATION_TYPE | 어노테이션에 선언 가능하다. | @Inherited (어노테이션 상속) |
MODULE | ? | ? |
FIELD | Enum, 상수, Field 변수에 선언 가능하다. | @Value (properties 값) |
CONSTRUCTOR | 생성자 Type에 선언 가능하다. | @Builder (빌더패턴 적용) |
LOCAL_VARIABLE | 지역 변수에 선언 가능하다. | @SupperessWarnings (컴파일경고) |
METHOD | 메서드에 선언 가능하다. | @GetMapping (get 방식 API) |
PACKAGE | 패키지에 선언 가능하다. | ? |
PARAMETER | 매개변수에 선언 가능하다. | @PathVariable (API URL 매개변수) |
TYPE_PARAMETER | 타입 매개변수 앞에 선언 가능하다. | @NotBlank (Null, "", " " 허용 X) |
TYPE_USE | 타입이 사용되는 모든곳에서 선언 가능하다. | ? |
예를들어 @Override의경우 Target이 METHOD로 설정되어 있다. 그래서 메서드에 사용할 경우 해당 메서드가 재정의됨을 알려주지만, 전혀 다른곳에 사용되면 작성할때도 붉은줄이 그어진 것을 볼 수 있고, 컴파일을 하려고 해도 'java: annotation type not applicable to this kind of declaration'라는 error가 발생한다.
@Retention (유지기간)
@Retention은 해당 애노테이션이 붙은 것이 유지되는 기간을 지정한다.
SOURCE | 소스 파일에서만 존재한다. 일반 주석처럼 사용된다는 뜻. (컴파일시 사라짐) |
@Override (표시..) |
CLASS | 클래스파일에는 존재하지만, 실행할 때는 사용할 수 없다.(기본값) | @Author (javadoc...) |
RUNTIME | 클래스 파일에 존재. 실행 시에 사용 가능 | @Controller (서버환경...) |
RUNTIME 에 정보 안에 들어갈 수있으니까 런타임중에 클래스 정보를 확인할 수 있다. 리플렉션 !! ->
리플랙션: 클래스의 정보를 반추
@Ducumented
@Documented는 애노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.
대부분의 애노테이션에 붙어있지만 @Override와 @SupperessWarnings에는 달려있지 않다.
애노테이션 프로세서
소스코드에 있는 애노테이션을 보고 컴파일러가 컴파일 중 새로운 소스 코드를 생성, 수정, 검사를 한다.
대표적인 애노테이션 프로세서 Lombok, 지루하고 반복적인 코드를 자동적으로 생성해주는 툴이다.
- getter, setter, toString...
애노테이션 프로세서 장점
- 런타임 비용이 없음(컴파일 타임에 조작이 완료된 상황이기때문에)
직접 만들어보는 방식은 아래 링크를 참고 하면 볼 수 있다.
출처
- velog.io/@alwayslee_12/%EC%95%A0%EB%85%B8%ED%85%8C%EC%9D%B4%EC%85%98-%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C
- ncucu.me/154?category=820218
- namocom.tistory.com/383
- github.com/Yo0oN/Tech-Study/blob/master/posts/Java/012.Annotation.md
'스터디 > [white-ship] 자바 스터디(study hale)' 카테고리의 다른 글
14주차 과제: 제네릭 (0) | 2021.02.27 |
---|---|
13주차 과제: I/O (0) | 2021.02.20 |
11주차 과제: Enum (0) | 2021.01.30 |
10주차 과제: 멀티쓰레드 프로그래밍 (0) | 2021.01.23 |
9주차 과제: 예외 처리 (0) | 2021.01.16 |
댓글