프로그래밍/- 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 애너테이션을 여러번 사용 할 수 있게 한다.


★ 마커 애너테이션 : 요소가 하나도 정의되지 않은 애너테이션
 
@Target 애너테이션 붙일수 있는 대상
@Retention 유지 정책
★ 애너테이션 타입 정의하기( 이렇게 돌아간다는 것만 알기 )
@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