목차
1. Annotation
2. Annotation 핵심 요소
Annotation
※Annotation 이란?
어노테이션 이란, 본래의 의미는 주석이라는 뜻이며 인터페이스를 기반으로 한 문법 입니다.(실제 Annotation을 생성하는 방식에서 @interface를 사용합니다.)
실제 메타 데이터로 이용되며 클래스, 메서드, 변수, 매개변수 및 패키지 등에 주석처럼 달아서 사용합니다.
@Controller
public class TestController {
...
}
※ Annotation 사용이유
기존의 자바 웹 애플리케이션들은 대부분 설정값을 XML파일에 명시하여 관리했습니다. 변경될 수 있는 데이터들을 코드가 아닌 외부 설정 파일(XML)에 분리하기 때문에, 재컴파일 없이도 쉽게 변경사항을 저장할 수 있었습니다.
하지만, 프로그램 작성을 위해 매번 많은 설정을 해야하며, 수 많은 설정파일들을 관리해야 했습니다. (웹 애플리케이션의 규모가 커지면 그만큼 많은 설정 파일들을 관리해야 했습니다.)
이러한 문제점을 해결하기 위해 고안된 문법이 Annotation입니다,
어노테이션을 사용하면 데이터에 대한 유효성 검사조건을 보다 쉽게 파악할 수 있게 되며 코드가 깔끔해집니다.
단순히 부가적인 표현뿐만 아니라 리플렉션을 이용하면 어노테이션 지정만으로 원하는 클래스를 주입할 수 있습니다.
※ Annotation 용도
1. @Override 어노테이션 처럼 컴파일러를 위한 정보를 제공하기 위한 용도
2. 스프링 프레임워크의 @Controller 어노테이션 처럼 런타임에 리플렉션을 이용해서 특수 기능을 추가하
기 위한 용도
3. 컴파일 과정에 어노테이션 정보로부터 코드를 생성하기 위한 용도
Annotation 핵심 요소
※ Annotation 종류
- built-in Annotation
- 이미 java에 내장되어 있는 어노테이션을 built-in Annotation 이라고 합니다.
- 주로 컴파일러를 위한 위한 것으로 컴파일러에게 유용한 정보를 제공합니다.
@Override
- 선언한 메서드가 오버라이드 되었다는 것을 나타냅니다.
- 만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생 시킵니다.
@Deprecated
- 해당 메서드가 더 이상 사용되지 않음을 표시합니다.
- 만약 사용할 경우 컴파일 경고를 발생 시킵니다.
@SuppressWarnings
- 선언한 곳의 컴파일 경고를 무시하도록 합니다.
@SafeVarargs
- Java7 부터 지원하며, 제너릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시합니다.
@FunctionalInterface
- Java8 부터 지원하며, 함수형 인터페이스를 지정하는 어노테이션입니다.
- 오버라이딩 어노테이션과 마찬가지로 실수를 미연에 방지하기 위해 사용됩니다.
@Service("LoginService")
public class LoginServiceImpl implements LoginService{
@Override
public UserVO selectUser(UserVO userVO) {
return loginDAOImpl.getUserInfo(userVO);
}
}
- Meta Annotation
- 어노테이션에 사용되는 어노테이션으로 해당 어노테이션의 동작대상을 결정합니다.
- 주로 새로운 어노테이션을 정의할 때 사용합니다.
@Retention
- 자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 어노테이션이 유지되는 기간을 지정하는데
사용합니다.
- 세 가지 유지 정책(retention policy)를 사용할 수 있습니다.
<사용 종류>
RetentionPolicy.SOURCE : 컴파일 전까지만 유효. (컴파일 이후에는 사라짐)
RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효.
RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능. (리플렉션 사용)
@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 : 타입 선언
@Documented
- 해당 어노테이션을 javadoc에 포함시킵니다.
@Inherited
- 어노테이션의 상속을 가능하게 합니다.
@Repeatable
- 연속적으로 어노테이션을 사용할 수 있게 해줍니다.
@Color(name = "red")
@Color(name = "blue")
@Color(name = "green")
class Shirt {
...
}
@Inherited // 상속
@Documented // 문서에 정보가 표현
@Retention(RetentionPolicy.RUNTIME) // 컴파일 이후에도 JVM에 의해서 참조가 가능합니다
@Retention(RetentionPolicy.CLASS) // Compiler가 클래스를 참조할 때까지 유효합니다
@Retention(RetentionPolicy.SOURCE) // 컴파일 이후 이후 사라집니다
@Target({
ElementType.PACKAGE, // 패키지 선언시
ElementType.TYPE, // 타입 선언시
ElementType.CONSTRUCTOR, // 생성자 선언시
ElementType.FIELD, // 멤버 변수 선언시
ElementType.METHOD, // 메소드 선언시
ElementType.ANNOTATION_TYPE, // 어노테이션 타입 선언시
ElementType.LOCAL_VARIABLE, // 지역 변수 선언시
ElementType.PARAMETER, // 매개 변수 선언시
ElementType.TYPE_PARAMETER, // 매개 변수 타입 선언시
ElementType.TYPE_USE // 타입 사용시
})
public @interface NesoyAnnotation{
/* enum 타입을 선언할 수 있습니다. */
public enum Quality {
BAD, GOOD, VERYGOOD
}
/* String은 기본 자료형은 아니지만 사용 가능합니다. */
String value() default "NesoyAnnotation : Default String Value";
/* 배열 형태로도 사용할 수 있습니다. */
int[] values();
/* enum 형태를 사용하는 방법입니다. */
Quality quality() default Quality.GOOD;
}
<출처 : https://nesoy.github.io/articles/2018-04/Java-Annotation>
※ Annotation 사용구분
- Marker Annotation
- 이름으로 구분하기 위하여 사용하며 추가적인 데이터를 필요로 하지 않습니다.
- 멤버 변수가 없으며, 단순히 표식으로서 사용된다. 컴파일러에게 어떤 의미를 전달합니다.
create
public @interface TestAnnotation { }
use
@TestAnnotation
public void setMethode() {
...
}
- Single-Value Annotation
- 간단한 신텍스를 이용하며 단일 데이터를 필요로 함
- 멤버로 단일변수만을 갖는다. 단일변수 밖에 없기 때문에 (값)만을 명시하여 데이터를 전달할 수 있습니다.
create
public @interface TestAnnotation {
String doSomething();
}
use
@TestAnnotation("What to do")
public void setMethode() {
...
}
- Full Annotation
- 복잡한 신텍스이며, 다중 데이터를 사용하며 name=value 형태를 취함 --> 데이터가 Array인 경우 "{ }"를 이용
- 멤버로 둘 이상의 변수를 갖는 어노테이션으로, 데이터를 (Key = Value)의 형태로 전달합니다.
create
public @interface TestAnnotation {
String doSomething();
int count;
String date();
}
use
@TestAnnotation(doSomething="What to do", count=1, date="09-09-2019")
public void setMethode() {
...
}
※ 잘못된 내용이 있거나, 설명이 불충분한 부분이 있다면 답변 부탁드립니다.
Reference
- http://hamait.tistory.com/314?category=79137
- https://elfinlas.github.io/2017/12/14/java-annotation/
- http://www.nextree.co.kr/p5864/
- https://asfirstalways.tistory.com/309
- https://nesoy.github.io/articles/2018-04/Java-Annotation
- http://libqa.com/wiki/89
- https://sjh836.tistory.com/8
- https://advenoh.tistory.com/21
'STUDY > JAVA' 카테고리의 다른 글
[JAVA]어노테이션(Annotation) - 2 (0) | 2019.09.24 |
---|---|
[JAVA] Java 코딩 스타일 가이드 (0) | 2019.01.21 |
[JAVA]객체를 제거하는 방법 (0) | 2018.09.18 |
[JAVA]싱글톤 패턴(singleton pattern)이란 ?? (0) | 2018.09.12 |
[JAVA]내부클래스, 중첩클래스, 지역클래스, 익명클래스 (0) | 2018.09.12 |