목표

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

학습할 것 (필수)

애노테이션 정의하는 방법

public @interface WhiteTest { int count(); }

  • @Override는 애노테이션 이고 Override는 애노테이션의 타입.

애노테이션의 엘리멘트

@interface WhiteTest { TestType testType(); DateTime testDate(); } @interface DateTime { String yymmdd(); }

  • 자신이 아닌 다른 애노테이션을 엘리먼트로 가질수 있다.
  • Enum 역시 가질수 있다.

@WhiteTest ( testType = TestType.First, testDate = @DateTime(yymmdd = "160101") )

  • 애노테이션의 엘리먼트들은 반환값이 있고 매개변수는 없는 추상메서드의 형태를 가진다.

  • 상속을 통해 구현하지 않아도 된다.

  • 다만 애노테이션을 적용할 때 이 요소들의 값을 다 지정해줘야 한다.

  • 요소의 이름도 같이 적어주므로 순서는 상관없다.

  • 애노테이션의 각 엘리먼트들은 기본값을 가질수 있다.

  • 배열타입의 경우 {} 를 이용해 여러개의 값을 지정할수 있다.

  • 기본값 적용시 {}로 적용할수 있다.

java.lang.annotation.Annotation

  • 모든 애노테이션의 조상은 Annotation이다.
  • 다만 애노테이션은 상속이 허용되지 않으므로 명시적으로 선언할수는 없다.

Marker Annotation

  • 값을 지정할 필요가 없는 경우 애노테이션의 필드가 하나도 없는 경우가 있다.
  • Serializable이나 Cloneable인터페이스처럼 요소가 하나도 정의되지 않은 애노테이션을
  • 마커 애노테이션이라고 한다.

애노테이션 요소의 규칙

  1. 요소의 타입은 기본형, String, enum, 애노테이션, Classs만 허용된다.
  2. () 안에 매개변수를 선언할 수 없다.
  3. 예외를 선언할 수 없다.
  4. 요소를 타입 매개변수로 정의할 수 없다.

@interface AnnoTest { int id = 100; // 상수는 선언가능 String major(int i, int j); // 에러 String minor() throws Exception; // 에러 ArrayList<T> list(); // 에러 }

@Retention

애노테이션이 유지되는 범위를 설정한다.

@Retention(RetentionPolicy.SOURCE) @Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.CLASS)

  • 3가지 범위가 존재
    • SOURCE
      • 소스파일에만 존재하고 클래스파일에는 존재하지 않음.
    • CLASS
      • 클래스 파일에 존재하며 실행시 사용불가능함 기본값
    • RUNTIME
      • 클래스 파일에 존재하며 실행시에 사용가능.

Source

@Override , @SuppressWarning 처럼 컴파일러가 사용하는 애노테이션은

유지정책이 source이다. 컴파일러가 컴파일시 해당 애노테이션의 메모리는 버림.

Runtime

실행시 리플렉션을 통해 클래스 파일에 저장된 애노테이션 정보를 읽어 처리가능

@FuntionalInterface는 @Override처럼 컴파일러가 체크해주는 애노테이션이지만

실행시에도 사용되므로 유지정책이 RUNTIME으로 되어있다.

CLASS 정책과 다르게 jvm이 로딩될때 애노테이션 정보를 같이 들고있어 애노테이션 정보를 얻을수 있다.

Class

컴파일러가 애노테이션의 정보를 클래스파일에 저장할수 있게는 하지만 클래스파일이 JVM에 로딩될때는 애노테이션의 정보가 무시되어 실행시에 애노테이션 정보를 얻을수가 없다.

CLASS가 기본정책이지만 잘 사용되지 않는 이유다.

@Target

애노테이션이 적용가능한 대상을 지정한다.

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.CONSTRUCTOR, ElementType.LOCAL_VARIABLE}) @Retention(RetentionPolicy.SOURCE) public @interface SuppressWarnings { String[] value(); }

  • 대상타입의 종류

@Target({ ElementType.PACKAGE, // 패키지 선언시 ElementType.TYPE, // 타입 선언시 ElementType.CONSTRUCTOR, // 생성자 선언시 ElementType.FIELD, // 멤버 변수 선언시 ElementType.METHOD, // 메소드 선언시 ElementType.ANNOTATION_TYPE, // 어노테이션 타입 선언시 ElementType.LOCAL_VARIABLE, // 지역 변수 선언시 ElementType.PARAMETER, // 매개 변수 선언시 ElementType.TYPE_PARAMETER, // 매개 변수 타입 선언시 ElementType.TYPE_USE // 타입 사용시 })

출처 : https://jdm.kr/blog/216

@Documented

애노테이션의 정보가 javadoc로 작성한 문서에 포함되도록 한다.

자바에서 제공하는 기본 애노테이션중에 @Override와 @SuppressWarnings를 제외하면 다 붙어 있다.

@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ANNOTATION_TYPE, CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE, TYPE_PARAMETER, TYPE_USE}) public @interface WhiteTest { int id = 100; }

@Inherited

애노테이션이 자손 클래스에 상속되도록 한다.

@Inherited가 붙으 ㄴ애노테이션을 조상클래스에 붙이면 자손클래스도 이 애노텡션이 붙은것과 같이 인식된다.

@Repeatable

보통 하나의 대상에 하나의 애노테이션을 붙이는데 @Repeatable 애노테이션이 붙은 애노테이션은 여러번 붙일수 있다.

애노테이션 프로세서

리플렉션에서 사용하는 애노테이션이 아닌 컴파일시점에 수행된다.

컴파일시점에 hook하여 용자가 정의한 어노테이션에 대한 소스코드를 분석하고 처리한다.

애노테이션 프로세서를 사용하여 코드를 생성해주는 lombok같은것이 존재함.

'백선생님 온라인스터디' 카테고리의 다른 글

13주차 I/O  (0) 2021.03.01
10주차 멀티스레드 프로그래밍  (0) 2021.01.31
11주차 Enum  (0) 2021.01.30
9주차 - 예외 처리  (0) 2021.01.19
8주차 - 인터페이스  (0) 2021.01.16

+ Recent posts