기기

Annotation 정리 본문

Java

Annotation 정리

notEmpty 2023. 7. 17. 19:35

annotation이란

  • 주석이라는 뜻으로, 코드에 다른 프로그램을 위한 미리 약속된 형식으로 포함
  • 즉 다른 프로그램을 위한 메타 데이터
  • 프로그래밍 언어에 영향이 없다.
  • 다른 프로그램에 유용한 정보를 제공한다.
  • 자바 5부터 제공

annotation 예시 - @Override

  • @Override는 컴파일러에게 부모 클래스의 메서드를 오버라이드 했다는 것을 알려준다.
  • 그렇기 때문에 실행 전 오류를 알 수 있다.
  • 또한 코드에서 명시적으로 상속 메서드가 무엇인지 쉽게 파악할 수 있다.
public class Parent {
    public int calculate(int a, int b) {
        return a + b;
    }
}
public class Child extends Parent {

    @Override
    public int calculate(int a) {
        return a;
    }
}

오버라이드 calculate의 매개변수를 하나 제거하면 Override에 빨간줄이 생겨 실행 전에 오류를 발견할 수 있다.

게다가 이 예제에서 @Override가 없다면 오버로딩으로 의도치 않게 사용될 수 있다.

 

어노테이션 종류

1. 표준 어노테이션

  • @Override
    • 컴파일러에게 오버라이딩하는 메서드임을 알림
  • @Deprecated
    • 앞으로 사용하지 않을 것을 권장
    • 기존 기능이 대체되거나 개선된 기능이 추가될 때, 기존 기능을 삭제하기보단 해당 어노테이션을 이용
  • @SuppressWarnings
    • 컴파일러의 경고 메시지가 나타나지 않게 한다.
    • 경고 메시지는 deprecation, unchecked, rawtypes, varargs 등 있다.
      • deprecation은 Deprecated 로 인해 발생하는 경고를 제외
      • unchecked는 제네릭으로 타입을 지정하지 않았을 때 발생하는 경고를 제외
      • rawtypes는 제네릭을 사용하지 않아 발생하는 경고를 제외
      • varargs는 가변인자의 타입이 제네릭 타입일 때 발생하는 경고를 제외
      • 이 외에도 다양한 경고 메시지들이 있다.
    • 경고는 안정성이 확실할 때만 사용하는 것이 좋다. 예를들어 unchecked 사용 시 왜 형 안전성을 위반하지 않는지 밝히는 주석을 추가해야 한다.

2. 메타 어노테이션

  • 어노테이션에 붙이는 어노테이션
  • 어노테이션을 정의할 때, 적용대상(target)이나 유지기간(retention) 등 지정하는데 사용
  • @Target
    • 어노테이션의 적용가능한 대상을 지정
    • 종류
      • ElementType.PACKAGE : 패키지 선언
      • ElementType.TYPE : 타입 선언
      • ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
      • ElementType.CONSTRUCTOR : 생성자 선언
      • ElementType.FIELD : 멤버 변수 선언
      • ElementType.LOCAL_VARIABLE : 지역 변수 선언
      • ElementType.METHOD : 메서드 선언
      • ElementType.PARAMETER : 전달인자 선언
      • ElementType.TYPE_PARAMETER : 전달인자 타입 선언
      • ElementType.TYPE_USE : 타입 선언
  • @Retention
    • 어노테이션이 유지되는 기간 지정
    • 유지 정책
      • RetentionPolicy.SOURCE
        • 소스 파일에만 존재
        • @Override 과 같은 컴파일러가 사용하는 어노테이션
      • RetentionPolicy.CLASS
        • 클래스 파일에 존재
        • 런타임 시 사용불가. JVM에 로딩될 때 해당 어노테이션은 무시됨
        • 디폴트 값
      • RetentionPolicy.RUNTIME
        • 클래스 파일에 존재
        • 런타임 시 사용가능
        • 리플렉션을 통해 클래스 파일에 저장된 어노테이션 정보를 읽어 처리할 수 있다.
  • @Inherited
    • 어노테이션의 상속을 가능하게 한다.

'Java' 카테고리의 다른 글

HashMap  (0) 2024.03.28
java int를 char로 형변환하기  (0) 2023.02.11
static, final, static final 특징  (0) 2022.08.20
PATH, CLASSPATH, BUILDPATH에 대해  (0) 2021.12.29
[Java] 예외 처리 - custom exception  (0) 2021.09.22