Java Annotation 기본

  • 어노테이션
    • 코드수준에서 활용 가능한 주석형 자료
    • 어노테이션은 인터페이스
    • 컴파일, 실행 과정(런타임)에서 코드를 어떻게 처리할지 명시한 정보
      • 문법적 오류를 보다 강력하게 검사할 수 있는 정보 제공
      • IDE같은 소스코드 작성 도구가 코드를 생성할 수 있는 근거
      • 런타임에 특정 기능을 실행하거나 역할을 정의
    • 런타임에 활용할 수 있는 정보 담을 수 있음
    • 이미 활용되공있는것 외에 타입 정의를 통해 추가 어노테이션 개발 가능
    • 런타임때 코드 어케 처리할지 확인하려면 '리플렉션'개념이 필요
    • 런타임때 어노테이션에 들어있는 값 확인하려면..
    • 외부 모둘(프레임 웍 같은거)... 이 읽을 수 있다는게 중요
    • 윈도우 DLL 같은걸로 비유되네
  • 기본 메타 어노테이션
    • @Override
      • 가독성을 위해 매우 유용
      • 과거에 만든 코드에 의해 이거 붙은 메서드가 호출 당하는 것
      • 덮어쓰기한것
    • @Deprecated
    • @SuppressWarnings(경고 무시)
    • @Retention(생존 기간, 유효 시점) ***
    • @Target(적용 대상) ***
    • @Documented(문서 생성 시 어노테이션 포함)
    • @Inherited(파생 클래스에서 어노테이션 상속)

어노테이션 직접 정의

  • public @interface 이름 {}
  • 내부적으로는 java.lang.annotation.Annotatino 인터페이스를 묵시적으로 상속 받아 만들어짐
  • 내부에 엘리먼트를 멤버로 가질 수 있으며, 각 엘리먼트는 클래스 필드와 유사
    • 타입 엘리먼트명() [default 값];
    • int a() default 10;
  • 어노테이션 적용은 @이름 형식이며 적용기능 대상에 한정해 기술
  • 적용 대상 @Target
    • TYPE
    • ANNOTATION_TYPE
    • FILED
    • CONSTRUCTOR
    • METHOD
    • LOCLA_VARIABLE
    • PACKAGE
  • 어노테이션 유지 정책
    • java.lang.annotation.RetentionPolicy
    • SOURCE
    • CLASS
      • .class 파일 수준 까지 유지하지만 Reflection으로 어노테이션 정보를 얻을 수 는 없음
    • RUNTIME
      • .class 파일 수준까지 유지하며 Reflection으로 언테이션 정보 획득 가능
  • 정리
    • 어노테이션은 외형적으로 주석에 가까워 보이지만, 실상은 값을 가지는 인터페이스 클래스
    • Java 에서는 클래스를 빌드해 얻을 수 있는 .class 파일은 독립적인 모듈처럼 재사용 가능
    • 컴파일 타임에 객체간 의존 관계 규정하는 정적인 처리방법과 달리 런타임 의존관계를 규정할 수 있는 모듈 기반 프로그래밍 환경에서 더 강력한 힘 발휘
      • 단, Relfection과 결합해야함