[Java] Annotation

Ahnick·2021년 2월 14일
0
post-thumbnail
post-custom-banner

Java Annotation이란

자바에는 @~ 와 같이 @로 표시하는 특수한 개념이 있습니다.
가장 많이 쓰는 @Override 어노테이션이 가장 대표적인 어노테이션입니다!

자바 어노테이션은 JDK5에서 처음 추가된 개념이며, 개발자들의 편의성과 가독성
그리고 유효성 검사 측면에서 유리함을 가져다줍니다.

자바에서는 기본적으로 제공하는 몇 가지의 어노테이션이 존재하고
유저 커스텀을 통하여 새로운 어노테이션을 정의할 수도 있습니다.

대표적으로 자바의 Spring Framework나 Lombok 라이브러리는 어노테이션을
잘 활용하는 예시입니다.

기본적으로 존재하는 Annotation

JDK5 기준으로는 기본적으로 3개의 어노테이션을 제공했으며
이후로 Java8까지 몇 가지의 어노테이션이 추가되었습니다.

@Override

  • 상속받은 메소드를 새로 재정의함을 명시하는 어노테이션입니다.
  • 해당 어노테이션이 없어도 재정의가 가능하지만, Override 어노테이션을 사용하면 컴파일러가 컴파일시에 유효성 검사를 하여 재정의가 제대로 되었는지 컴파일 단계에서 알려줍니다!

@Deprecated

  • 해당 메소드가 더 이상 사용되지 않음을 명시합니다.
  • 만약 이 어노테이션이 존재하는 메소드에 접근할 경우, 컴파일러가 경고를 발생시킵니다.

@SuppressWarnings

  • 코드에 문제는 존재하지 않지만, 경고가 표시될 때 '응 경고인거 아는데 내가 알아서 할거니까 그냥 무시해~' 라는 느낌의 어노테이션입니다.

@SafeVarags

  • Java7에서 도입된 어노테이션입니다.
  • 자바의 제네릭과 같은 가변인자 매개변수를 사용할 때의 경고를 무시해줍니다.

@FunctionallInterface

  • 함수형 프로그래밍적인 변화가 시작된 Java8에서 도입된 어노테이션입니다.
  • 해당 메소드가 존재하지 않거나, default를 제외한 1개 이상의 메소드가 존재할 경우 컴파일 오류가 발생합니다.

Annotation 생성을 위한 Meta Annotation

위에서 어노테이션은 유저가 커스텀하여 새로 생성할수도 있다고 언급했습니다.
이러한 유저 커스텀 어노테이션 생성을 위하여 존재하는 어노테이션입니다.

@Target

해당 어노테이션을 어떤 범위에 적용할때 사용할 것인지 명시하는 어노테이션입니다.
@Target() 과 같이 사용하는데, 괄호 안에 대상을 기입하여 사용합니다

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

@Retention

어노테이션에 대한 정보의 지속시간에 대한 어노테이션입니다.
Target과 마찬가지로 괄호 안에 지속시간을 명시합니다.

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

@Documented

해당 어노테이션에 대한 정보가 Java API문서에 포함됨을 선언합니다.

@Ingerited

모든 자식 클래스에서 부모 클래스의 어노테이션을 사용 가능함을 선언합니다.

정리

어노테이션이 등장하기 전에는 모든 자바 어플리케이션의 설정을
XML이나 properties에 정의해줘야 했습니다. 하지만 어노테이션이 등장하면서
코드의 가독성이 향상되었고, 개발자들의 편의성도 향상되었습니다.

가장 쉽게 접할 수 있는 Lombok과 같은 경우는 개발자들이 자주 사용하는
메소드들(Getter, Setter 등등)을 어노테이션 하나로 생성해주기도 하죠 ㅎㅎ

사실 실제 개발에서 어노테이션을 직접 커스텀하여 사용할일은 그렇게 많지 않지만
어노테이션이란 무엇이고, 어떤 방식으로 동작하는지에 대해서는 알아야 할 것 같습니다.

post-custom-banner

0개의 댓글