/ JAVAJUNGSUK

Ch12-27~33. @

자바의 정석 기초편

0. 목차



Chapter12. 지네릭스, 열거형, 애너테이션

Ch12 - 27. @FunctionalInteface

Ch12 - 28. @SuppressWarnings

Ch11 - 29. 메타 애너테이션

Ch11 - 30. @Target

Ch11 - 31. @Retention

Ch11 - 32. @Documented, @Inherited

Ch11 - 33. @Repeatable



Ch12 - 27. @FunctionalInteface


▶ @FunctionalInteface란?

▷ 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크
▷ 컴파일러가 사용하는 애너테이션
▷ 함수형 인터페이스에는 하나의 추상 메서드만 가져야 한다는 제약有


▶ @FunctionalInteface 사용 예시

▷ 추상 메서드임을 알려주는 기능도 있긴 함
@FunctionalInteface
public interface Runnable {
    public abstract void run(); // 추상 메서드
}
▷ 함수형 인터페이스에 2개의 추상 메서드를 가졌을 때
@FunctionalInteface
interface Testable { // 에러
    void test();
    void check(); // check를 만드는 순간 Testable에러, 2개의 추상 메서드 안됨
}



Ch12 - 28. @SuppressWarnings


▶ @SuppressWarnings란?

▷ 컴파일러의 경고 메서지가 나타나지 않게 억제
▷ 컴파일러가 사용하는 애너테이션
▷ 괄호() 안에 억제하고자하는 경고의 종류를 문자열로 지정


▶ @SuppressWarnings 사용 예시

▷ 컴파일러가 경고 → 애너테이션 -컴파일러에게→ 그 경고 확인 함 괜찮음
@SuppressWarnings("unchecked") // 지네릭스와 관련된 경고를 억제
ArrayList list = new ArrayList(); // 원시 타입, 지네릭 타입을 지정하지 않음, list 사용하면 unchecked 경고 발생
list.add(obj); // 여기서 unchecked 경고 발생 -했는데→ 애너테이션 때문에 경고창 안뜸
▷ 둘 이상의 경고를 동시에 억제하려면 괄호({ })에 문자열로 지정
@SuppressWarnings({"unchecked", "deprecation", "varargs"})
▷ ‘Xlint’ 옵션으로 컴파일 시, 경고 메시지 확인 가능
▷ 괄호[] 안이 경고 종류

c:\jdk1.8\work\ch12>javac -Xlint AnnotationTest.java
AnnotationTest.java:15: warning: [rawtypes] found raw type : List
public static void sort(List list) {
...
}

  • rawtypes 경고를 억제하려면?
    • @SuppressWarnings에서 rawtypes 추가
      @SuppressWarnings({"unchecked", "deprecation", "varargs", "rawtypes"})



Ch12 - 29. 메타 애너테이션


▶ 메타 애너테이션이란?

▷ 애너테이션을 만들 때 사용하는 애너테이션
▷ 즉, 애너테이션을 위한 애너테이션
▷ 메타 애너테이션은 java.lang.annotaion 패키지에 포함




Ch12 - 30. @Target


▶ @Target이란?

▷ 애너테이션이 적용가능한 대상을 지정하는데 사용
  • SuppressWarnings의 Code
      @Target ({ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE })
      @Retention (RetentionPolicy.SOURCE)
      @public @interface SuppressWarnings {
          String[] value();
      }
    

▶ 대상 타입

▷ ANNOTAION_TYPE
  • 애너테이션
▷ CONSTRUCTOR
  • 생성자
▷ FIELD
  • 필드(enum상수, 멤버변수-cv, iv)
▷ LOCAL_VARIABLE
  • 지역변수
▷ METHOD
  • 메서드
▷ PACKAGE
  • 패키지
▷ PARAMETER
  • 매개 변수
▷ TYPE
  • 타입(클래스, 인터페이스, enum)
▷ TYPE_PARAMETER
  • 타입 매개 변수(JDK1.8)
