12주차 과제. 자바의 애노테이션에 대해 학습하세요.

Jiwon·2022년 10월 21일

학습할 것

  • 애노테이션 정의하는 방법
  • @retention
  • @target
  • @documented
  • 애노테이션 프로세서

학습하기 전

  • 자바 어노테이션(Java Annotation)
    어노테이션은 주석이라는 의미를 가진다.
    자바 소스 코드에 사이에 @ 기호를 앞에 붙여서 사용하는데,
    JDK 1.5버전 이상에서 사용 가능하다.
    클래스 파일에 임베드되어 컴파일러에 의해 생성된 이후 JVM에 포함되어 동작한다.

주석은 사람에게 정보를 제공하는 것이라면,
어노테이션은 특정 코드를 사용하는 프로그램에게 정보를 전달한다.

Annotation은 자바소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종.
소스코드에 추가하면 단순 주석의 기능을 하는 것이 아니라 특별한 기능을 사용할 수 있다.

클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할을 한다.
Annotation을 통하여 코드량이 감소하고 유지보수하기 쉬우며, 생산성이 증가된다.


  • 어노테이션 역할
    컴파일러에게 문법 에러를 체크하도록 정보 제공
    프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보 제공
    런타임에 특정 기능을 실행하도록 정보 제공

어노테이션은 @를 사용하여 작성하며, 해당 타겟에 대한 동작을 수행하는 프로그램 외에는 다른 프로그램에게 영향을 주지 않는다.


  • 어노테이션 종류
    1. 표준 어노테이션
    2. 어노테이션을 정의하는 데 사용되는 메타 어노테이션
    3. 사용자 어노테이션

표준 어노테이션(자바 기본 제공)

@Override
: 컴파일러에게 메서드를 오버라이딩하는 것이라고 알린다.

@Deprecated
: 앞으로 사용하지 않을 대상임을 알린다.

@FunctionalInterface
: 함수형 인터페이스라는 것을 알린다.

@SuppressWarning
: 컴파일러가 경고 메시지를 나타내지 않는다.

@SafeVaragrs
: 제네릭과 같은 가변 인자의 매개변수를 사용할 때의 경고를 나타내지 않는다.

메타 어노테이션(어노테이션에 붙이는 어노테이션, 정의하는데 사용)

@Target
: 어노테이션을 정의할 때 적용 대상을 지정하는 데 사용

@Documented
: 어노테이션 정보를 javadoc으로 작성된 문서에 포함시킨다.

@Inherited
: 어노테이션이 하위 클래스에 상속되도록 한다.

@Retention
: 어노테이션이 유지되는 기간을 정하기 위해 사용

@Repeatable
: 어노테이션을 반복해서 적용할 수 있도록 한다.

사용자 정의 어노테이션

사용자가 직접 정의하여 사용하는 어노테이션

메타데이터?
애플리케이션이 처리해야할 데이터가 아니라 컴파일 과정과 실행 과정에서 코드를 어떻게 처리해야하는지를 알려주기 위한 추가 정보


애노테이션 정의하는 방법

@interface는 애노테이션 타입(annotation type)을 선언하는 키워드.

애노테이션 타입 선언을 일반적인 인터페이스(interface)선언과 구분하기 위해 interface 앞에 기호@를 붙인다.

스프링부트에서 사용되는 @Service 애노테이션을 들어가봤다.
@interface를 볼 수 있다.

이런 식으로 정의하면된다.
enum은 java.lang.Enum에 상속되어 있다고 한다.

애노테이션의 조상님은? java.lang.annotation.Annotation

어노테이션은 인터페이스로 구성되었기 때문에 구현하려면 implements를 사용하던가 익명클래스로 만들어야 한다고 한다.

리플렉션 기술을 이용해서 사용된다는 것을 짐작할 수 있다.

(자바 리플렉션 Java Reflection : 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API. 런타임 시에 클래스 이름만 알고있다면 클래스에 대한 정보를 가져오고 활용할 수 있게 해준다.)


@Retention

어노테이션의 리텐션(유지) 기간을 명명
즉, 어느 시점까지 애노테이션의 메모리를 가져갈지 설정

  • RetentionPolicy.Class
    : 바이트 코드 파일까지 어노테이션 정보 유지
    리플렉션을 이용해서 어노테이션 정보 얻을 수 없음
  • RetentionPolicy.Runtime
    : 바이트 코드 파일까지 어노테이션 정보를 유지하면서 리플렉션을 이용해 런타임에 어노테이션 정보를 가져올 수 있음.
  • RetentionPlicy.Source
    : Complie 이후 삭제

@Target

생성할 어노테이션이 적용될 수 있는 위치를 나열

  • ElementType.TYPE
    : 클래스, 인터페이스, 열거 타입
  • ElementType.ANNOTATION_TYPE
    : 어노테이션
  • ElementType.FILED
    : 필드
  • ElementType.CONSTRUCTOR
    : 생성자
  • ElementType.METHOD
    : 메소드
  • ElementType.LOCAL_VARIABLE
    : 로컬변수
  • ElementType.PACKAGE
    : 패키지

적용 가능한 대상을 여러개 지정하고 싶다면 {} 배열 사용
요소 타입이 ElementType[] 배열이기 때문에 적용가능한 대상을 여러 개의 값을 지정할 수 있다.


@Documented

애노테이션 정보가 javadoc 으로 작성된 문서에 포함되도록 하는 메타 애노테이션.
자바에서 제공하는 기본 애노테이션 중에 @Override, @SuppressWarnings를 제외하고 모두 @Docummented 메타 애너테이션이 붙어있다.


위에 Target에서 말했던 것 처럼 적용 가능한 대상을 여러개로 {} 배열을 사용해 지정한 모습도 볼 수 있다.


애노테이션 프로세서

  1. 소스코드 레벨에서 소스코드에 붙어있는 애노테이션 정보를 읽어와
  2. 컴파일러가 컴파일 중에 새로운 소스코드를 생성하거나 기존의 코드 변경을 가능하게 한다.(코드 변경은 비추)
    • 클래스 즉, 바이트 코드도 생성 가능하며 소스코드와 별개의 리소스도 생성 가능하다.

대표적인 예제
: 롬복(Lombok) - @Getter, @Setter, @Builder

애노테이션 프로세서의 장점
: 컴파일 시점에 조작하기 때문에 런타임 비용이 없다.


https://bangu4.tistory.com/199
https://melonicedlatte.com/2021/07/18/182600.html
https://ittrue.tistory.com/m/156
https://hbase.tistory.com/169
https://cyk0825.tistory.com/30

profile
과연 나는 ?

0개의 댓글