Java 어노테이션(Annotation) 이해

과녁스·2022년 2월 9일
0

Java

목록 보기
5/8
post-thumbnail

어노테이션 정의 및 설명


Java 클래스 또는 메서드 또는 변수 앞에 @Override 같은 @ 표시를 많이 봤을 것입니다.

어노테이션(Annotation)은 Java 5부터 등장한 기능입니다. Annotation은 사전을 찾아보면 "주석"이라고 한다. 하지만 우리가 아는 주석(//, /**/)과는 다르다.

이 어노테이션으로 인해 데이터의 유효성 검사 등을 쉽게 알 수 있고, 이와 관련한 코드가 깔끔해지게 됩니다.
일단 어노테이션의 용도는 다양한 목적이 있지만 메타 데이터의 비중이 가장 크다 할 수 있습니다.

메타-테이터(Meta-Data) : 데이터를 위한 데이터를 의미하며, 풀어 이야기하면 한 데이터에 대한 설명을 의미하는 데이터. (자신의 정보를 담고 있는 데이터)

어노테이션은 설명 그 이상의 활동을 합니다. 어노테이션이 붙은 코드는 어노테이션의 구현된 정보에 따라 연결되는 방향이 결정됩니다.

따라서 전체 소스코드에서 비즈니스 로직에는 영향을 주지는 않지만 해당 타겟의 연결 방법이나 소스코드의 구조를 변경할 수 있습니다. 쉽게 말해서 "이 속성을 어떤 용도로 사용할까, 이 클래스에게 어떤 역할을 줄까?"를 결정해서 붙여준다고 볼 수 있습니다.

어노테이션은 소스코드에 메타데이터를 삽입하는 것이기 때문에 잘 이용하면 구독성 뿐 아니라 체계적인 소스코드를 구성하는데 도움을 줍니다.

어노테이션은 자바가 기본적으로 제공하기도 하고(@Deprecated, @Override, @SuppressWarnings), 개발자가 직접 정의해서 사용할 수도 있습니다.

개발자는 어노테이션을 붙일 타겟과 유지 시기 등을 설정하여 자신이 원하는 용도로 활용 가능합니다. 이 기능을 잘 활용한다면, 비즈니스 로직과는 별로도 시스템 설정과 관련된 부가적인 사항들은 @(어노테이션)에게 위임하고 개발자는 비즈니스 로직 구현에 집중할 수 있습니다.

따라서 어노테이션을 통해 우리는 AOP(Aspect Oriented Programing; 관심지향프로그래밍)을 편리하게 구성할 수 있습니다. 어노테이션은 컴파일시기에 처리될 수도 있고 자바의 리플렉션을 거쳐서 런타임에 처리될 수도 있습니다.

리플렉션은 실행중인 자바 클래스의 정보를 볼 수 있게 하고, 그 클래스의 구성 정보로 기능을 수행할 수 있도록 합니다. 따라서 자바는 리플렉션 기능이 있기 때문에 어노테이션을 더욱 효율적으로 활용할 수 있습니다.

어노테이션 구성


@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomAnnotation {
	boolean isCheck() default
}

1,2번째 줄의 어노테이션 선언에 쓰인 어노테이션은 메타 어노테이션(Meta Annotation) 이라 하며 이를 이용해 커스텀 어노테이션을 작성할 수 있게 됩니다.

메타 어노테이션 종류

  1. @Retention
    자바 컴파일러가 어노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지를 결정합니다.

    • RetentionPolicy.SOURCE : 컴파일 전까지만 유효. (컴파일 이후에는 사라짐)
    • RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효.
    • RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해 계속 참조가 가능. (리플렉션 사용)
  2. @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 : 타입 선언
  3. @Documented

    • 해당 어노테이션을 Javadoc에 포함시킵니다.
  4. @Inherited

    • 어노테이션의 상속을 가능하게 합니다.
  5. @Repeatable

    • Java8 부터 지원하며, 연속적으로 어노테이션을 선언할 수 있게 해줍니다.

어노테이션은 기본적으로 인터페이스 형태를 취하고 있으며, 단지 interface 앞에 @ 표시를 해줍니다.

어노테이션의 필드에서는 enum, String이나 기본 자료형, 기본 자료형의 배열을 사용할 수 있습니다.

참고


profile
ㅎㅅㅎ

0개의 댓글