Annotation

김회민·2023년 2월 12일
0

Java

목록 보기
11/16

애노테이션이란?

직역하자면 주석이라는 의미를 가진다.
자바 소스 코드사이에 @ 기호를 붙여 사용하는데, Java 5에서 추가된 기능이다.

용도

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

내장 애노테이션

@Override

선언한 메서드가 오버라이딩 되었다는 것을 의미한다.

만약 부모 객체에서 해당 메서드를 찾을 수 없다면 컴파일 에러를 발생 시킨다.

@Deprecated

해당 메서드가 더 이상 사용되지 않음을 의미한다.

만약 사용할 경우 컴파일 경고를 발생시키며, 해당 메서드나 클래스는 IDE상에서 줄이 그어져있다.

@SuppressWarnings

선언한 곳의 컴파일 경고를 무시하도록 한다.

@SafeVarargs

Java 7에서 추가된, 제네릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시한다.

@FunctionalInterface

Java 8에서 추가된, 함수형 인터페이스를 지정하는 애노테이션이다.

만약 메서드가 존재하지 않거나, 1개 이상의 메서드가 존재할 경우 컴파일 오류를 발생시킨다.

메타 애노테이션

@Retention

자바 컴파일러가 애노테이션을 다루는 방법을 기술하며, 특정 시점까지 영향을 미치는지 결정한다.

종류설명
RetentionPolicy.SOURCE컴파일 전까지만 유효
RetentionPolicy.CLASS컴파일러가 클래스를 참조할 때까지 유효
RetentionPolicy.RUNTIME컴파일 이후에 JVM에 의해 계속 참조 가능
( 리플렉션 사용 )

@Documented

해당 애노테이션을 JavaDoc에 포함시킨다.

@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타입 선언

@Inherited

애노테이션의 상속을 가능하게 한다.

@Repeatable

Java 8에서 추가된, 연속적으로 애노테이션을 선언할 수 있게 한다.

커스텀 애노테이션

public class AnnotationTest {
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    @interface MyAnnotation {
        String value() default "My Annotation : default value";
    }

    static class MyObject {
        @MyAnnotation
        public void testMethod1() {
            System.out.println("MyObject.testMethod1");
        }

        @MyAnnotation(value = "My new Annotation")
        public void testMethod2() {
            System.out.println("MyObject.testMethod2");
        }
    }

    @Test
    void annoTest() {
        MyObject obj = new MyObject();
        obj.testMethod1();
        obj.testMethod2();

        Method[] methodList = MyObject.class.getMethods();
        for(Method method : methodList) {
            if(method.isAnnotationPresent(MyAnnotation.class)) {
                MyAnnotation anno = method.getDeclaredAnnotation(MyAnnotation.class);
                System.out.println("value = " + anno.value());
            }
        }
    }
}
MyObject.testMethod1
MyObject.testMethod2
value = My Annotation : default value
value = My new Annotation

출저

profile
백엔드 개발자 지망생

0개의 댓글