[Java] Annotation

clean·2024년 1월 3일
0

Annotation

클래스, 메소드, 변수 선언시에 '@'로 시작하는 태그를 붙이는 것을 의미한다. Annotation을 Metadata라고 하기도 한다. JDK 5부터 등장하였다.

어노테이션은 다음과 같은 경우에 사용한다.

  • 컴파일러에게 어떤 정보를 알려줄 때
  • 컴파일할 때와 설치시의 작업을 지정할 때
  • 실행할 때 별도의 처리가 필요할 때

미리 정해져있는 어노테이션은 딱 3개 있다.(JDK 6 기준)

  • @Override
  • @Deprecated
  • @SuppressWarnings

@Override

해당 메소드가 부모 클래스에 있는 메소드를 Override했다는 것을 명시적으로 선언한다. 만약 잘못 Override 되었다면 컴파일러가 에러를 알려줄 수 있도록 표시해둔 것이다.

@Deprecated

더이상 쓰이지 않는 API에 붙이는 어노테이션이다. 이 어노테이션이 붙은 API를 사용하려고 하면 컴파일러가 warning을 준다. 이제 더이상 쓰지 않는 메소드라고 그냥 삭제해버리면 기존에 그 메소드를 사용하던 프로그램들이 더이상 동작할 수 없기 때문에, 하위 호환성을 위해서 @Deprecated 어노테이션을 붙여서 남겨두는 것이다.

@SuppressWarnings

경고가 뜰 수 있는 코드가 포함된 메소드 위에 붙여서 컴파일러가 경고를 주지 않도록 하는 어노테이션이다.
아래 예시는 @Deprecated가 붙은 메소드를 사용하려고 할 때, 그 warning을 막는 코드이다.

@SuppressWarnings("deprecation")

Meta Annotation

메타 어노테이션은 직접 어노테이션을 선언할 때 사용한다. 메타 어노테이션은 4가지가 존재한다.

  • @Target
  • @Retention
  • @Documented
  • @Inherited

@Target

annotation을 어떤 것에 적용할지를 선언할 때 사용한다.
다음 요소들에 대해 적용 가능하다.

  • CONSTRUCTOR: 생성자 선언시
  • FIELD: enum 상수를 포함한 필드(field)값 선언시
  • LOCAL_VARIABLE: 지역변수 선언시
  • METHOD: 메소드 선언시
  • PACKAGE: 패키지 선언시
  • PARAMETER: 매개 변수선언시
  • TYPE: 클래스, 인터페이스, enum 등 선언시

@Retention

얼마나 오래 어노테이션 정보가 유지되는지 선언한다.

  • SOURCE: 어노테이션 정보가 컴파일시 사라진다.
  • CLASS: 클래스 파일에 있는 어노테이션 정보가 컴파일러에 의해서 참조 가능함. 하지만 가상 머신에서는 사라진다.
  • RUNTIME: 실행시 어노테이션 정보가 가상 머신에 의해서 참조 가능

@Documented

해당 어노테이션에 대한 정보가 Javadocs(API) 문서에 포함된다는 것을 선언

@Inherited

모든 자식 클래스에서 부모 클래스의 어노테이션을 사용할 수 있다는 것을 선언한다.

@Interface

인터페이스를 선언할 때 필요한 예약어이다.

직접 Annotation 만들어보기

다음과 같은 .java 파일을 만들어보자

package javaonly.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
    public int number();
    public String text() default "This is first annotation";
}

'public int number();' 이 코드를 추가하면, number라는 필드를 int로 값을 지정해주어야한다.
ex) @CustomAnnotation(number=1)

'public String text() default "This is first annotation";' 이 부분에 의해 text도 String으로 값을 지정해주어야 하는데, 지정해주지 않으면 default 뒤에 String이 기본값이 된다. 이렇게 default 값을 지정해준 경우, 값을 지정해주지 않아도 문제가 되지 않는다.

profile
블로그 이전하려고 합니다! 👉 https://onfonf.tistory.com 🍀

0개의 댓글