본문 바로가기
Study/Java_study

Java_study_12 (애노테이션)

by hjshims 2021. 9. 14.

♨학습내용

더보기

 애노테이션 정의하는 방법

@retention

@target

@documented

애노테이션 프로세서

 

  • 애노테이션 정의하는 방법
  • 애노테이션 (annotation)이란?

- 오버라이딩을 하다보면 @Override와 같은 '@' 태그가 붙은 메소드가 있다.

- '@' 태그는 애노테이션을 정의하는 태그로 미리 정의된 태그들을 이용해 프로그램 코드 안에 추가적인 정보를 지정하고 다른 프로그램에게 유용한 정보를 제공하는 메타데이터이다.

- 애노테이션은 JDK1.5에서 추가되었다.

- JDK에서 제공하는 표준 애노테이션은 컴파일 할 때 필요한 정보를 제공하며, 새로 애노테이션을 정의할 때 사용하는 메타 애노테이션이 있다.

 

  • 표준 애노테이션 종류

- @Override : 컴파일러에게 오버라이딩 메소드라는 것을 알린다.

- @Deprecated : 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다.

- @SuppressWarmings : 컴파일러의 특정 경고메시지가 나타나지 않게 해준다.

- @SafeVarargs : 제네릭 타입의 가변인자에 사용한다.

- @Functionallnterface : 함수형 인터페이스라는 것을 알린다.

- @Vative : native 메소드에서 참조되는 상수 앞에 붙인다.

 

  • 메타 애노테이션 종류

- @Target : 애노테이션이 적용가능한 대상을 지정하는데 사용한다.

- @Documented : 애노테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다.

- @lnherited : 애노테이션이 하위 클래스에 상속되도록 한다.

- @Retention : 애노테이션이 유지되는 범위를 지정한다.

- @Repeatable : 애노테이션을 반복해서 적용할 수 있게 한다.

 

  • 애노테이션 정의하는 방법

- 새로운 애노테이션을 만드는 것은 기존의 인터페이스를 정의하는 것과 같고 @ 기호만 붙이면 된다.

 

@interface 애노테이션이름 {
 타입 요소이름(); // 애노테이션의 요소 선언
}

 

- 애노테이션 안에 선언된 메소드를 애노테이션의 요소라고 한다.

 

@interface TestInfo {
	int count();
	String testedBy();
	String[] testTools();
	TestType testType(); // enum TestType{ FIRST, FINAL }
	DateTime testDate(); // 다른 애노테이션을 포함
}

@interface DateTime{
	String yymmdd();
	String hhmmss();
}

 

- 애노테이션의 요소는 반환값이 있고 매개변수가 없는 추상 메소드의 형태를 가지기 때문에 상속을 통해 구현하지 않아도 된다.

 

@TestInfo{
	count=3, testedBy="Kim",
	testTools={"Junit","AutoTester"},
	testType=TestType.FIRST,
	testDate=@DateTime{yymmdd="20210305",hhmmss="235959"}
}

public class TestClass{
		....
}

 

 


 

 

  • @retention

- 애노테이션이 유지(retention)되는 기간을 지정하는데 사용한다.

RetentionPolicy 열거 상수 설명
SOURCE 소스상에서만 애노테이션 정보를 유지한다.
소스 코드를 분석할 때만 의미가 있고,
바이트 코드 파일에는 정보가 남지 않는다.
CLASS 바이트 코드 파일까지 애노테이션 정보를 유지한다.
하지만 리플렉션을 이용해 애노테이션 정보를 얻을 수 없다.
RUNTIME 바이트 코드 파일까지 애노테이션 정보를 유지한다.
리플렉션을 이용해 애노테이션 정보를 얻을 수 있다.

※ 리플렉션(Reflection)

리플렉션이란 런타임 시에 클래스의 메타 정보를 얻는 기능으로 클래스가 가지고 있는 필드가 무엇인지, 어떤 생성자를 갖고 있는지, 어떤 메소드를 가지고 있는지, 적용된 애노테이션은 무엇인지 알아내는 것이다.

 

