본문 바로가기

개발(합니다)/Java&Spring

[java-기초-06-부록] 애너테이션

반응형

애너테이션

표준 애너테이션 4가지

  1. @Override
    • 오버라이딩을 올바르게 했는지를 컴파일러가 확인한다.
      public Parent {
       void parentMethod() { }
      }
      
      class Child extends Parent {
       @Override 
       void parentmethod() { } // 조상 메서드의 이름을 잘못 적음.
      }
  2. @Deprecated
    • 사용을 권장하지 않는 필드나 메서드에 붙인다.
        @Deprecated
        public int getDate() {
            return normlize().getDayOfMonth();
        }
    • javac -Xlint:deprecation Test.java 실행 시 Deprecated 경고를 표시해줌
  3. @FunctionalInterface
    • 함수형 인터페이스로 하나의 추상 메서드만 가져야 하는지 컴파일러가 확인
        @FunctionalInterface
        public interface Runable {
            public abstract void run(); // 한개만 있어야 됨
            // public abstract void test(); // 주석을 없애면 컴파일 에러
        }
  4. @SuppressWarnings
    • 컴파일러 경고 메시지를 나타내지 않도록 억제
        @SuppressWarnings("uncheced") // 제네릭과 관련 된 경고 억제  
        ArrayList list = new ArrayList(); // 제네릭 타입 지정 안함을 프로그래머가 인지했음  
        list.add(obj);

메타 애너테이션

  • 애너테이션을 위한 애너테이션

  1. @Target : 애너테이션을 정의 할 때 적용 대상 지정에 사용

  @Target({ TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
  public @interface TestAnnotation {}

  @TestAnnotation
  class Test { 
      @TestAnnotation
      int t;

      @TestAnnotation
      public void t() { }
  }
  1. @Retention : 애너테이션이 유지되는 기간을 지정하는데 사용

    @Retention(RetentionPlicy.RUNTIME) // 런타임까지
    @Target(ElementType.METHOD)
    public @interface TestAnnotation { }
  1. @Documented : javadoc으로 작성한 문서에 포함시키면 @Docuemnted를 붙인다.
  2. @Inherited : 애너테이션을 자손 클래스에 상속하고자 할 때 상용한다.
    @Inherited
    @interface SuperAnno {}

    @SuperAnno
    class parent {}

    class Child extends Parent {}
  1. @Repeatable : 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용
    @interface ToDos {
        ToDo[] value();
    }

    @Repeatable(ToDos.class)
    @interface ToDo {
        Strign value();
    }

    @Todo("delete test codes.")
    @Todo("override inherited methods")
    class Myclass {
    }

애너테이션 타입 정의

interface에 @를 붙여 애너테이션 이름을 명명 : @Interface
애너테이션 메서드는 추상 메서드이다.

    @interface TestAnnotation {
        int count();
        String testedBy();
        TestType testType();
        DateTime testDate();
    }

    @TestAnnotation(
        count=3, testedBy="Kim", testType=TestType.TEST, testDate=@DateTime(yymmdd="211231", hhmmss="235959"
        )
  • 애너테이션 타입 정의와 사용방법
    @interface TestInfo {
        int count() default 1;
    }

    @TestInfo // @TestInf(count=1)과 동일
    public class NewClass { }
  • 기본 값을 지정 가능
    @interface TestInfo {
        String value();
    }

    @TestInfo("passed") // @TestInfo(value="passed")와 동일
    public class NewClass { }
  • 요소가 하나이고 이름이 value일 때는 요소의 이름 생략 가능
    @interface TestInfo {
        String[] testTools();
    }
  • 요소의 타입이 배열인 경우, 괄호{}를 사용해야 한다.

모든 애너테이션의 조상

  • java.lang.annotation.Annotation은 모든 애너테이션의 조상이지만 상속이 안되는 인터페이스이다.
    public interface Annotation { .
        boolean equals(Object obj);
        int hashCode();
        String toString();

        Class<? extends Annotation> annotationType(); // 애너테이션의 타입을 반환

마커 애너테이션

  • 요소가 하나도 정의되지 않은 애너테이션
    @Target(ElementType.METHOD)
    @Retention(RetentionPlicy.SOURCE)
    public @interface Test {} // 마커 애너테이션. 정의된 요소가 없음

    @Test  // 마커 애너테이션
    public void method() { } 

애너테이션 요소의 규칙

  • 요소의 타입은 기본형, String, enum, 애너테이션, Class만 허용
  • 괄호()안에 매개변수를 선언할 수 없다.
  • 예외를 선언할 수 없다.
  • 요소를 타입 매개변수로 정의할 수 없다.
반응형