[자바의 정석]애노테이션

YJS·2023년 12월 12일
0

1. 애노테이션 정의하는 방법


애노테이션이란?

프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨것.

자바는 소스코드와 문서를 하나의 파일로 관리. 따라서 주석에 소스코드에 대한 정보를 저장하고 소스코드의 주석으로부터 HTML문서를 생성해내는 javadoc.exe를 사용.

(=미리 정의된 태그들을 이용해서 주석안에 정보를 저장하고 javadoc.exe 프로그램이 이 정보를 읽어서 문서를 작성)

<애너테이션 요소의 규칙>

  • 요소의 타입은 기본형, String, enum, 어노테이션, Class만 허용됨.

  • ()안에 매개변수는 선언할 수 없음.

  • 예외를 선언할 수는 없음.

  • 요소를 타입 매개변수로 정의 할 수 없음.

<표준 애노테이션>

애너테이션설명
@Override컴파일러에게 오버라이딩 메서드라는 것을 알림
@Deprecated앞으로 사용하지 않을 것을 권장하는 대상에 붙임
@SuppressWarnings컴파일러의 특정 경고메세지가 나타나지 않게 해줌
@SafeVarags지네릭스 타입의 가변인자에 사용
@FunctionalInerface함수형 인터페이스임을 알림
@Nativenative메서드에서 참조되는 상수 앞에 붙임
@Target*애너테이션이 적용가능한 대상을 지정하는데 사용
@Documented*애너테이션 정보가 javadoc으로 작성한 문서에 포함되게 함.
@Inherited*애너테이션이 자손 클래스에 상속되도록함
@Retention*애너테이션이 유지되는 범위를 지정
@Repeatable*애너테이션이 반복해서 적용할 수 있게 함.

메타 애너테이션

-애너테이션을 위한 애너테이션 = 애너테이션에 붙이는 애너테이션으로 애너테이션을 정의할 때 적용대상이나 유지기간등을 지정하는데 사용.

-java.lang.annotation 패키지에 포함되어 있음

2. @retention


애너테이션이 유지되는 기간을 지정하는데 사용

<애너테이션 유지정책의 종류>

유지 정책의미
SOURCE소스파일에만 존재. 클래스 파일에는 존재하지 않음
CLASS클래스 파일에 존재. 실행시에 사용불가. 기본값
RUNTIME클래스파일에 존재. 실행시에 사용가능.

@Override, @SuppressWarnings (컴파일러가 사용하는 애너테이션) ⇒ SOURCE

@FunctionalInterface(컴파일러 확인, 실행시 유지) ⇒ RUNTIME

3. @target


애너테이션이 적용가능한 대상을 지정하는데 사용.

→ 여러개의 값을 지정할 경우 배열을 사용.

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})

<@Target 애너테이션 적용대상의 종류>

대상 타입의미
ANNOTATION_TYPE애너테이션
CONSTRUCTOR생성자
FIELD필드(멤버변수, enum상수), 기본형
LOCAL_VARIABLE지역변수
METHOD메서드
PACKAGE패키지
PARAMETER매개변수
TYPE타입(클래스, 인터페이스, enum)
TYPE_PARAMETER타입 매개변수
TYPE_USE타입이 사용되는 모든 곳, 참조형

4. @documented


애너테이션에 대한 기본 정보가 javadoc으로 작성한 문서에 포함되도록함.

@Override, @SuppressWarnings 제외한 나머지는 모두 해당 메타 애너테이션이 붙어있음.

5. 애노테이션 프로세서


(참고 강의 : www.inflearn.com/course/the-java-code-manipulation/dashboard 인프런 - 더 자바, 코드를 조작하는 다양한 방법)

https://www.notion.so/37d183f38389426d9700453f00253532

애노테이션 프로세서

애노테이션 프로세서는 소스코드 레벨에서 소스코드에 붙어있음.

애노테이션을 읽어서 컴파일러가 컴파일 하는 중에 새로은 소스코드를 생성하거나 기존 소스코드를 바꿀 수 있음.

또는, 클래스(바이트코드) 도 생성할 수 있고 별개의 리소스파일을 생성할 수 있는 강력한 기능.

애노테이션 프로세서 사용 예

  • 롬복 (기존코드를 변경한다)
  • AutoService (리소스 파일을 생성해준다.)
    • java.util.ServiceLoader 용 파일 생성 유틸리티
  • @Override

애노테이션 프로세서 장점

  • 바이트코드에 대한 조작은 런타임에 발생되는 조작임으로 런타임에 대한 비용이 발생
  • but. 애노테이션 프로세서는 애플리케이션을 구동하는 런타임 시점이 아니라,
  • 컴파일 시점에 조작하여 사용함으로 런타임에 대한 비용이 제로가 됨

단점은 기존의 코드를 고치는 방법은 현재로써는 public 한 API 가 없음.

  • 롬복 같은 경우 기존 코드를 변경하는 방법이지만 public 한 api를 이용한 것이 아님으로 해킹이라고 할 수 도 있음.

롬복(Lombok)의 동작원리

Lombok

  • @Getter @Setter, @Builder 등의 애노테이션과
  • 애노테이션 프로세서를 제공하여 표준적으로 작성해야 할 코드를 개발자 대신 생성해주는 라이브러리이다.

사용하기

  • 의존성 추가
  • IntelliJ Lombok 플로그인 설치
  • Intellij Annotation Processing 옵션 활성화

동작원리

  • 컴파일 시점에 "애노테이션 프로세서"를 사용하여 (자바가 제공하는 애노테이션 프로세서)
  • 소스코드의 AST(Abstract Syntax Tree)조작한다.
profile
우당탕탕 개발 일기

0개의 댓글