어노테이션

한상우·2023년 5월 31일
0

java

목록 보기
15/16

어노테이션

어노테이션이란


어노테이션은 메타 데이터로서.

어노테이션 자체는 어노테이션이 붙은 코드 동작에 영향을 미치지 않음

작성한 코드에 대해 추가적인 정보를 제공하면서, 컴파일, 런타임 시점에 해당 코드에 대한 추가적인 처리를 해줌

언제 쓸까?

  • 컴파일러에게 필요한 정보 제공
  • 컴파일/배포 시에 필요한 처리 기능
  • 런타임에 필요한 처리 제공 (java reflection)

메타 어노테이션

어노테이션을 위한 어노테이션, 어노테이션을 정의할 때 사용

  • @Target

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

    • ElementType.TYPE
      • 클래스, 인터페이스, 열거 타입
    • ElementType.ANNOTATION_TYPE
      • 어노테이션
    • ElementType.FIELD
      • 필드
    • ElementType.CONSTRUCTOR
      • 생성자
    • ElementType.METHOD
      • 메소드
  • @Rentention

    어노테이션이 유지되는 기간을 지정하는데 사용된다

    • RetentionPolicy.SOURCE : 소스 파일에만 존재, 클래스 파일에 존재 X
      • 컴파일 전까지만 유효하다
    • RetentionPolicy.CLASS : 클래스 파일에 존재, 실행시 사용 불가
      • 클래스 파일이 JVM에 로딩될 때는 어노테이션 정보가 무시, 실행시에 어노테이션에 대한 정보 얻을 수 없다
    • RetentionPolicy.RUNTIME : 클래스 파일에 존재, 실행시 사용가능
      • 실행 시에 리플랙션 (reflection) 을 통해 클래스 파일에 저장된 어노테이션의 정보를 읽어서 처리할 수 있다
  • @Documented

    • 어노테이션에 대한 정보를 javadoc 로 작성한 문서에 포함되도록 한다
  • @Inherited

    • 어노테이션이 자손 클래스에 상속되도록 한다
  • @Repeatable

    • 어노테이션을 반복해서 적용할 수 있게 한다

표준 annotation

  • @Override
    1. 메서드 앞에만 붙일 수 있음
    2. 메서드를 오버라이딩 하는 것임을 컴파일러에게 알려주는 역할
    3. 아래와 같이 오버라이딩 할 때 메서드 이름을 잘못 적을 경우 컴파일러는 새로운 메서드가 추가되었다고 생각할 뿐이지 오류가 발생하지 않았다고 생각한다. 반면 @Override를 붙여주면 이를 잡을 수 있다

  • @Deprecated
    • 새로운 버전의 JDK가 소개될 때 기존의 기능을 대체할 것들이 추가되어도, 기존의 기능을 사용하고 있을 상황을 고려해 만들어진 어노테이션이다.
    • 이 어노태이션이 붙은 대상은 더 이상 사용하지 않을 것을 권한다는 의미

    ```java
    Deprecated
    As of JDK version 1.1, 
    replaced by Calendar.get(Calendar.DAY_OF_MONTH)
    ```
    
  • @SuppressWarnings
    • 컴파일러가 보여주는 경고메시지가 나타나지 않게 억제해줌
  • @SafeVarargs
    • 제네릭 타입의 가변인자에 사용
  • @FunctionalInterface
    • 함수형 인터페이스를 선언할 때 이 애노테이션을 붙이면 컴파일러가 함수형 인터페이스를 올바르게 선언했는지 확인하고, 잘못된 경우 에러를 발생시킴
  • @Native
    • 네이티브 메서드에 의해 참조되는 상수 필드에 붙이는 어노테이션, 네이티브 메서드는 JVM이 설치된 OS의 메소드

커스텀 어노테이션 정의하는 방법


쉽다

어노테이션을 통해 정의해 둔 값을 추출하여 런타임에 필요한 세팅을 해줄 수 있고, 이러한 원리로 스프링에서는 @GetMapping을 통해 매핑될 URL을 지정해 줄 수가 있다.

profile
안녕하세요 ^^

0개의 댓글