목차

 

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

 

+ Recent posts