본문 바로가기
스터디/[white-ship] 자바 스터디(study hale)

12주차 과제: 애노테이션

by doyoungKim 2021. 2. 6.

목표

자바의 애노테이션에 대해 학습하세요.

학습할 것 (필수)


Annotation

읽는 것 부터 햇갈린다. 

어노테이션?, 애노테이션?. 애너테이션?, 어너테이션?, 언노테이션?, 아노타션 이 중에 원래발음 애녀 테이션 이다. 

애노테이션

주석이라는 기능은 가지고 있지 않지만 뜻을 가지고 있으면서 메타데이터(징표, 마크)를 가지고 있다.. (ex. @Controller, @Deprecated...)

애노테이션 정의

Target 과 Retention 그리고 @interface 를 사용해서 정의는 다음과 같이 할 수 있다.

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface SampleAnnotation {

}

 

컴파일 되었을 때도 변경되지 말아야 하는 값들이 들어가야 하기 때문에 정적인 요소이다. 따라서 애노테이션에서는  Rumtime 중에 알아내는 값은 못들어 간다.

Not Final vs final(정적)

 

 

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...

애노테이션 프로세서 장점

  • 런타임 비용이 없음(컴파일 타임에 조작이 완료된 상황이기때문에)

직접 만들어보는 방식은 아래 링크를 참고 하면 볼 수 있다.

 

 

Java - 애노테이션 프로세서1

애노테이션 프로세서 - 1 Moja Interface pullOut() 메소드만 존재하는 인터페이스를 정의 @Magic 애노테이션 Target을 TYPE으로 지정하면, 인터페이스 ,클래스, ENUM에 지정이 가능하다. Rentention정보를 소스

ncucu.me

 

 

 

출처

 

728x90

댓글