Annotations

man soup·2020년 6월 8일
0

자바 문법

목록 보기
4/15

Annotations

  • 메타데이터
  • annotate한 코드의 동작에 직접적인 영향 주지 않는다.
  • 컴파일러에게 정보 제공
    • 에러 detect 또는 waring 막아줌
  • 컴파일타임 과 배포타임에 사용
    • 소프트웨어 도구로 annotation 정보를 통해 코드,XML 파일 등을 생성할 수 있다.
  • 런타임에 사용
    • 몇몇의 annotation은 런타임에 확인될 수 있다.

The Format of an Annotation

  • 생김새 : @Override
  • @가 컴파일러에게 뒤에 오는게 annotation이라고 알려줌
  • 어노테이션은 elements를 가질 수 있다.
    • @Author( name = "lck", birth = "2020/06/08" )
    • element 2개 이상일때 name = value, name2 = value2, ... 형태로
    • 1개라면 name 생략가능
    • 0개이면 괄호 생략가능
    • 여러개의 어노테이션 사용 가능
      • @Author( name = "lck")
        @EBook
        class BookClass {...}
  • 같은 타입의 어노테이션 갖는 경우 repeating annotation이라고 부른다.
  • 어노테이션 타입은 자바SE API의 java.lang 또는 java.lang.annotation 패키지에 존재하는 타입중 하나가 될 수 있다.
  • 자신의 어노테이션 타입을 정의해 사용할 수 있다.

Where Annotations Can Be Used

  • 선언에 사용할 수 있다. ( 클래스,필드,함수, 다른 프로그램 원소 등의)
  • 이러한 선언에 사용될 경우 각 어노테이션은 한줄에 하나씩 사용됨(컨벤션)
  • Java SE 8 부터 어노테이션은 타입처럼 사용될 수 있다. 타입 어노테이션이라고 지칭한다.
    • 클래스 인스턴스 생성 expression : new @Interned MyObject();
    • 타입 캐스트 : myString = (@NonNull String) str;
    • implements clause
    • thrown exception 선언

Declaring an Annotation Type

  • 많은 annotations들이 comments를 대신한다.
  • 예를 들어 어떤 회사에서 클래스body 시작을 comment를 통해 중요 정보를 제공할 경우
    •    public class Generation3List extends Generation2List {
         // Author: John Doe
         // Date: 3/17/2002
         // Current revision: 6
         // Last modified: 4/12/2004
         // By: Jane Doe
         // Reviewers: Alice, Bill, Cindy
         // class code goes here
      }
  • 어노테이션으로 같은 메타데이터를 제공할 수 있는데 이때 먼저 어노테이션 타입을 정의해야한다.
    •    @interface ClassPreamble {
         String author();
         String date();
         int currentRevision() default 1;
         String lastModified() default "N/A";
         String lastModifiedBy() default "N/A";
         // Note use of array
         String[] reviewers();
      }
  • 어노테이션 타입 정의는 인터페이스 정의와 비슷하다.
  • @interface를 통해 시작
  • 어노테이션 타입이 정의가 되면 값을 채워넣어 사용할 수 있다.
    •    @ClassPreamble (
         author = "John Doe",
         date = "3/17/2002",
         currentRevision = 6,
         lastModified = "4/12/2004",
         lastModifiedBy = "Jane Doe",
         // Note array notation
         reviewers = {"Alice", "Bob", "Cindy"}
      )
      public class Generation3List extends Generation2List {
      // class code goes here
      }

Predefined Annotation Types

  • 몇몇의 어노테이션 타입은 Java SE API에 미리 정의되있다.
  • 몇몇은 컴파일러가 사용하고, 몇몇은 다른 어노테이션에 적용한다.

Annotation Types Used by the Java Language

  • java.lang에 정의된 어노테이션 타입 3가지
    • @Deprecated, @Override, @SuppressWarnings
  • @Deprecated
    • 이 어노테이션은 표시된 element가 deprecated되어 더이상 사용되면 안된다는 것을 알려준다.
    • 프로그램이 이 어노테이션으로 표시된 함수,클래스,필드를 사용 시 컴파일러는 warning을 보낸다.
  • @Override
    • 컴파일러에게 표시된 element가 superClass의 element를 override했다는 것을 알려준다.
    • 필수는 아니지만 error 방지에 도움 준다. 이 어노테이션으로 표시된 함수가 override에 실패하면 컴파일러가 error를 생성한다. ( ex) override하려한 함수명 다르게 적어놓은 경우)
  • @SuppressWarning
    • 컴파일러에게 특정 warning을 내지 마라고 지시한다.
    • ex) deprecated함수 사용시에 사용
    • 모든 컴파일러 warning은 카테고리에 속하는데 JLS에 2가지 카테고리가 있다. deprecation & unchecked
    • unchecked warning은 제네릭이 개발전 만들어진 legacy code를 접촉할때 발생한다.
    • 두 warning 없애려면 @SuppressWarning({"unchecked", "deprecation"}) 사용
  • Annotations That Apply to Other Annotations
    • 메타 어노테이션이라고 불름
    • java.lang.annotation에 정의되있음
    • @Target
      • 다른 어노테이션이 어떤 자바 element에 사용될 수 있는지 표시해준다.

Type Annotations and Pluggable Type Systems

  • java SE 8 이전에는 어노테이션이 오직 선언에서만 사용될 수 있었다.
  • 이후엔 어떤 타입에도 사용가능(new, casts,implements...)
  • 타입 어노테이션은 더욱 강력한 타입 체킹을 지원하기 위해 만들어 졌다.
  • 예를 들어 어떤 변수가 null이 할당되지 않는 다는 것을 확신하기 위해서 @NonNull을 사용한다. 컴파일시 NonNull 변수를 확인 해 잠정적 문제를 발견하면 warning을 띄운다.

Repeating Annotations

  • 자바 SE 8 이후부터 선언또는 type use에 같은 어노테이션을 중복 사용할 수 있게 되었다.
  • 호환성을 위해 자바 컴파일러가 자동적으로 생성하는 container annotation에 저장된다. 2가지 선언이 있어야 컴파일러가 위 행동을 한다.
    • Declare a Repeatable Annotation Type :
      • 어노테이션 타입을 정의할 때 @Repeatable 메타-어노테이션으로 표시해야한다.
      • 괄호 안에 자바 컴파일러가 생성할 컨테이너 어노테이션 타입(repeating annotation들을 저장할)을 값으로 넣는다.
    • Declare the Containing Annotation Type
      • containing annotation 타입은 value element를 배열타입으로 가져야 한다.
      • 배열의 타입은 reapeatable 어노테이션 타입이여야 한다.
profile
안녕하세요

0개의 댓글