Java Annotation

2023. 4. 1. 12:03·📘 Backend/Java

📘 Annotation

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

표준 Annotation

자바에서 기본적으로 제공하는 애너테이션입니다.


Annotation Name Description
@Override 컴파일러에게 메서드를 오버라이딩하는 것이라고 알림
@Deprecated 앞으로 사용하지 않을 대상을 알릴 때 사용
@FunctionalInterface 함수형 인터페이스라는 것을 알
@SuppressWarning 컴파일러가 경고메세지를 나타내지 않음

메타 Annotation

애너테이션에 붙이는 애너테이션으로, 애너테이션을 정의하는 데에 사용됩니다.


Annotation Name Description
@Target 애너테이션을 정의할 때 적용 대상을 지정하는데 사용한다.
@Documented 애너테이션 정보를 javadoc으로 작성된 문서에 포함시킨다.
@Inherited 애너테이션이 하위 클래스에 상속되도록 한다.
@Retention 애너테이션이 유지되는 기간을 정하는데 사용한다.
@Repeatable 애너테이션을 반복해서 적용할 수 있게 한다.

Custom Annotation

사용자가 직접 정의하는 애너테이션입니다.


표준 Annotation

@Override

메소드 앞에만 붙일수 있는 에너테이션
선언한 메소드가 상위클래스의 메소드를 오버라이딩하는 메소드라는것을 컴파일러에게 전
에러를 발생시켜서 휴먼에러 방지


@Deprecated

오래된 JDK 버전으로 인해 사용안하는 필드&메소드를 사용하지 않는 것을 권장표시


@SuppressWarnings()

컴파일 에러메시지 표시X

img


@FunctionalInterface

  • 함수형 인터페이스를 선언할때, 컴파일러가 선언이 잘되었는지 확인
  • 함수형 인터페이스는 단 하나의 추상메소드만 가져야하는 제약이 있음
  • 이걸 붙이지 않아도 함수형 인터페이스 선언이 가능하지만 휴먼에러 방지&확인용 Annotation임
@FunctionalInterface
public interface Runnable {
    public abstract void run (); // 하나의 추상 메서드
}

메타 Annotation (root Annotation)


@Target

적용할 대상 지정, java.lang.annotation.ElementType 열거형에 정의되어 있음


ANNOTATION_TYPE 애너테이션
CONSTRUCTOR 생성자
FIELD 필드(멤버변수, 열거형 상수)
LOCAL_VARIABLE 지역변수
METHOD 메서드
PACKAGE 패키지
PARAMETER 매개변수
TYPE 타입(클래스, 인터페이스, 열거형)
TYPE_PARAMETER 타입 매개변수
TYPE_USE 타입이 사용되는 모든 대상
import static java.lang.annotation.ElementType.*; 
//import문을 이용하여 ElementType.TYPE 대신 TYPE과 같이 간단히 작성할 수 있습니다.

@Target({FIELD, TYPE, TYPE_USE})    // 적용대상이 FIELD, TYPE
public @interface CustomAnnotation { }    // CustomAnnotation을 정의

@CustomAnnotation    // 적용대상이 TYPE인 경우
class Main {

        @CustomAnnotation    // 적용대상이 FIELD인 경우
    int i;
}

@Documented

  • Annotation에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 설정
  • java에서 제공하는 표준&메타 Annotation중 @Override , @SuppressWarnings 를 제외, 전부 @Documented 적용
@Documented
@Target(ElementType.Type)
public @interface CustomAnnotation { }

@Inherited

  • 하위 클래스가 Annotation을 상속받도록 함
  • 상위 클래스에 붙이면, 하위 클래스도 상위에 붙은 Annotation들과 동일하게 적용됨
@Inherited // @SuperAnnotation이 하위 클래스까지 적용
@interface SuperAnnotation{ }

@SuperAnnotation
class Super { }

class Sub extends Super{ } // Sub에 애너테이션이 붙은 것으로 인식

@Retention

  • Annotation의 지속시간 결정
  • 관련한 유지정책의 종류에는 아래 3가지가 있다

img

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE) 
//오버라이딩이 제대로 되었는지 컴파일러가 확인하는 용도 
//클래스 파일에 남길 필요 없이 컴파일시에만 확인하고 사라짐
public @interface Override(){ }

