티스토리 뷰

개발/Java Study

12주차 : 애노테이션

박비버 2021. 2. 24. 23:39

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

@interface 애너테이션 이름 {
    타입 요소이름();
    ...
    }
  • 애너테이션의 요소(element) : 애너테이션 내에 선언된 메서드
@interface TestInfo {
    int count();
    String testedBy();
    String[] testTools();
    TestType testType();
    DateTime testDate();
}

@interface DateTime {
    String yymmdd();
    String hhmmss();
}

@TestInfo (
    count=3,testedBy="Kim",
    TestTools = {"JUnit", "AutoTester"},
    TestType = TestType.FIRST,
    TestDate = @DateTime(yymmdd = "160101",hhmmss = "235959")
)
public class NewClass { ... }
  • 애너테이션의 요소는 기본 값을 가질 수 있음
@interface TestInfo {
    int count() default 1;
    String[] info() default {"aaa","bbb"};
    String[] info2() default "ccc"; // 기본값이 하나인 경우 괄호 생략 가능
}
  • 애너테이션 요소의 규칙
    • 요소의 타입은 기본형, String, enum, 애너테이션, Class 만 허용
    • () 안에 매개변수를 선언할 수 없음
    • 예외를 선언할 수 없음
    • 요소를 타입 매개변수로 정의할 수 없음
@interface AnnoTest {
    int id = 100;                    // OK
    String major(int i, int j);      // Error, 매개변수를 선언할 수 없음
    String minor() throws Exception; // Error, 예외를 선언할 수 없음
    ArrayList<T> list();             // 요소의 타입에 타입 매개변수 사용불가
}

2. @retention

  • 애너테이션이 유지 되는 기간을 지정
유지정책 의미
SOURCE 소스파일에만 존재, 클래스 파일에는 존재하지 않음
CLASS 클래스 파일에 존재, 실행시에 사용불가, 기본값
RUNTIME 클래스 파일에 존재, 실행시에 사용가능
  • 컴파일러가 사용하는 애너테이션은 'SOURCE' 임 ex) @Override, @SuppressWarnings 등
  • 컴파일러를 직접 작성할 것이 아니라면 'SOURCE' 쓸 일 없음
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interfac Override {}
  • 'RUNTIME' : 실행 시에 'reflection'을 통해 클래스 파일에 저장된 애너테이션의 정보를 읽어서 처리함
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FuntionalInterface {}
  • 'CLASS' : 잘 사용되지 않음 <- 컴파일러가 애너테이션의 정보를 클래스 파일에 저장할 수 있게는 하지만, 클래스 파일이 JVM에 로딩될 때는 애너테이션의 정보가 무시되어 실행시에 에너테이션에 대한 정보를 얻을 수 없음

3. @target

  • 애너테이션이 적용 가능한 대상을 지정하는데 사용
대상 타입 의미
ANNOTATION_TYPE 애너테이션
CONSTRUCTOR 생성자
FIELD 필드 (멤버변수, enum 상수)
LOCAL_VARIABLE 지역변수
METHOD 메서드
PACKAGE 패키지
PARAMETER 매개변수
TYPE 타입 (클래스, 인터페이스, enum)
TYPE_PARAMETER 타입 매개변수 (JDK 1.8)
TYPE_USE 타입이 사용되는 모든 곳 (JDK 1.8)
@Target ({FIELD, TYPE, TYPE_USE})
public @interface MyAnnotation() {}

@MyAnnotation        // 적용 대상이 TYPE인 경우
class MyClass {
    @MyAnnotation    // 적용 대상이 FIELD인 경우
    int i;
    
    @MyAnnotation    // 적용 대상이 TYPE_USE인 경우
    MyClass mc;
}

 

4. @documented

  • 애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 함
  • @Override, @SuppressWarnings 를 제외하고는 모두 붙어있음
@Documented
@Retention (RetentionPolicy.RUNTIME)
@Target (ElementType.TYPE)
public @interface FuntionalInterface {}

 

5. 애노테이션 프로세서

  • 컴파일 타임에서 애노테이션 정보를 참고하여 코드를 분석하고 생성하는 작업을 할 수 있는 기능 (코드 변경을 추천하지 않음)
  • 소스코드와 별개의 리소스 생성 가능
  • 컴파일 시점에 조작하기 때문에 런타임 비용이 없음
  • ex ) 롬복(lombok) @Getter, @Setter, @Builder
  • ex ) @Override

 

 

 

출처 

자바의 정석, 남궁 성 지음

blog.naver.com/hsm622/222226824623

parkadd.tistory.com/54

'개발 > Java Study' 카테고리의 다른 글

14주차 : 제네릭  (0) 2021.03.15
13주차 : I/O  (0) 2021.03.03
11주차 : Enum  (0) 2021.02.21
10주차 : 멀티쓰레드 프로그래밍  (0) 2021.02.20
9주차 : 예외 처리  (0) 2021.02.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함