2018년 4월 12일 목요일

Annotation

1. 어노테이션
  ○ 쉽게 메타데이터
     - 메타데이터: 처리데이터가 아님
       곧, 컴파일 실행과정에서 코드를 어떻게 컴파일 하고 처리할 것인지 알려주는 정보
  ○ 형태
      - @AnnotationName
  ○ 용도
      - (컴파일러) 컴파일러야 문법 에러 체크해라
      - (빌드, 배치)개발자: 나는 한줄만 적을게. 빌드나 배치돌때 코드를 자동 생성해줘라
      - (실행, 런타임) 내가 특정한 기능을 같이 실행해라

2. 대표적인 예시
  ○ @Override
     1) 메소드가 오버라이드 됐다 컴파일러야. 한번 문법 오류 점검해봐
     2) 컴파일러: 오류발생했다.
     3) 빌더: XML 설정파일 생성해줄게
     4) 배포: JAR 압축파일 생성해줄게
     5) 실행: 클래스 역할 정의해줄게

3. 타입 정의와 적용
  ○ @interface
      - 정의: public @interface AnnotationName{}
      - 사용: @AnnotationName
      - 정의 시 엘리먼트 멤버 포함가능
           public @interface AnnotationName{
              타입 elementName() [디폴트값];       ==> 엘리먼트 선언부
           }
         · 타입: 기본형+참조형 anything
         · 이름 뒤 메소드 같은 괄호 필요(String elementName();, int eN2 default 5;
      - 엘리먼트 멤버 사용 방법
         · @AnnotationName(elementName1="값", eN2=3);
         · @AnnotationName(elementName1="값");
         · 디폴트값이 없는 경우 사용 시 반드시 값을 명시적으로 초기화 해야한다.
      - 기본 엘리먼트 value
           public @interface AnnotationName{
              String value();
           }
         · value는 사용 시 값만 명시 가능하다.
              @AnnotationName("퇴근");
         · 기본 value와 다른 엘리먼트 동시 초기화 시 엘리먼트 멤버 사용방법 참고


4. 적용대상
  ○ java.lang.annotation.ElementType 참고
   - https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/ElementType.html
  ○ @target
      - 어노테이션 적용 대상 지정
      - 기본 엘리먼트인 value는 ElementType 배열을 를 가진다.(어노테이션 적용대상을 복수개로 지정)
      -  https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Target.html
  ○ 어노테이션은 클래스, 필드, 메소드만 적용가능
           public class Monitor{
           // 이런거(생성자) 불가
           // @AnnotationName
              public Monitor();

           // 이런거 가능
              @AnnotationName
              private String bright;

              @AnnotationName\
               public void turnOn(){ ... }

           }

5.  유지정책
  ○ java.lang.annotation.RetentionPolicy 열거상수 참고
      -  https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/Retention.html
      -  https://docs.oracle.com/javase/8/docs/api/java/lang/annotation/RetentionPolicy.html
  ○ 리플렉션(reflection)
      -  런타임 시 클래스의 메타 정보 얻는 기술
      -  @Retention
      -  @Retention(RetentionPolicy.RUNTIME): retained by the VM at run time, so they may be read reflectively.
      -  @Retention(RetentionPolicy.SOURCE):  discarded by the compile
      -  @Retention(RetentionPolicy.CLASS): but need not be retained by the VM at run time


6.  런타임 시 어노테이션정보 사용하기   ○ class Annotation: java.lang.Class
  ○ Filed, Constructor, Method: Class--> java.lang.reflect의 패키지 사용
      -  Field 클래스: https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Field.html
      -  Method 클래스: https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Method.html
      -  Constructor클래스: https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/Constructor.html

댓글 없음:

댓글 쓰기

[Android Studio] Installation and Make a Layer for Mac OS(High Sierra)

1. download android studio https://developer.android.com/studio/#downloads 2. Make a Shared Resource(String in this case) 3...