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는 컴파일러가 오버라이딩 체크할 때까지만 사용
그래서 클래스 파일에는 남아있지 않음
- @Override의 Code
▷ RUNTIME
- 클래스 파일에 존재
- 실행 시, 사용 가능
- 실행 시, 사용 가능한 애너테이션의 정책
- @FunctionalInterface Code
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface FunctionalInterface { }
RUNTIME
로 지정 되어있음
@FunctionalInterface는 실행 시 까지 FunctionalInterface의 작성 확인
그래서 클래스 파일에도 살아있음
- @FunctionalInterface Code
▷ 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!
}