어노테이션은 컴파일러에게 정보를 알려주거나, 컴파일 할때 와 설치(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 |