본문 바로가기

Java

[자바의 신] 어노테이션

어노테이션은 컴파일러에게 정보를 알려주거나, 컴파일 할때 와 설치(deployment)시의 작업을 지정하거나, 실행할때 별도의 처리가 필요할때 사용한다.

 

어노테이션은 클래스, 메소드, 변수 등 모든 요소에 선언할 수 있다.

 

자바에서 사용하기 위해 정해져 있는 어노테이션은 3개, 어노테이션을 선언하기 위한 메타 어노테이션은 4+1개가 있다. 

 

먼저 사용하기 위해 정해진 어노테이션 3개는 다음과 같다.(JDK6 기준)

  • @Override
    • 해당 '메소드'가 부모 클래스에 있는 메소드를 오버라이드 했다는 것을 명시적으로 선언
    • 만약 이 어노테이션을 쓰고 오버라이드 형식에 맞지 않게 코딩했다면 컴파일 에러 발생
  • @Deprecated
    • 만들어진 클래스나 메소드가 더 이상 사용되지 않는 경우 컴파일러가 알려주는 용도
  • @SurpressWarnings
    • 간혹 경고가 나타나는경우 개발자가 일부러 코딩한 부분이니 경고할 필요 없다고 컴파일러에게 알리는 용도로 사용

어노테이션을 위한 메타 어노테이션은 다음과 같다.

  • @Target
    • 어노테이션을 '어디에' 적용할지 선언할때 사용.
    • CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE
  • @Retention
    • 얼마나 오래 어노테이션 정보가 유지되는지 선언
    • SOURCE, CLASS, RUNTIME
  • @Documented
    • 해당 어노테이션 정보가 Javadocs(API) 문서에 포함된다는것 선언
  • @Inherited
    • 모든 자식클래스에서 부모 클래스의 어노테이션이 사용 가능하다는 것을 선언
  • @interface
    • 어노테이션을 선언할때 사용

어노테이션도 상속이 안돼요.

 

@Inherited 어노테이션은 클래스에 선언된 어노테이션을 자식 클래스가 쓸수 있다는 말.

어노테이션이 상속을 지원하지 않는 다는 것은 어노테이션을 선언할 때 미리 만들어 놓은 어노테이션을 확장해서 사용할 수 없다는 것.

 

어노테이션은 용도에 따라서 다음과 같이 구분

  • 제약사항 선언
  • 용도 선언
  • 행위 선언
  • 처리 선언

어노테이션이 등장하기 전에는 모든 자바 애플리케이션 '설정파일'을 XML 또는 Properties 파일에 지정했다. 어노테이션이 등장하면서 각 설정이 필요한 위치에 관련 설정이 존재하면서 코드 가독성이 높아졌다. 물론, 모든 XML, 프로퍼티즈 파일이 사라졌다는 것은 아님.

 

아래는 스프링의 주요 어노테이션중 하나인 컨트롤러 어노테이션.

package org.springframework.stereotype;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    @AliasFor(
        annotation = Component.class
    )
    String value() default "";
}

일단, 어노테이션의 이름이 Controller 이고,  Type 즉, 클래스에 쓰는 어노테이션이며, 실행시 가상머신이 참조할수 있는 어노테이션이라는 것(RUNTIME)을 알 수 있다. 

'Java' 카테고리의 다른 글

[자바의 신] 클래스 안의 클래스  (0) 2020.11.28
[자바의 신] 예외  (0) 2020.11.28
[자바의 신] 인터페이스와 추상클래스  (0) 2020.11.20
[자바의 신] Object  (0) 2020.10.21
[자바의 신] 상속  (0) 2020.10.06