본문 바로가기

JAVA

JAVA @어노테이션이란?

 

설명하기 앞서 어노테이션을 보다 쉽게 이해를 돕기위해서 메타데이터란 무엇인지 알아보자 

 

 

메타데이터란?

메타데이터란 데이터의 대한 속성정보이다, 데이터의 대한 데이터로서

하위 레벨 데이터를 설명 및 기술하는 데이터라고 보면 된다.

도서관을 예시로 들어보자면 표제,저자,주제명,분류기호 등이 포함되어 있는 목록이 메타데이터의 속한다

 

메타데이터를  어느정도 이해하였다, 그렇다면 어노테이션은 무엇인가?

 

어노테이션이란 메타데이터라고 볼 수 있다.

프로그램 실행 관점에서보면 프로그램이 처리할 메인 데이터가 아니라 실행과정에서 데이터를 어떻게 처리할것인지

알려주는 서브 데이터라고 볼 수 있는 것 이다.

 

 

 

 

직접적으로 사용해보기 전에 어노테이션의 용도와 사용방식을 알아보자.

 

 

 

 

어노테이션의 크게 세 가지 용도로 사용된다.

1. 코드 문법 에러 체크 

2. 코드 자동 생성 정보 제공 

3. 런타임시 특정 기능을 실행하는 정보 제공 

 

어노테이션 사용방식은 크게 두 가지로 나뉜다.

직접 생성하여 사용하는  Custom Annotaion과 JAVA에서 제공하는 Built-in Annotaion 두가지 방식이 있다.

 

 

 

 

어느정도 이해의 틀이 잡혔다면 먼져 Custom Annotaion(커스텀 어노테이션)을 알아보자.

 

 

 

 

커스텀 어노테이션 정의 

* 이클립스에서 생성할때 Package Explorer => New => Annotation 만들어짐

public @interface AnnotationName { ... } 

위와 같은 방식으로 어노테이션을 선언하지만 런타임시 컴파일러가 해당 코드를 읽지 못한다,

런타임시 클래스의 메타 정보(어노테이션)를 읽어 드리는 기능인 리플렉션(@Reflection)을 추가 선언 해주어야 된다.

리플렉션 기능으로 런타임시 어노테이션 정보를 얻을라면 어노테이션 유지정책을 RUNTIME으로 설정해야된다.

 

어노테이션 유지정책이란? 

커스텀 어노테이션을 사용할때 어노테이션 선언과 부언 설정을 도와주는 기능이 있다

어노테이션 유지정책이란 어노테이션 유지범위를 설정하는 방법이다, 소스상에서만, 컴파일된 클래스까지, 런타임 시에도 유지를 할 것인지 지정해야된다.

 

 어노테이션 유지정책은 java.lang.annotation.RetentionPolicy 열거 상수 세가지로 구성되어 있다.

 

SOURCE : 소스상에서만 어노테이션 유지 

CLASS : 바이트 코드 파일까지 어노테이션 유지 

RUNTIME : 바이트 코드 파일까지 어노테이션 정보를 유지하며 런타임시 어노테이션 정보를 얻을 수 있다.

 

 

 

 

 

어노테이션 유지정책에 대해 숙지한뒤 다시 돌아와 커스텀 어노테이션을 생성해보자.

 

 

 

@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName { ... } 

어노테이션은 메타데이터 저장을 위해 클래스처럼 멤버를 가질 수 있다, 어노테이션 내에 선언된 메소드를

어노테이션의 요소(element)라고 한다, 

 

어노테이션의 요소(element)의 개수에 따라 Marker, Single-value, Full 어노테이션으로 분류할 수 있다.

 

Marker Annotation : 요소가 없으면 단순하게 표식으로 사용되는 어노테이션, 컴파일러에게 어떤 의미 전달체로 사용

Single-value Annotaion : 요소가 한가지인 어노테이션, 단일변수 밖에 없기에 값만을 명시하여 데이터 전달이 가능하다

Full Annotaion : 요소가 둘 이상의 변수를 갖는 어노테이션, 데이터를 배열 안에 key-value 형태로 전달한다  

 

 

Full Annotaton는 int,double과 같은 기본타입 , String,열거타입,Class타입 그리고 이들의 배열타입을 사용할 수 있다,

엘리먼트의 이름 뒤에는 메소드처럼()를 붙여야되는 규칙이 있다,

@Retention(RetentionPolicy.RUNTIME)
Public @interface AnnotationName {
Stirng elementName1();  
int elementName2() default 5;
}

정의된 어노테이션을 사용할때에는 다음과 같이 선언한다.

@AnnotationName(elementName1 = "값", elementName2 = 3 )  // String , int 
or
@AnnotationName(elementName1 = "값");  // String 값만 사용하고 싶으면 단일 선언가능

elementName1은 default 값이 없기 때문에 반드시 값을 기술해야되고 elementName2는 값 생략이 가능하다.

 

 

 

 

 

어노테이션은 적용대상도 지정 할 수 있다, 

더보기

어노테이션을 적용 할 수 있는 대상은 java.lang.anntation.ElementType 열거 상수로 정의 되어있다

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

ANNOTATION_TYPE  :  어노테이션

FIELD  :  필드

CONSTRUCTOR  :  생성자

METHOD  :  메소드

LOCAL_VARIABLE  :  로컬 변수

PACKAGE  :  패키지 

적용대상을 지정할때 @Target 어노테이션을 사용한다 

@Target( { ElementType.METHOD, ElementType.FIELD } )
public @interface MyAnnotation{
String value();
}

 

 

 

커스텀 어노테이션의 대해 어느정도 개념이 잡혔다면

 

 

 

 

JAVA에서 제공하는  어노테이션 Built-in Annotaion 을 알아보자 .

자바에서 기본적으로 제공되는 주요 Built-in Annotaion

 

@Override

메소드가 슈퍼클래스의 메소드를 오버라이드한 메소드라는 정보를 컴파일러에게 전달한다.

 

@Deprecated 

버전업을 하면서 해당 클래스 / 메소드 등이 지원되지 않을 수 있기 때문에 더 이상 사용하지 말라는 경고 메세지를 알려준다. 

 

@SupressWarning

코드의 대한 오류경고가 발생할시 컴파일러에게 명령을 내려 발생하는 경고를 제거한다.

 

@FunctionalInterface

컴파일러에게 다음의 인터페이스는 함수형 인터페이스라는 것을 알린다, 오바라이딩 어노테이션과 같은 실수방지 용도로 사용된다.

 

 

 

 

 

 

 

 

 

Reference https://asfirstalways.tistory.com/309 ,  https://hamait.tistory.com/314