ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 애너테이션
    Computer Science/JAVA 2021. 8. 20. 22:38

    1️⃣ 애너테이션이란

    애너테이션은 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이다.

    애너테이션은 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 다른 프로그램에게 유용한 정보를 제공할 수 있다는 장점이 있다.

    2️⃣ 표준 애너테이션

    @Override

    메서드 앞에만 붙일 수 있는 애너테이션으로, 조상의 메서드를 오버라이딩하는 것이라는걸 컴파일러에게 알려주는 역할을 한다.

    오버라이딩할 때 메서드의 이름을 잘못 적는 경우가 많은데, @Override를 붙이면 컴파일러가 같은 이름의 메서드가 조상에 있는지 확인하고 없으면, 에러 메시지를 출력한다.

    Class Parent {
        void parentMethod() {}
    }
    
    Class Child extends Parent {
    
        @Override
        void parentMethod() {}
    }

    @Deprecated

    더 이상 사용되지 않는 필드나 메서드에 @Deprecated를 붙이면 이 애너테이션이 붙은 대상은 다른 것으로 대체되었으니 더 이상 사용하지 않을 것을 권한다는 의미이다.

    @FunctionalInterface

    함수형 인터페이스를 선언할 때, 이 애너테이션을 붙이면 컴파일러가 함수형 인터페이스를 올바르게 선언했는지 확인하고, 잘못된 경우 에러를 발생시킨다. 필수는 아니지만 실수를 방지할 수 있으므로 함수형 인터페이스를 선언할 때 반드시 붙이자.

    @SuppressWarnings

    컴파일러가 보여주는 경고메시지가 나타나지 않게 억제해준다.

    class NewClass {
        int newField;
    
        int getNewField() {
            return newField;
        }
    
        @Deprecated
        int oldField;
    
        @Deprecated
        int getOldField() {
            return oldField;
        }
    }
    
    public class Annotation1 {
        @SuppressWarnings("deprecation") // deprecated 경고가 나타나지 않게 함
    
        public static void main(String[] args) {
            NewClass nc = new NewClass();
    
            nc.oldField = 10;
            System.out.println(nc.getOldField());
    
            @SuppressWarnings("unchecked")
            ArrayList<NewClass> list = new ArrayList();
            list.add(nc);
        }
    }

    3️⃣ 메타 애너테이션

    메타 애너테이션은, 애터네이션을 위한 애너테이션이다. 즉 애너테이션을 정의할 때 애너테이션의 적용대상이나 유지기간 등을 지정하는데 사용된다.

    @Target

    애너테이션이 적용 가능한 대상을 지정하는데 사용된다.

    • ANNOTATION_TYPE

    • CONSTRUCTOR

    • FIELD

    • LOCAL_VARIABLE

    • METHOD

    • PACKAGE

    • PARAMETER

    • TYPE

    • TYPE_PARAMETER

    • TYPE_USE

    @Retention

    애너테이션이 유지되는 기간을 지정하는데 사용된다.

    • SOURCE : 소스 파일에만 존재, 클래스 파일에는 존재하지 않음

    • CLASS : 클래스 파일에 존재, 실행시에 사용불가

    • RUNTIME : 클래스 파일에 존재, 실행시에 사용가능

    유지 정책을 RUNTIME으로 하면 실행 시에 리플렉션을 통해 클래스 파일에 저장된 애너테이션의 정보를 읽어서 처리할 수 있다. @FunctionalInterface는 컴파일러가 체크해주는 애너테이션이지만, 실행 시에도 사용되므로 유지 정책이 RUNTIME이다.

    @Documented

    애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.

    @Inherited

    애너테이션이 자손 클래스에 상속되도록 한다. @Inherited가 붙은 애너테이션을 조상 클래스에 붙이면, 자손 클래스도 이 애너테이션이 붙은 것과 같이 인식된다.

    4️⃣ 애너테이션 타입 정의하기

    @interface 애너테이션 이름 {
        타입 요소 이름(); // 애너테이션의 요소를 선언한다.
    }

    애너테이션의 요소

    애너테이션 내에 선언된 매세드를 애너테이션의 요소라고 한다.

    애너테이션의 요소는 반환값이 있고 매개변수는 없는 추상 매서드의 형태를 가지며, 상속을 통해 구현하지 않아도 된다. 다만, 애너테이션을 적용할 때 이 요소들의 값을 빠짐없이 지정해주어야 한다.

    마커 애너테이션

    값을 지정할 필요가 없는 경우, 애너테이션의 요소를 하나도 정의하지 않을 수 있다. Serializable이나 Cloneable처럼 요소가 하나도 정의되지 않은 애너테이션을 마커 애너테이션이라고 한다.

    애너테이션 요소의 규칙

    • 요소의 타입은 기본형, String, enum, 애너테이션, Class만 허용된다

    • ()안에 매개변수를 선언할 수 없다

    • 예외를 선언할 수 없다

    • 요소를 타입 매개변수로 정의할 수 없다

    @Deprecated
    @SuppressWarnings("1111")
    @TestInfo(testedBy = "aaa", testDate = @DateTime(yymmdd = "160101", hhmmss = "235959"))
    public class Annotation2 {
        public static void main(String[] args) {
            Class<Annotation2> cls = Annotation2.class;
    
            TestInfo anno = (TestInfo)cls.getAnnotation(TestInfo.class);
            System.out.println(anno.testedBy());
            System.out.println(anno.testDate().yymmdd());
            System.out.println(anno.testDate().hhmmss());
    
            Annotation[] annoArr = cls.getAnnotations();
            for (Annotation annotation : annoArr) {
                System.out.println(annotation);
            }
        }
    }
    
    @Retention(RetentionPolicy.RUNTIME)
    @interface TestInfo {
        int         count()         default 1;
        String      testedBy();
        String[]    testTools()     default "JUnit";
        TestType    testType()      default TestType.FIRST;
        DateTime    testDate();
    }
    
    @Retention(RetentionPolicy.RUNTIME)
    @interface DateTime {
        String yymmdd();
        String hhmmss();
    }
    
    enum TestType {
        FIRST, FINAL
    }

    Uploaded by Notion2Tistory v1.1.0

    'Computer Science > JAVA' 카테고리의 다른 글

    쓰레드(2)  (0) 2021.08.20
    쓰레드(1)  (0) 2021.08.20
    열거형(enums)  (0) 2021.08.20
    Generics  (0) 2021.08.20
    String, StringBuilder, StringBuffer  (0) 2021.08.20

    댓글

Designed by Tistory.