프로그래밍/Java

[자바 문법] 어노테이션(Annotation)

코드몬스터 2023. 3. 30. 14:44
728x90
똑똑한 chat GPT와 다른 사람의 블로그 등을 읽고 이해한대로 정리한 내용입니다.

 

어노테이션(Annotation)?

자바 코드에 메타데이터(metadata)를 추가하기 위한 것으로, 컴파일러, 런타임 시스템, 개발 도구 등에 의해 사용됩니다. 어노테이션은 주석(comment)과 유사하지만, 주석은 컴파일되지 않으며 단순히 코드의 설명을 제공하는 역할을 하지만, 어노테이션은 컴파일되어 클래스 파일에 저장되며 실행 시에 사용된다.

 

메타 데이터(Meta Data)?

메타 데이터는 해당 데이터의 특성, 속성, 구조, 관계 등을 기술하는 데이터입니다. 즉, 메타 데이터는 데이터를 설명하는 데이터라고 할 수 있습니다. 

예)

  • 사진 파일의 메타 데이터에는 파일 크기, 파일 형식, 촬영 일자, 위치 정보 등이 포함됩니다. 
  • 데이터베이스에서는 테이블의 구조, 필드의 이름과 타입, 제약 조건 등이 메타 데이터로 저장됩니다.
  • 메타 데이터는 데이터의 검색, 관리, 유효성 검증 등에 사용될 수 있으며, 컴퓨터 시스템에서 데이터의 처리 방식을 결정하는 데에도 중요한 역할을 합니다.

 

어노테이션 역할

컴파일러에게 코드 분석 요청

어노테이션을 사용하여 컴파일러에게 코드 분석을 요청할 수 있습니다. 예를 들어, @Override 어노테이션을 사용하면, 해당 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이딩하고 있는지 컴파일러에게 알립니다.

 

런타임에게 힌트 제공

어노테이션을 사용하여 런타임 시스템에게 힌트를 제공할 수 있습니다. 예를 들어, @SuppressWarnings 어노테이션을 사용하여 특정 경고 메시지를 무시하도록 할 수 있습니다.

 

개발 도구에게 정보 제공

어노테이션을 사용하여 개발 도구에게 정보를 제공할 수 있습니다. 예를 들어, @Deprecated 어노테이션을 사용하여 해당 메서드나 클래스가 더 이상 사용되지 않아야 함을 나타낼 수 있습니다

 

프레임워크에게 정보 제공

어노테이션을 사용하여 프레임워크에게 정보를 제공할 수 있습니다. 예를 들어, 스프링 프레임워크에서는 @Autowired 어노테이션을 사용하여 의존성 주입(dependency injection)을 수행합니다.

 

자바 어노테이션

Built-in Java Annotations

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

 

예)

  • @Override: 컴파일러에게 오버라딩하는 메소드라는 것을 알린다.
  • @Deprecated: 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다.
  • @SuppressWarnings: 컴파일러의 특정 경고 메시지가 나타나지 않게 해 준다.
@Target(ElementType.METHOD)          // Meta Annotation
@Retention(RetentionPolicy.SOURCE)   // Meta Annotation
public @interface Override {
}

 

Meta-Annotation

어노테이션을 정의할 때, 해당 어노테이션에 대한 정보를 지정하는 데 사용

 

1) @Target

어노테이션이 적용 가능한 대상을 지정하는 데 사용, ElementType열거형 상수(Enum)으로 지정할 수 있다.

  • TYPE: 클래스, 인터페이스, Enum 등의 타입에 적용 가능합니다.
  • FIELD: 필드(멤버 변수)에 적용 가능합니다.
  • METHOD: 메서드에 적용 가능합니다.
  • PARAMETER: 매개변수에 적용 가능합니다.
  • CONSTRUCTOR: 생성자에 적용 가능합니다.
  • LOCAL_VARIABLE: 지역 변수에 적용 가능합니다.
  • ANNOTATION_TYPE: 어노테이션에 적용 가능합니다.
  • PACKAGE: 패키지에 적용 가능합니다.
  • TYPE_PARAMETER: 제네릭 타입의 매개변수에 적용 가능합니다.
  • TYPE_USE: 타입 사용에 적용 가능합니다.
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
public @interface MyAnnotation {
    // ...
}

2) @Retention

어노테이션이 유지(retention)되는 기간을 지정하는 데 사용, RetentionPolicy 열거형 상수(Enum)으로 지정할 수 있다.

  • RetentionPolicy.SOURCE: 소스 코드에서만 어노테이션 정보를 유지합니다. 즉, 컴파일된 클래스 파일에는 포함되지 않습니다.
  • RetentionPolicy.CLASS: 클래스 파일에 어노테이션 정보를 유지합니다. 실행 시 JVM은 이 정보를 읽을 수 있습니다. 이 유지 정책이 지정되지 않으면 기본값으로 적용됩니다.
  • RetentionPolicy.RUNTIME: 클래스 파일에 어노테이션 정보를 유지합니다. 실행 시 JVM은 이 정보를 읽을 수 있습니다. 이 유지 정책이 지정되면, 어노테이션을 사용하여 런타임에 리플렉션(reflection)을 사용할 수 있습니다.
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
    // ...
}

3) @Documented

javadoc으로 문서화되어야 함을 나타낸다.

 

 

4) @Inherited

상속되어야 함을 나타낸다.

 

 

어노테이션 작성 방법

빠른 시일 내에 작성할 수 있도록 하겠습니다...ㅠㅠ

 

 

📌 @Overide를 꼭 작성해야될까?

maven이라는 자바 프로젝트 빌드 툴을 사용해서 maven-archetype-quickstart  프로젝트를 만들고 간단하게 아래 이미지와 같이 코드를 작성해 보았다.

 

결론

어노테이션 없이도 코드가 실행이 가능하다~!!

 

testAnnotation 클래스에서 run 메소드가 test 인터페이스의 메소드를 재정의한 것인지 자체 메소드인지 헷갈리지 않을까 생각했는데 인텔리제이(IDE)가 보여주는 1 usage 1 implementation을 정보를 보면 오버라이드(재정의)한 메소드라는 것을 인식하고 있는 것 같다.

 

다만, 코드상에서 어노테이션을 사용하면 어떠한 메소드인지 정확하게 정보를 알 수 있어서 컴파일러나 런타임에서도 이해하기 쉽지 않을까 생각한다.

 

개인 생각

스프링 프레임워크를 사용하는 프로젝트에서 매일 코드를 작성하니까 단순한 자바 프로젝트에서의 코드 작성이 너무 어색하게 느껴진다...;;(프레임워크에 너무 의존하는 느낌이 든다.)

 

어노테이션 없이 interface를 구현

'프로그래밍 > Java' 카테고리의 다른 글

[자바 문법] Java Collection Framework(JCF)  (0) 2023.07.20
[자바 문법] Character 클래스  (0) 2023.05.01
숏서킷 연산(Short-Circuit Evaluation)  (0) 2022.09.26
[자바 문법] 기본형 vs 참조형  (0) 2022.09.26
Java?  (0) 2022.09.23