Annotation 개념

    1. Annotation이란?

    소스코드와 소스코드에 대한 문서를 하나로 관리하기 위해

    소스코드의 주석 /* ~~~ */에 소스코드에 대한 정보를 저장

    소스코드의 주석으로부터 HTML 문서를 생성해내는 프로그램(javadoc.exe)를 만들어서 사용

     

    @로 미리 정의된 태그를 이용해서 주석 안에 정보를 저장하고,

    javadoc.exe라는 프로그램이 이 정보를 읽어서 문서를 작성하는데 사용함

     

    애노테이션

    이 기능을 응용해서 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것

     

    예시) @Test

    특정 메서드를 테스트할 때 사용하는 애노테이션

    이 메서드를 테스트해야 한다는 것을 테스트 프로그램에게 알리는 역할을 함

     

    JDK에서 제공하는 표준 애너테이션은 주로 컴파일러를 위한 것으로 컴파일러에게 유용한 정보를 제공함.

    그리고 새로운 애너테이션을 정의할 때 사용하는 메타 애너테이션을 제공함

     

     

    2. 표준 Annotation

    JDK에서 제공하는 표준 Annotation

    @Override 컴파일러에게 오버라이딩하는 메서드라는 것을 알림
    @Deprecated 앞으로 사용하지 않을 것을 권장하는 대상에 붙임
    @SuppressWarnings 컴파일러의 특정 경고메시지가 나타나지 않게 함
    @SafeVarargs 지네릭스 타입의 가변인자에 사용함(JDK 1.7)
    @FunctionalInterface 함수형 인터페이스라는 것을 알림 (JDK 1.8)
    @Native native 메서드에서 참조되는 상수 앞에 붙임 (JDK 1.8)

     

    표준 Annotation 중 메타 에너테이션

    애너테이션을 정의하는데 사용되는 애너테이션의 애너테이션

    @Target 애너테이션이 적용가능한 대상을 지정하는데 사용함
    @Documented 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 함
    @Inherited 애너테이션이 자손 클래스에 상속되도록 함
    @Retention 애너테이션이 유지되는 범위를 지정하는데 사용함
    @Repeatable 애너테이션을 반복해서 적용할 수 있게 함 (JDK 1.8)

     

    3. 애너테이션 타입 정의하기

    인터페이스를 정의하는 것과 거의 동일함

    @interface TestInfo{
    	int count(); // annotation 요소
        String testedBy();
        String[] testTools();
        TestType testType(); // enum TestType {FIRST, FINAL}
        DateTime testDate(); // 자신이 아닌 다른 애너테이션(@DateTime)을 포함할 수 있음
    }
    
    @interface DateTime{
    	String yymmdd();
        String hhmmss();
    }

     

    애너테이션의 요소

    • 애너테이션 내에 선언된 메서드
    • 상수 정의 가능
    • 요소의 타입은 기본형, String, enum, 애너테이션, Class만 허용됨
    • 매개변수가 없는 추상 메서드의 형태를 가짐
    • 상속을 통해 구현하지 않아도 됨
    • 디폴트 메서드는 정의할 수 없음
    • 각 요소는 기본값을 가질 수 있으며, 기본값이 있는 요소는 애너테이션을 적용할 때 값을 지정하지 않으면 기본값이 사용됨
    • 예외 선언 불가능
    • 요소의 타입에 타입 매개변수 사용불가

     

    애너테이션을 적용할 때 에너테이션 요소들의 값을 빠짐없이 지정해주어야 함

    순서는 상관 X

    @TestInfo(
    	count=3, testedBy="Kim",
        testTools = {"JUnit", "AutoTester"},
        testType = TestType.FIRST,
        testDate = @DateTime(yymmdd="160101", hhmmss="235959")
    )
    public class NewClass {...}

     

    java.lang.annotation.Annotation

    모든 애너테이션의 조상은 Annotation이만,

    애너테이션은 상속이 허용되지 않으므로 명시적으로 Annotation을 조상으로 지정할 수 없음

     

    그리고 Annotation은 인터페이스로 정의되어 있음

    Annotation  인터페이스에 equals, hashCode, toString 메서드가 있기 때문에

    모든 애너테이션 객체에서 위의 메서드를 호출하는 것이 가능함

     

    '백엔드 > Java' 카테고리의 다른 글

    컬렉션 프레임워크  (0) 2023.01.13

    댓글