Hello

Java 애터네이션 타입 정의하기, 애너테이션 요소

by 볼빵빵오춘기

애너테이션 타입 정의하기

애너테이션을 직접 만들어 쓸 수 있다

정의 방법

@interface 애너테이션이름

 

✨ 애너테이션의 메서드는 추상 메서드이며, 애너테이션을 적용할 때 지정한다.(순서 상관x)

 

애너테이션의 요소

  • 적용시 값을 지정하지 않으면, 사용될 수 있는 기본값 지정 가능하다.(null 제외)
  • 요소가 하나이고 이름이 value일 때는 요소의 이름 생략 가능하다.
  • 요소의 타입이 배열인 경우, 괄호{}를 사용해야 한다.
더보기

⇒ 하나일 때는 괄호 생략가능, 여러 개일때나 값이 없을때는 괄호사용

 

모든 애너테이션의 조상

  • java.lang.annotation.Annotation
  • Annotation은 모든 애너테이션의 조상이지만 상속은 불가능하다.
  • Annotation은 인터페이스다.

 

마커 애너테이션(Marker Annotation)

요소가 하나도 정의되지 않은 애너테이션이다.

 

애너테이션 요소의 규칙

  • 요소의 타입은 기본형, String, enum, 애너테이션, Class(설계도 객체)만 허용된다.
  • (추상메소드)괄호()안에 매개변수를 선언할 수 없다.
  • 예외를 선언할 수 없다.
  • 요소를 타입 매개변수로 정의할 수 없다.

 

문제

더보기

⇒ 마지막은 타입

 

예제 코드

import java.util.*;
import java.lang.annotation.*;

@Deprecated
@SuppressWarnings("1111") // 유효하지 않은 애너테이션은 무시된다.
@TestInfo(testedBy="aaa", testDate=@DateTime(yymmdd="160101",hhmmss="235959"))

public class Try {
	public static void main(String[] args) {
		// Ex12_8의 Class객체를 얻는다.
		Class<Try> cls = Try.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);
		
	}
}

@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 }

anno.testedBy()=aaa
anno.testDate().yymmdd()=160101
anno.testDate().hhmmss()=235959
testTools=JUnit

@java.lang.Deprecated(forRemoval=false, since="")
@TestInfo(count=1, testType=FIRST, testTools={"JUnit"}, testedBy="aaa",testDate=@DateTime(yymmdd="160101", hhmmss="235959"))

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기