어노테이션은 사전적 의미로는 주석이라는 뜻이다. 자바에서 사용될 때의 어노테이션은 코드 사이에 주석처럼 쓰여서 특별한 의미, 기능을 수행하도록 하는 기술이다. 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터(meta data: 데이터를 위한 데이터)라고 볼 수 있다.
메타 데이터?
데이터를 위한 속성정보이다. 데이터를 위한 데이터로서 하위 레벨 데이터를 설명 및 기술하는 데이터라고 보면 된다.
도서관을 예시로 들어보자면 표제, 저자, 주제명, 분류기호 등이 포함되어 있는 목록이 메타데이터에 속한다.
어노테이션?
프로그램 실행 관점에서 보면 프로그램이 처리할 메인 데이터가 아니라 실행과정에서 데이터를 어떻게 처리할 것인지 알려주는 서브 데이터라고 볼 수 있다.
어노테이션의 용도
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
- 소프트웨어 개발툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공
- 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공
어노테이션을 사용하는 순서
- 어노테이션의 정의
- 클래스에 어노테이션을 배치
- 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하여 기능 실시
어노테이션 정의
어노테이션을 적용할 때는 어노테이션이 어디에 적용되며 언제까지 어노테이션 소스가 유지될 것인지를 설정하여야 하는데 소스코드에는 다음과 같이 어노테이션을 정의해 주면 된다.
@Target({ElementType.[적용대상]})
@Retention(RetentionPolicy.[정보유지되는 대상])
public @interface [어노테이션명]{
public 타입 elementName() [default 값]
...
}
어노테이션 종류
자바 코드에 적용되는 내장 어노테이션
@Override
- 선언한 메서드가 오버라이드 되어있다는 것을 나타낸다.
- 만약 상위(부모) 클래스(또는 인터페이스)에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생시킨다.
- Deprecated*
- 해당 메서드가 더 이상 사용되지 않음을 표시한다.
- 만약 사용할 경우 컴파일 경고를 발생시킨다.
- SuppressWarnings*
- 선언한 곳의 컴파일 경고를 무시하도록 한다.
- SafeVarargs*
- Java 7부터 지원하며, 제네릭 같은 가변 인자의 매개변수를 사용할 때의 경고를 무시한다.
- FunctionalInterface*
- Java8부터 지원하며, 함수형 인터페이스를 지정하는 어노테이션이다.
- 만약 메서드가 존재하지 않거나, 1개 이상의 메서드(default 메서드 제외)가 존재할 경우 컴파일 오류를 발생시킨다.
기타 어노테이션에 적용되는 어노테이션 (메타 애터 네이션)
@Retention
- 자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정한다.
- 종류는 다음과 같다.
- RetentionPolicy.SOURCE : 컴파일 전까지만 유효. (컴파일 이후에는 사라짐)
- RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효.
- RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능. (리플렉션 사용)
@Documented
- 해당 어노테이션을 Javadoc에 포함시킨다.
@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 : 타입 선언
@Inherited
- 어노테이션의 상속을 가능하게 한다.
@Repeatable
- Java8부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 한다.
사용 예제
Overred
public class Animal {
public void speak() {
}
public String getType() {
return "Generic animal";
}
}
public class Cat extends Animal {
@Override
public void speak() { // This is a good override.
System.out.println("Meow.");
}
@Override
public String gettype() { // Compile-time error due to mistyped name.
return "Cat";
}
}
자세한 내용은 이 블로그를 참고하면 좋을 것 같다.
https://techblog.woowahan.com/2684/
시의적절한 커스텀 어노테이션 | 우아한형제들 기술블로그
{{item.name}} layout: post title: "시의적절한 커스텀 어노테이션" description: "custom annotation으로 간결하고 의도가 명확한 코드 작성하기" author: allen.song date: 2020-06-26 15:50:00 +0900 categories: experience published: t
techblog.woowahan.com
다음에는 스프링에서 자주 사용되는 어노테이션에 대해 공부해보겠다.
'Java' 카테고리의 다른 글
[Java] copyOf(), copyOfRange(), arrayCopy() (0) | 2023.06.29 |
---|---|
객체 지향의 5가지 원칙 (1) | 2023.01.27 |
[Java] HashMap (0) | 2022.11.23 |
[Java] ArrayList (0) | 2022.11.23 |
[Java] Reflection(리플렉션) 이란? (0) | 2022.11.03 |