리플렉션을 이용해 런타임 시 애노테이션 정보를 얻으려면 애노테이션 유지 정책을 RUNTIME으로 설정해야 한다. 애노테이션 유지 정책을 지정할 때 사용되는 것이 바로 @Retention 애노테이션이다. @Retention의 기본 엘리먼트인 value는 RetentionPolicy 타입으로 위 3가지 열거 상수 중 하나를 지정하면 된다.

 

코드 자동 생성 툴을 개발하지 않는 이상 우리가 작성하는 애노테이션은 대부분 런타임 시점에 사용하기 위한 용도로 만들어진다.

 

런타임 유지 정책을 적용하여 설정한 코드는 다음과 같다.

 

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName {
}

 

 


 

  • @target

자바 컴파일러가 애노테이션이 어디에 적용될지 결정하기 위해 사용한다. 선언 가능한 위치는 다음과 같다.

 

- ElementType.PACKAGE : 패키지 선언

- ElementType.TYPE : 타입 선언

- ElementType.ANNOTATION_TYPE : 애노테이션 타입 선언

- ElementType.CONSTRUCTOR : 생성자 선언

- ElementType.FIELD : 멤버 변수 선언

- ElementType.LOCAL_VARIABLE : 지역 변수 선언

- ElementType.METHOD : 메서드 선언

- ElementType.PARAMETER : 전달인자 선언

- ElementType.TYPE_PARAMETER전달인자 타입 선언

- ElementType.TYPE_USE : 타입 선언

 

  • 런타임 시 애노테이션 정보 사용하기

- 애노테이션 자체는 아무런 동작을 가지지 않지만 리플렉션을 이용해 애노테이션의 적용 여부와 엘리먼트 값을 읽고 처리할 수 있다.

- 클래스에 적용된 애노테이션 정보를 얻기 위해 java.lang.Class를 이용하지만, 필드, 생성자, 메소드에 적용된 애노테이션의 정보를 얻기 위해 Class의 다음 메소드들을 통해 java.lang.reflect 패키지의 Field, Constructor, Method 타입의 배열을 얻어야 한다.

 

리턴 타입 메소드명(매개 변수) 설명
Field[] getFields() 필드 정보를 Field 배열로 리턴
Constructor[] getConstructors() 생성자 정보를 Constructor 배열로 리턴
Method[] getDeclaredMethods() 메소드 정보를 Method 배열로 리턴

 

- 이후 Class, Field, Constructor, Method가 가지고 있는 다음 메소드를 호출해 적용된 애노테이션 정보를 얻는다.

 

 


 

  • Documented 

- 애노테이션의 정보를 javadoc으로 작성한 문서에 포함되도록 한다.

- 자바에서 제공하는 기본 애노테이션 중에 @Override와 @SupperssWarnings를 제외한 나머지 애노테이션은 @Documented 메타 애노테이션이 붙어 있습니다.

※ JavaDoc : Java 코드를 설명하는 HTML 형식의 문서이다.

 

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface CustomAnnotation {
	String testDocument();
}

 

 


 

 

  • 애노테이션 프로세서 

- 애노테이션 프로세서는 자바 컴파일러 일종의 플러그인이다.

- 애노테이션으로만 구동되는 소스코드를 검사, 수정 또는 생성하는데 사용된다.

- 애노테이션 프로세서는 javax.annotation.processing.Processor인터페이스를 구현해야한다.

- 사용 사례에 따라 아래 상황에서 사용된다.

1) 소스 또는 리스스 파일 세트 생성

2) 기존 소스 코드 변경 (수정)

3) 기존 소스 코드 분석 및 진단 메세지 생성

 

 

'Study > Java_study' 카테고리의 다른 글

Java_study_14 (제네릭)  (0) 2021.09.20
Java_study_13 (I/O)  (0) 2021.09.20
Java_study_11 (Enum)  (0) 2021.09.07
Java_study_10 (멀티쓰레드 프로그래밍)  (0) 2021.08.30
Java_study_9 (예외처리)  (0) 2021.08.23