프로그래밍/- java
애너테이션
즐겁게 하하하
2022. 2. 4. 09:16
728x90

★ 애너테이션 : 주석처럼 프로그래밍 언어에 영향을 미치지 않으며 유용한 정보를 제공한다.
- 기본값 지정 가능하다( null 제외 ) > int count() default 1;
- 요소의 타입이 배열인 경우에 {} 를 사용 > @Test( testTools={} )
- 요소인 추상 매서드는 구현할 필요 없다 , 사용은 가능하다.
- 요소의 타입은 기본형, String, enum , 애너테이션 , Class 만 가능
- 괄호 안에 매개변수 불가
- 예외 선언 불가
- 요소를 타입 매개변수로 정의할 수 없다. <T>
@애너테이션
public void method(){ }
@SuppressWarnings( {"deprecation" , "uncheked" } ) :: 둘이상의 경고를 동시에 억제
- 컴파일러가 주는 에러를 확인햇다는 표식이 된다.
- Xlint 옵션으로 컴파일 하면 경고 메시지를 확인 할 수 있다.
★ 메타 애너테이션 : 애너테이션을 만들때 사용
java.lang.annotation 패키지에 포함됨
@Target( {"FIELD" , "TYPE" } )
@Retention( RetentionPolicy.SOURCE )
- 컴파일러에 의해 사용되는 애너테이션 유지정책 : SOURCE
- 실행시 사용가능한 애너테이션 유지정책 : RUNTIME
@Repeatable( ToDos.class )
- Todo 애너테이션을 여러번 사용 할 수 있게 한다.
★ 마커 애너테이션 : 요소가 하나도 정의되지 않은 애너테이션


★ 애너테이션 타입 정의하기( 이렇게 돌아간다는 것만 알기 )
@interface 애너테이션 이름 {
타입 요소 이름(); :: 애너테이션의 요소를 선언한다.
}
@interface TestInfo{ // 정의
int count();
String testedBy();
TestType testType(); // enu, TestType { FIRST , FINAL }
DateTime testDate(); // 자신이 아닌 다른 애너테이션(@DateTime)을 포함할 수 있다.
}
@TestInfo( //사용
count = 2, testBy = "KIM";
testType = TestType.FIRST;
testDate = @DateTime(yymmdd="160101" , hhmmss="235959" )
)
import java.lang.annotation.*;
@Deprecated
@SuppressWarnings("1111") // 유효하지 않은 애너테이션은 무시된다.
@TestInfo(testedBy="aaa", testDate=@DateTime(yymmdd="160101",hhmmss="235959"))
class Ex12_8 {
public static void main(String args[]) {
// Ex12_8의 Class객체를 얻는다.
Class<Ex12_8> cls = Ex12_8.class;
TestInfo anno = cls.getAnnotation(TestInfo.class);
System.out.println("anno.testedBy()="+anno.testedBy());
System.out.println("anno.testDate().yymmdd()=" +anno.testDate().yymmdd());
System.out.println("anno.testDate().hhmmss()=" +anno.testDate().hhmmss());
for(String str : anno.testTools())
System.out.println("testTools="+str);
System.out.println();
// Ex12_8에 적용된 모든 애너테이션을 가져온다.
Annotation[] annoArr = cls.getAnnotations();
for(Annotation a : annoArr)
System.out.println(a);
} // main의 끝
}
@Retention(RetentionPolicy.RUNTIME) // 실행 시에 사용가능하도록 지정
@interface TestInfo {
int count() default 1;
String testedBy();
String[] testTools() default "JUnit";
TestType testType() default TestType.FIRST;
DateTime testDate();
}
@Retention(RetentionPolicy.RUNTIME) // 실행 시에 사용가능하도록 지정
@interface DateTime {
String yymmdd();
String hhmmss();
}
enum TestType { FIRST, FINAL }
728x90