자바

JAVA 자바 어노테이션 타입의 정의와 적용, 어노테이션 적용 대상

알통몬_ 2017. 3. 12. 19:28
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

어노테이션

 어노테이션(Annotation)은 메타 데이터(metadata)라고 볼 수 있습니다. 

메타데이터 : 애플리케이션이 처리해야 할 데이터가 아니라

 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보입니다. 

어노테이션은 아래와 같은 형태로 작성합니다.

@AnnotationName

그리고 세 가지 용도로 사용됩니다.

-컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공

-소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동을 생성할 수 있도록 정보를 제공

-실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공


컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공하는 대표적인 예는 @Override 어노테이션입니다.

 @Override 는 메서드 선언 시 사용, 메서드가 오버라이드(재정의)된 것임을 

컴파일러에게 알려주어 컴파일러가 오버라이드 검사를 하도록 합니다. 

정확히 오버라이드가 되지 않았다면 컴파일러는 에러를 발생시킵니다. 

어노테이션은 빌드 시 자동으로 XML 설정 파일을 생성하거나, 

배포를 위해 JAR 압축 파일을 생성하는데에도 사용됩니다. 

그리고 실행 시 클래스의 역할을 정의하기도 합니다.


어노테이션 타입 정의와 적용

 어노테이션 타입을 정의하는 방법은 인터페이스를 정의하는 것과 유사합니다. 

아래와 같이

@interface를 사용해서 어노테이션을 정의하며, 그 뒤에 사용할 어노테이션 이름이 옵니다.

public @interface AnnotationName {

}

이렇게 정의한 어노테이션 코드는 아래와 같이 사용합니다.

@AnnotationName

또한 어노테이션은 엘리먼트를 멤버로 가질 수 있습니다.

 각 엘리먼트는 타입과 이름으로 구성되고, 디폴드 값을 가질 수 있습니다.

public @interface AnnotationName {

  타입 elementName() [default 값];

  ...

}


엘리먼트의 타입으로는 기본타입이나 String, 열거타입, Class타입 그리고 이들의 배열 타입을 사용있음.

엘리먼트 이름 뒤에는 ()를 붙어야함.

ex)

public @interface AnnotationName {

 String elementName1();

 int elementName2() default 5;

}

이렇게 정의한 어노테이션을 코드에서 적용할 때는 아래와 같이 합니다.

@AnnotationName(elementName1="값" , elementName2=3);

또는

@AnnotationName(elementName1="값");


elementName1은 디폴트 값이 없으므로 반드시 값을 기술해야 하고, 

elementName2는 디폴트 값이 있으므로 생략가능.


@AnnotationName("값"); 처럼 값이 필요한 엘리먼틔 값만 기술할 수도 있습니다.

하지만 다른 엘리먼트 값도 동시에 주고 싶다면 첫 번째 방법처럼 지정해야 합니다.


어노테이션 적용 대상

 대상은 java.lang.annotation.ElementType 열거 상수로 아래와 같이 정의되어 있습니다.


ElementType 열거 상수         적용 대상

TYPE                           클래스, 인터페이스, 열거타입

ANNOTATION_TYPE           어노테이션

FIELD                           필드
CONSTRUCTOR                생성자
METHOD                        메서드
LOCAL_VARIABLE             로컬 
PACKAGE                       패키지


어노테이션 적용대상을 지정할 때에는 @Target 어노테이션을 사용. 

@Target의 기본 엘리먼트인 value는 ElementType 배열을 값으로 가집니다. 

어노테이션이 적용될 대상을 복수 개로 지정하기 위해서입니다.

ex)

@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})

pubilc @interface AnnotationName{

}

아래 처럼 클래스, 필드, 메서드만 어노테이션을 적용할 수 있고 생성자는 적용할 수 없습니다.

@AnnotationName

public class ClassName{

    @AnnotationName

    private String fieldName;


   //@AnootationName (x) 위 @Target에 CONSTRUCTOR 가 없어서 생성자는 적용할 수 없습니다.

   public ClassName() { }


  @AnnotationName

  public void methodName() { }

}

반응형