[JAVA] Anotation

호성·2024년 4월 19일
1

Java Annotation

: 어노테이션은 어노테이션된 요소들의 행동으로부터 프로그램의 행위를 추출하여, 필요하다면 컴파일러나 VM이 상호 의존적인 코드를 생성하는, 프로그램 요소와 메타 태그에 관계된 매커니즘.
: 사전적 의미로는 주석이라는 뜻을 가지고 있으며, 자바의 어노테이션은 소스코드에 추가해서 사용할 수 있는 메타 데이터의 일종이다.

메타데이터 : 애플리케이션이 처리해야 할 데이터가 아니라 컴파일 과정과 실행 과정에서 코드를 어떻게 처리해야하는지 알려주기 위한 추가 정보

어노테이션 규칙

  • @interface + 어노테이션 이름
  • 어노테이션 소스코드 내부의 메소드 선언은 매개변수를 지닐 수 없다.
  • 어노테이션 소스코드 내부의 메소드 선언은 clauses를 throw 할 수 없다.
  • 메소드의 반환 타입은 primitives, String, Class, enum과 primitives배열, String배열, Class배열, enum배열 중 하나이다.

자바 빌트인 어노테이션

표준 어노테이션

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

  • @Override
    상속받은 부모 클래스의 메소드를 오버라이드한 메소드임을 컴파일러에게 명시한다.
    만일 부모 클래스에 해당하는 메소드가 없다면 컴파일 오류가 발생한다.

  • @Deprecated
    마커 어노테이션으로 차후 버전에 지원되지 않을 수 있기 때문에 더 이상 사용되지 말아야할 메소드를 의미한다.
    하위호환을 위해서 메소드 자체를 없애지는 못하지만 사용하지 말것을 알리고 싶을때 사용한다.
    이 메소드를 사용하는 애플리케이션을 컴파일 할 경우 컴파일 경고가 발생한다.

  • @SuppressWarnings
    컴파일러 경고를 출력하지 않도록 설정한다.
    컴파일러 경고는 경고일 뿐, 경고 상황을 개발자가 알고 있는 경우에는 컴파일 로그가 지저분해지고 진짜 잡아야하는 경고들이 잘 보이지 않을 수 있기 때문에 이 어노테이션을 쓰게 된다.

    • SuppressWarnings 어노테이션의 내부에서 사용할 수 있는 토큰 목록
      • all 모든 경고를 억제합니다.
      • boxing boxing/unboxing 오퍼레이션과 관련된 경고를 억제합니다.
      • cast 캐스트 오퍼레이션과 관련된 경고를 억제합니다.
      • dep-ann 권장되지 않는 어노테이션과 관련된 경고를 억제합니다.
      • deprecation 권장되지 않는 기능과 관련된 경고를 억제합니다.
      • fallthrough switch 문에서 누락된 break 문과 관련된 경고를 억제합니다.
      • finally 리턴되지 않는 마지막 블록과 관련된 경고를 억제합니다.
      • hiding 변수를 숨기는 로컬과 관련된 경고를 억제합니다.
      • incomplete-switch switch 문에서 누락된 항목과 관련된 경고를 억제합니다(enum case).
      • javadoc javadoc 경고와 관련된 경고를 억제합니다.
      • nls 비nls 문자열 리터럴과 관련된 경고를 억제합니다.
      • null 널(null) 분석과 관련된 경고를 억제합니다.
      • rawtypes 원시 유형 사용법과 관련된 경고를 억제합니다.
      • resource 닫기 가능 유형의 자원 사용에 관련된 경고 억제합니다.
      • restriction 올바르지 않거나 금지된 참조 사용법과 관련된 경고를 억제합니다.
      • serial 직렬화 가능 클래스에 대한 누락된 serialVersionUID 필드와 관련된 경고를 억제합니다.
      • static-access 잘못된 정적 액세스와 관련된 경고를 억제합니다.
      • static-method static으로 선언될 수 있는 메소드와 관련된 경고를 억제합니다.
      • super 수퍼 호출을 사용하지 않는 메소드 겹쳐쓰기와 관련된 경고를 억제합니다.
      • synthetic-access 내부 클래스로부터의 최적화되지 않은 액세스와 관련된 경고를 억제합니다.
      • sync-override 동기화된 메소드를 오버라이드하는 경우 누락된 동기화로 인한 경고 억제합니다.
      • unchecked 미확인 오퍼레이션과 관련된 경고를 억제합니다.
      • unqualified-field-access 규정되지 않은 필드 액세스와 관련된 경고를 억제합니다.
      • unused 사용하지 않은 코드 및 불필요한 코드와 관련된 경고를 억제합니다.
  • @SafeVaragrs
    제네릭과 같은 가변 인자의 매개변수를 사용할 때의 경고를 나타내지 않는다.

  • @FunctionalInterface
    함수형 인터페이스라는 것을 의미한다.

메타 어노테이션

어노테이션에 붙이는 어노테이션으로, 어노테이션을 정의하는데 사용한다.

  • @Target
    어노테이션을 정의할 때 적용 대상을 지정하는데 사용한다.

    • TYPE - class, interface, enumeration에 적용
    • METHOD - 메서드 선언에 적용
    • PARAMETER - 파라미터 선언에 적용
    • PACKAGE - 패키지 선언에 적용
    • FIELD - 필드 선언에 적용
    • LOCAL_VARIABLE - 지역 변수 선언에 적용
    • CONSTRUCTOR - 생성자에 적용
    • ANNOTATION_TYPE - 어노테이션 타입에 적용
  • @Inherited
    어노테이션이 하위 클래스에 상속되도록 하기 위해 사용한다.
    상속받는 클래스도 같은 어노테이션 사용해야 한다.
    (기본적으로 어노테이션은 상속되지 않습니다.)

  • @Retention
    어노테이션이 유지되는 기간을 정하기 위해 사용한다.

    • SOURCE
      • 어노테이션이 컴파일 타임시 버려진다는 것을 의미
      • 클래스파일은 어노테이션을 지니지 못함
    • CLASS
      • 클래스 파일까지 어노테이션 정보를 유지
      • 런타임시에는 이 어노테이션을 이용하지 못함
    • RUNTIME
      • 런타임시 JVM에서 어노테이션의 이용이 가능하다는 것을 의미
  • @Documented
    자바 문서에도 어노테이션 정보가 공개하기 위해 사용한다.

출처: https://dev-ahn.tistory.com/130 [Developer Ahn:티스토리]

0개의 댓글