어노테이션(Annotation)

귀찮Lee·2022년 5월 19일
0

Java

목록 보기
9/15
post-custom-banner

◎ 어노테이션

  • 프로그래밍 언어에 영향을 미치지 않으면서 다른 프로그램에게 유용한 정보를 제공하는 역할

◎ 어노테이션 용도

  • 컴파일러에게 문법 에러를 체크하도록 정보를 제공
  • 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공
  • 런타임에 특정 기능을 실행하도록 정보를 제공

◎ 표준 어노테이션

  • 자바에서 기본적으로 제공하는 어노테이션

  • @Override

    • 메서드가 상위 클래스의 메서드를 오버라이딩하는 메서드라는 것을 컴파일러에게 알려줌
    • 상위 클래스(인터페이스)에서의 동일한 이름을 찾을 수 없다면 에러를 일으킴
    • 목적 : 매서드 이름에 오타가 나서 오버라이딩이 안되는 경우를 방지
    class Super {
        void run() {}
    }
    class Sub extends Super {
        @Override
        void rnu() {} // 컴파일 에러 발생, 오타가 난 것을 발견할 수 있음.
    }
  • @Deprecated

    • 더 이상 사용하지 않는 필드나 메서드가 생겼을 때, 그러한 필드 및 메서드에 사용하여 해당 메서드 및 필드를 더 이상 사용하지 않음을 표시
    • 사용시에는 컴파일 할때, 메세지를 나타냄
    • 목적 : 하위 버전 호환성 문제로 삭제하기 곤란해 남겨두지만, 사용하는 것을 권장하지 않을 경우 등등
    class OldClass {
        @Deprecated
        int oldField;
    
        @Deprecated
        int getOldField() { return oldField; };
    }
    ---------------------
    ◎ 메세지
    Note: 파일명.java uses or overrides a deprecated API.
    Note: Recomplie with -Xlint:deprecation for details.
  • @SuppressWarnings

    • 선언한 곳의 컴파일 경고를 나타나지 않도록 한다.
    • 목적 : 경우에 따라 경고가 발생할 것을 알면서도 묵인해야 할 때
    • 예시, 종류
  • @FunctionalInterface

    • 함수형 인터페이스를 선언할 때, 올바르게 선언했는지 확인
    • 함수형 인터페이스 : 추상메서드가 하나만 있는 인터페이스
    • 목적 : 코드 작성과정에서 실수를 방지하기 위한 확인용 애너테이션
    @FunctionalInterface
    public interface Runnable {
        public abstract void run ();
    }

◎ 사용자 정의 어노테이션

  • 사용자가 직접 어노테이션을 정의해서 사용할 수 있음.

  • 정의 방법 : 인터페이스를 정의하는 것과 유사

  • 어노테이션 규칙

    • 요소의 타입은 기본형, String, enum, 어노테이션, Class만 허용된다.
    • 괄호()안에 매개변수를 선언할 수 없다.
    • 예외를 선언할 수 없다.
    • 요소의 타입을 매개변수로 정의할 수 없다.(< T >)
    @interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있습니다. 
        타입 요소명(); // 애너테이션 요소를 선언
    }
    import java.lang.annotation.*;
    
    @Target(ElementType.FIELD)//애너테이션이 적용 가능한 대상을 FIELD로 정해줍니다.
    @Retention(RetentionPolicy.RUNTIME)//코드 실행시 까지 애너테이션이 유지되게 정해줍니다.
    @Documented //애너테이션 정보를 javadoc으로 작성된 문서에 포함시킨다.
    public @interface BackendFramework { //백엔드 프레임워크를 지정해주는 애너테이션을 작성합니다.
        enum Frameworks {SPRING, DJANGO, EXPRESS}
    
        Frameworks backendFramework() default Frameworks.DJANGO;
    }

◎ 메타 어노테이션

  • 어노테이션에 붙이는 애너테이션으로, 애너테이션의 적용 대상이나 유지 기간을 정하는 등 애너테이션의 정의하는 데에 사용

  • @Target

    • 애너테이션의 적용 범위는 @Target 애너테이션으로 정할 수 있다.
  • @Documented

    • 애너테이션에 대한 정보가 javadoc 문서에 표기
    @Documented
    @Target(ElementType.Type)
    public @interface CustomAnnotation { }
  • @Inherited

    • 하위 클래스가 어노테이션을 상속받도록 한다
    • 만든 어노테이션을 상위 클래스(인터페이스)에 적용시, 하위 클래스에도 적용
    @Inherited // @SuperAnnotation이 하위 클래까지 영향 미치게 함
    @interface SuperAnnotation{ }
    
    @SuperAnnotation
    class Super { }
    
    class Sub extends Super{ } // Sub에 애너테이션이 붙은 것으로 인식
  • @Retention

    • 애너테이션이 유지되는 기간을 지정하는 속성 (유지정책)
    유지 정책설명
    SOURCE.java 소스 파일까지는 애노테이션이 존재, 컴파일 되어 클래스 파일이 되면 사라짐
    CLASS.class 파일까지는 애노테이션이 존재, 런타임에서 사라짐
    RUNTIME런타임 실행시까지 애노테이션이 남아있음
  • @Repeatable

    • 해당 어노테이션은 여러 번 작성할 수 있습니다.
    @Repeatable(ToDos.class) // ToDo 애너테이션을 여러 번 반복해서 쓸 수 있게 한다.  
    @interface ToDo{  
        String value();  
    }
    
    @ToDo("update test codes.")  
    @ToDo("override test methods")  
    class Main{  
    
    }
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!
post-custom-banner

0개의 댓글