12-34~37 애너테이션 타입 정의, 애너테이션의 요소

oyeon·2020년 12월 29일
0

Java 개념

목록 보기
49/70

애너테이션 타입 정의

  • 애너테이션을 직접 만들어 쓸 수 있다.
@interface DateTime {	// @interface 애너테이션이름
   // 타입 요소이름(); 애너테이션의 요소를 선언
   String yymmdd();	// 날짜
   String yymmdd();	// 시간
}
  • 애너테이션의 메서드는 추상 메서드(구현 X)이며, 애너테이션을 적용할 때 지정(순서 X)

애너테이션 정의

@interface TestInfo {
    int count();
    String testedBy();
    String[] testTools();
    TestType testType();   // enum TestType { FIRST, FINAL }
    DateTime testDate();   // 자신이 아닌 다른 애너테이션(@DateTime) 포함 가능
}

애너테이션 사용

@TestInfo(
    count=3, testedBy="Kim",
    testTools={"JUnit", "AutoTester"},
    testType = TestType.FIRST,
    testDate=@DateTime(yymmdd="210101", hhmmss="235959")
)
public class NewClass { ... }

애너테이션의 요소

  • 적용시 값을 지정하지 않으면, 사용될 수 있는 기본값 지정 가능(null 제외)
@interface TestInfo{
    int count() default 1;	// 기본값 지정
}
@TestInfo	// @TestInfo(count=1)과 동일. default값이 없으면 (count=1) 필수
public class NewClass { ... }
  • 요소가 하나이고 이름이 value일 때는 요소의 이름 생략 가능
@interface TestInfo{
    String value();
}
@TestInfo("passed")	// @TestInfo(value="passed")와 동일
class NewClass { ... }
  • 요소의 타입이 배열인 경우, 괄호{}를 사용해야 한다.
@Interface TestInfo {
    String[] testTools();
}
@Test(testTools={"JUnit", "AutoTester"})
@Test(testTools="JUnit")
@Test(testTools={})	// 값이 없을 때는 괄호{}가 반드시 필요

모든 애너테이션의 조상 - java.lang.annotation.Annotation

  • Annotation은 모든 애너테이션의 조상이지만 상속(extends Annotation)은 불가
  • 사실 Annotation은 인터페이스이다. 따라서 추상메서드들을 포함하고 있으며, 다른 애너테이션 처럼 추상메서드가 구현되어 있지 않지만 사용할 수 있다.

마커 애너테이션(Marker Annotation)

  • 요소가 하나도 정의되지 않은 애너테이션
@Test	// 마커 애너테이션. 이 메서드가 테스트 대상임을 테스트 프로그램에게 알린다.
public void method() {
	...
}

애너테이션 요소의 규칙

  • 애너테이션의 요소를 선언할 때 아래의 규칙을 반드시 지켜야 한다.
    - 요소의 타입은 기본형, String, enum, 애너테이션, Class만 허용됨
    - 괄호()안에 매개변수 선언 불가
    - 예외 선언 불가
    - 요소를 타입 매개변수로 정의할 수 없다.
  • 아래의 코드에서 잘못된 부분은 무엇인지 생각해보자.
@interface AnnoTest {
    int id = 100;			// OK
    String major(int i, int j);		// Error!! 매개변수 X
    String minor() throws Exception;	// Error!! 예외 X
    ArrayList<T> list();		// Error!! 타입 매개변수 X
}
profile
Enjoy to study

0개의 댓글