Java

Java annotation(1) - 어노테이션이란?

구티맨 2022. 4. 1. 16:27

목차

    Annotation?

    자바 어노테이션은 자바 코드에 메타 데이터를 제공하기 위해 사용됩니다.

     

    @ 문자와 어노테이션 이름으로 구성이 되며, 컴파일러에서는 @ 문자로 시작이 되면 어노테이션으로 판단을 합니다.

    어노테이션은 값을 저장할 수 있는 엘레멘트를 가지며, 어노테이션 이름 다음에 괄호 안에 엘레멘트를 정의합니다.

    @Entity(name = "table")

    위의 어노테이션은 Entity라는 이름의 어노테이션이고 name이라는 엘레멘트를 가지며 name 엘레멘트의 값은 table입니다.

     

    어노테이션은 클래스, 인터페이스, 메소드, 메소드 파라메터, 필드, 지역 변수 위에 위치할 수 있습니다.

    @Entity
    public class Animal {
    }

    Built-in Java Annotations

    Java의 내장형 어노테이션에 대해 알아보겠습니다.

    @Deprecated

    클래스, 메소드, 필드가 deprecated 되었음을 알릴 때 사용합니다.

    deprecated code를 사용하면 컴파일러에서는 warning을 표시합니다.

    어노테이션을 사용할 때, @deprecated JavaDoc symbol을 사용하여, 왜 deprecated 되었는지

    대신에 무엇을 사용해야 하는지 작성하는 것이 좋습니다.

    @Deprecated
    /**
      @deprecated Use MyNewComponent instead.
    */
    public class MyComponent {
    
    }

    @Override

    부모 클래스의 메소드를 오버라이드 할 때 사용합니다.

    오버라이드 할 때, 필수로 어노테이션을 사용해야 하는 것은 아니지만, 오버라이드 하고 있다는 것을 알려주기에 사용합니다.

    @SuppressWarnings

    메소드에 사용하며, 사용한 메소드에 워닝을 컴파일러에서 표시하지 않도록 합니다.

    deprecated 된 코드를 사용할 때 워닝이 생기지 않게 사용할 수 있습니다.

     

    외에도 @SafeVarargs, @FunctionalInterface, @Naitve 내장형 어노테이션이 있습니다.

    Meta-Annotation

    다른 어노테이션에 적용을 할 수 있는 어노테이션을 메타 어노테이션이라고 합니다.

    @Inherited

    자식 클래스에 부모 클래스의 어노테이션을 가지도록 하기 위해(propagate) 사용하는 어노테이션입니다.

    DerivedClass는 BaseClass에 선언된 @InheritedAnnotation이 적용됩니다.

    @Inherited
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface InheritedAnnotation {
    }
    
    @InheritedAnnotation
    public class BaseClass {
    }
    
    public class DerivedClass extends BaseClass {
    }

    @Documented

    Javadocs에 어노테이션의 사용을 문서화해주게 하는 어노테이션입니다.

    ( Javadocs은 Default로 사용하는 어노테이션에 대해서는 문서화해주지 않습니다. )

    아래처럼 ExcelCell이라는 어노테이션에 @Documented를 선언하면,

    Javadocs에 Exployee 클래스에서 ExcelCell이라는 어노테이션을 사용한다고 문서화해줍니다.

    @Documented
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ExcelCell {
        int value();
    }
    
    public class Employee {
        @ExcelCell(0)
        public String name;
    }

    javadocs

    @Repeatable

    엘레멘트에 어노테이션을 반속 사용할 때 사용하는 어노테이션입니다.

    어노테이션 엘레멘트에 Schedules 클래스를 지정하고, Schedules 클래스에는 컨테이너를 선언해두면

    Schedule 어노테이션은 Schedules 어노테이션의 배열 엘레멘트에 저장이 가능해 Schedule 어노테이션의 반복 사용이 가능해집니다.

    public @interface Schedules {
        Schedule[] value();
    }
    
    @Repeatable(Schedules.class)
    public @interface Schedule {
        String time() default "09:00";
    }
    
    @Schedule
    @Schedule(time = "15:05")
    @Schedule(time = "23:00")
    void scheduledAlarm() {
    }

     

    이 외에 @Target, @Retention 메타 어노테이션도 있는데 이 어노테이션은 커스텀 어노테이션 관련 글에서 설명을 하겠습니다.