▷ TYPE_USE
  • 타입이 사용되는 모든 곳(JDK1.8)

▶ @Target 사용 예시

▷ @MyAnnotation 적용 대상 설정
▷ @MyAnnotation 정의
▷ @MyAnnotation 사용
import static java.lang.annotation.ElementType.*;

@Target ({ FIELD, TYPE, TYPE_USE }) // @MyAnnotation 적용 대상
public @interface MyAnnotation { } // @MyAnnotation을 정의

@MyAnnotation
class MyClass { // @MyAnnotation 적용 대상 : TYPE
    @MyAnnotation // @MyAnnotation 적용 대상 : FIELD
    int i;
    
    @MyAnnotaion // @MyAnnotation 적용 대상 : TYPE_USE
    MyClass mc;
}



Ch12 - 31. @Retention


▶ @Retention이란?

▷ 애너테이션이 유지되는 범위를 지정하는 데 사용


▶ 유지 정책

▷ SOURCE
  • 소스 파일에만 존재
  • 클래스 파일에는 존재하지 않음
  • 컴파일러에 의해 사용되는 애너테이션의 유지정책
    • @Override의 Code
        @Target(ElementType.METHOD)
        @Retention(RetentionPolicy.SOURCE)
        public @interface Override {
        }
      
      • SOURCE로 지정 되어있음
        @Override는 컴파일러가 오버라이딩 체크할 때까지만 사용
        그래서 클래스 파일에는 남아있지 않음
▷ RUNTIME
  • 클래스 파일에 존재
  • 실행 시, 사용 가능
  • 실행 시, 사용 가능한 애너테이션의 정책
    • @FunctionalInterface Code
        @Documented
        @Retention(RetentionPolicy.RUNTIME)
        @Target(ElementType.TYPE)
        public @interface FunctionalInterface { }
      
      • RUNTIME로 지정 되어있음
        @FunctionalInterface는 실행 시 까지 FunctionalInterface의 작성 확인
        그래서 클래스 파일에도 살아있음
▷ CLASS
  • 클래스 파일에 존재
  • 실행 시, 사용 불가
  • 기본값



Ch12 - 32. @Documented, @Inherited


▶ @Documented란?

▷ 애너테이션 정보가 javadoc으로 작성 된 문서에 포함되게 함
javadoc으로 작성한 문서에 포함시키려면 @Documented를 붙임
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface { }


▶ @Inherited

▷ 애너테이션이 자손 클래스에 상속되도록 함
▷ 애너테이션도 상속 가능


▶ @Inherited 사용 예시

▷ 조상이 @Inherited 붙으면 자손은 붙이지 않아도 붙은 것으로 간주
▷ @Inherited 붙은 놈이 상속하는 놈
@Inherited // SuperAnno를 상속하는 조상 애너테이션으로 만듦
@interface SuperAnno {} // SuperAnno : 조상 애너테이션

@SuperAnno
class Parent {}

class Child extends Parent {} // Child는 애너테이션 없지만 붙은 것으로 인식



Ch12 - 33. @Repeatable


▶ @Repeatable이란?

▷ 반복해서 붙일 수 있는 애너테이션을 정의 할 때 사용(JDK1.8)


▶ @Repeatable 사용 예시

▷ 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용
@Repeatable(ToDos.class) // ToDo 애너테이션을 여러 번 반복하여 사용할 수 있게 함
@interface ToDo {
    String value();
}
▷ @Repeatable이 붙은 애너테이션은 반복 사용 가능
@ToDo("delete test codes.") // 1번
@ToDo("override inherited methods") // 2번
class myClass {
    ...
}
▷ @Repeatable인 @ToDo를 하나로 묶을 컨테이너 애너테이션도 정의해야 함
@interface ToDos { // 여러 개의 @ToDo를 담을 컨테이너 애너테이션 ToDos
    ToDo[] value(); // ToDo 애너테이션 배열 타입의 요소를 선언, 이름은 반드시 value!
}