안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
어노테이션(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() { }
}
'자바' 카테고리의 다른 글
JAVA 자바 상속의 개념 , 자바 상속 (0) | 2017.03.12 |
---|---|
JAVA 자바 어노테이션 유지 정책과 런타임 시 어노테이션 정보 활용하기 (0) | 2017.03.12 |
JAVA 자바 Getter 와 Setter (0) | 2017.03.12 |
JAVA 자바 필드 접근 제한과 메서드 접근 제한 (0) | 2017.03.12 |
JAVA 자바 생성자의 접근 제한 (0) | 2017.03.12 |