본문 바로가기

JAVA

Annotation 어노테이션

어노테이션은 프로그램에 추가적인 정보를 제공하는 메타 데이터의 일종이다. 사전적으로는 주석이라는 의미이다. Java의 어노테이션은 소스코드에 추가해 주석처럼 쓰이며 코드에 영향을 미치지는 않지만, 특별한 의미, 기능을 수행하도록 하는 기술이다. 

 

보통 @ 기호를 앞에 붙여 사용한다.

JDK 1.5버전 이상에서 사용이 가능하고, 클래스 파일에 임베드되어 컴파일러에 의해 생성되고 이후 JVM에 포함되어 동작한다.

어노테이션의 용도

  • 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공
  • 소프트웨어 개발 환경이 빌드나 배포시 코드를 자동으로 생성할 수 있도록 정보 제공
  • 런타임시 특정 기능을 실행하도록 정보 제공

어노테이션 사용 순서

  1. 어노테이션 정의
  2. 클래스에 어노테이션 배치
  3. 코드가 실행되는 중 Reflection을 이용해 추가 정보를 획득하여 기능 실행

표준 어노테이션

표준 어노테이션은 java JDK에서 제공하는 어노테이션으로, 주로 컴파일러를 위한 것이다.

@Override

컴파일러에게 오버라이딩하는 메서드라는 것을 알린다. 메서드 앞에만 붙일 수 있다.

오버라이딩할 때 조상 메서드 이름을 잘못 써도 컴파일러는 새로운 이름의 메서드가 추가된 것으로 인식해 오류가 발생하지 않는다. 이때 어노테이션을 사용하면 컴파일러가 같은 이름의 조상 메서드가 있는지 확인하고 없으면 에러를 발생시키기 때문에 실수를 방지하기 위해 사용하는 것이 좋다.

@Deprecated

다른 것으로 대체되었으니 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다.

@FunctionalInterface

함수형 인터페이스를 선언할 때 사용한다. 함수형 인터페이스를 올바르게 선언했는지 확인하고, 잘못된 경우 에러를 발생시킨다.

@SuppressWarnings

컴파일러의 특정 경고 메시지가 나타나지 않게 해준다.

 

[억제할 수 있는 경고 메시지 종류]

  • deprecation : @Deprecation 붙은 대상을 사용했을 때 발생하는 경고
  • unchecked : 제네릭스로 타입을 지정하지 않았을 때 발생하는 경고
  • rawtypes : 제네릭스를 사용하지 않아서 발생하는 경고
  • varargs : 가변인자의 타입이 제네릭 타입일 때 발생하는 경고

@SafeVarargs

제네릭 타입의 가변인자에 사용한다. unchecked 경고는 억제할 수 있지만, varargs 경고는 억제할 수 없어 @SupperessWarnings("varargs")를 같이 붙인다.

@Native

네이티브 메서드에 의해 참조되는 상수 필드에 붙인다.

메타 어노테이션

메타 어노테이션은 어노테이션을 위한 어노테이션으로, 어노테이션을 정의할 때 어노테이션의 적용대상(target)이나 유지기간(retention)등을 지정하는 데 사용된다. 메타 에너테이션은 'java.lang.annotation'패키지에 포함되어 있다.

@Target

어노테이션이 적용 가능한 대상을 지정한다.

 

[지정할 수 있는 어노테이션 적용대상 종류 - ElementType]

  • ANNOTATION_TYPE : 어노테이션
  • CONSTRUCTOR : 생성자
  • FIELD : 필드(멤버변수, enum상수) - 기본형에 사용
  • LOCAL_VARIABLE : 지역변수
  • METHOD : 메서드
  • PACKAGE : 패키지
  • PARAMETER : 매개변수
  • TYPE : 타입(클래스, 인터페이스, enum(열거형))
  • TYPE_PARAMETER : 타입 매개변수
  • TYPE_USE : 타입이 사용되는 모든 곳 - 참조형에 사용

@Retention

어노테이션이 유지되는 기간을 지정한다.

[어노테이션 유지정책 - RetentionPolicy]

SOURCE : 소스 파일에만 존재. 클래스 파일에는 존재하지 않음. 컴파일러를 직접 작성할 것이 아니면 필요없다.

CLASS : 클래스 파일에 존재. 실행시에 사용 불가. 기본값. 클래스 파일이 로딩될 때는 어노테이션 정보가 무시되어 실행시 어노테이션에 대한 정보를 얻을 수 없다.

RUNTIME : 클래스 파일에 존재. 실행시에 사용 가능. 리플렉션을 통해 클래스 파일에 저장된 어노테이션 정보를 읽어서 처리할 수 있다.

@Documented

어노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.

@Inherited

어노테이션이 자손 클래스에 상속되도록 한다.

@Repeatable

어노테이션을 반복해서 붙일 수 있다.

'JAVA' 카테고리의 다른 글

[Java] 상속(Inheritance)  (0) 2023.07.05
[JAVA] DTO와 VO  (0) 2023.05.01
컬렉션(자료구조)  (0) 2023.04.04
배열(자료구조) Array  (0) 2023.04.04
반복문  (0) 2023.04.04