위의 예제에서 Override 애너테이션은 컴파일러가 사용하면 끝나기 때문에, 실행 시에는 더이상 사용되지 않음을 의미함


@Repeatable

Annotation을 여러번 붙일수 있도록 허용

@Repeatable(Works.class) // ToDo 애너테이션을 여러 번 반복해서 쓸 수 있게 한다.  
@interface Work{  
    String value();  
}

사용자 타입의 애너테이션 ToDo 를 정의하고, @Repeatable 애너테이션을 사용하여 이것을 여러번 사용할 수 있도록 함

@Work("코드 업데이트")  
@Work("메서드 오버라이딩")  
class Main{  
    ... 생략 ...
}

위와 같이 일반적인 애너테이션과 다르게 ToDo 애너테이션을 하나의 대상에 여러번 적용하는 것이 가능함

@interface Works {  // 여러개의 ToDo애너테이션을 담을 컨테이너 애너테이션 ToDos
    Work[] value(); 
}

@Repeatable(Works.class) // 컨테이너 애너테이션 지정 
@interface Work {
    String value();
}

일반적인 애너테이션과 달리 같은 이름의 애너테이션이 여러번 적용될 수 있기 때문에,
이 애너테이션들을 하나로 묶어주는 애너테이션도 별도로 작성


Custom Annotation

@interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있습니다. 
    타입 요소명(); // 애너테이션 요소를 선언
}

한 가지 유의할 점은,애너테이션은 java.lang.annotation 인터페이스를 상속받기 때문에
다른 클래스나 인터페이스를 상속 받을 수 없다

저작자표시 (새창열림)

'📘 Backend > Java' 카테고리의 다른 글

Java Stream  (0) 2023.04.02
Java Lambda Expression  (0) 2023.04.01
Java Collection  (0) 2023.04.01
Java Try-with-Resource & Multi Catch  (0) 2023.04.01
Java Exception  (0) 2023.04.01
'📘 Backend/Java' 카테고리의 다른 글
  • Java Stream
  • Java Lambda Expression
  • Java Collection
  • Java Try-with-Resource & Multi Catch
신건우
신건우
조용한 개발자
  • 신건우
    우주먼지
    신건우
  • 전체
    오늘
    어제
    • 분류 전체보기 (422)
      • 📘 Frontend (71)
        • Markup (1)
        • Style Sheet (2)
        • Dart (8)
        • Javascript (12)
        • TypeScript (1)
        • Vue (36)
        • React (2)
        • Flutter (9)
      • 📘 Backend (143)
        • Java (34)
        • Concurrency (19)
        • Reflection (1)
        • Kotlin (29)
        • Python (1)
        • Spring (42)
        • Spring Cloud (5)
        • Message Broker (5)
        • Streaming (2)
        • 기능 개발 (5)
      • 💻 Server (6)
        • Linux (6)
      • ❌ Error Handling (11)
      • 📦 Database (62)
        • SQL (31)
        • NoSQL (2)
        • JPQL (9)
        • QueryDSL (12)
        • Basic (4)
        • Firebase (4)
      • ⚙️ Ops (57)
        • CS (6)
        • AWS (9)
        • Docker (8)
        • Kubernetes (13)
        • MSA (1)
        • CI & CD (20)
      • 📚 Data Architect (48)
        • Data Structure (10)
        • Algorithm (8)
        • Programmers (17)
        • BaekJoon (5)
        • CodeUp (4)
        • Design Pattern (4)
        • AI (0)
      • ⚒️ Management & Tool (8)
        • Git (7)
        • IntelliJ (1)
      • 📄 Document (10)
        • Project 설계 (6)
        • Server Migration (3)
      • 📄 책읽기 (2)
        • 시작하세요! 도커 & 쿠버네티스 (2)
      • 🎮 Game (4)
        • Stardew Vally (1)
        • Path of Exile (3)
  • 블로그 메뉴

    • 링크

      • Github
    • 공지사항

    • 인기 글

    • 태그

      GStreamer #Pipeline
      Lock #Thread #Concurrency
      React #Markdown
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.0
    신건우
    Java Annotation
    상단으로

    티스토리툴바