본문 바로가기

Java Live Study

Live Study 12주차 : 애노테이션

목표

자바의 애노테이션에 대해 학습하기

 

학습할 것

  • 애노테이션 정의하는 방법
  • @Retention
  • @Target
  • @Documented
  • 애노테이션 프로세서

과제 마감

2021.02.06 1PM

 

 


 

 

 

Annotation이란?

  • 주석. 메타 데이터(데이터에 관한 데이터)의 한 형태
  • 프로그램에 대한 데이터 제공
  • 코드에 직접적인 영향을 주지 않음

 

애노테이션 정의하는 방법

 

이것은 가장 간단한 형태의 애노테이션이다.

@Entity

 

' @ ' 는 컴파일러에게 이다음에 오는 것이 주석임을 알린다.

@Override
void myJavaStudyMethod() { ... }

 

 

애노테이션은 이름(name)이 있을 수도, 없을 수도 있다. 그리고 그 요소에 대한 값이 있다.

// 이름이 있는 경우
@Author(
     name = "whiteship study",
     date = "2020-11-21"
)
class myStudy() { ... }

 

// 이름이 없는 경우
@SuppressWarnings(value = "unchecked")
void myStudy2() { ... }

 

value 요소가 하나만 있는 경우, 다음처럼 생략할 수 있다.

// 값이 1개인 경우 이름 생략 가능
@SuppressWarnings("unchecked")
void myStudy2() { ... }

 

하나의 선언에 여러 개의 주석을 사용할 수 있다.

@Author(name = "whiteship")
@EBook
class myStudy { ... }

 

 

애노테이션을 사용하는 곳?

클래스, 필드, 메소드, 다른 프로그램의 요소의 선언 시 등.

 

 

기본적으로 제공되는 내장 애노테이션

7개의 표준 애노테이션 중, 3개가 java.lang, 4개가 java.lang.annotation에 존재한다.

 

 

자바 코드에 적용되는 애노테이션

@Override

  • 메소드가 오버라이드 되었음을 나타낸다.
  • 부모 클래스 또는 구현된 인터페이스에서 해당 메서드를 찾지 못하면 컴파일 에러가 발생한다.

@Deprecated

  • 메서드를 사용하지 않는 것을 나타낸다.
  • 만약 해당 메서드가 사용되면 컴파일 경고가 발생한다.

@SuppressWarnings

  • 컴파일러에게 컴파일 시 경고를 억제하도록 한다.

 

그 외 애노테이션에 적용되는 애노테이션 (메타 애노테이션)

  • 4가지가 java.lang.annotation에 정의되어 있음.
  • @Retention (아래에서 설명) 
  • @Documented
  • @Target
  • @Inherited : 주석은 하위 클래스에 의해 상속되지 않지만, 이 애노테이션을 사용하면 애노테이션을 상속할 수 있다.

 


 

@Retention

표시된 애노테이션의 정보가 언제까지 유지되는지 나타낸다.

  • RetentionPolicy.SOURCE : 소스단에서만 유지되기에 컴파일 전까지 유지. 이후에 컴파일러에 의해 무시된다.
  • RetentionPolicy.CLASS : 컴파일 시까지 컴파일러에 의해 유지되지만, 이후에 JVM에서는 무시된다.
  • RetentionPolicy.RUNTIME : 런타임 시까지 JVM에 의해 유지된다.

 


 

@Target

@Target 애노테이션은 애노테이션이 적용되는 요소의 종류를 지정할 수 있다.

다음 중 하나의 값을 가진다.

  • ElementType.ANNOTATION_TYPE : 어노테이션 타입
  • ElementType.CONSTRUCTOR : 생성자
  • ElementType.FIELD : 멤버 변수
  • ElementType.LOCAL_VARIABLE : 지역 변수
  • ElementType.METHOD : 메서드
  • ElementType.PACKAGE : 패키지
  • ElementType.PARAMETER : 메서드의 매개변수
  • ElementType.TYPE : 클래스의 모든 요소

 

@Retention(RetentionPolicy.RUNTIME) // 런타임시까지 접근 가능
@Target({ElementType.METHOD})       // 클래스 메서드에만 적용 가능
public @interface Tweezable { ... }

 


 

@Documented

@Documented 애노테이션은 선언된 요소가 Javadoc 문서에 애노테이션을 표시하도록 지정한다.

 


 

애노테이션 프로세서

  • 자바 소스 코드가 컴파일되면, '애노테이션 프로세서(Annotation Processor)'라는 컴파일러 플러그인이 애노테이션을 처리할 수 있다. 이 애노테이션 프로세서는 정보 메시지를 생성하거나 자바 소스파일 또는 리소스를 생성할 수 있고, 이것은 차례대로 컴파일 및 처리될 수 있다. 그러나 애노테이션 프로세서는 애노테이션이 있는 코드 자체는 수정할 수 없다.
  • 자바 컴파일러는 애노테이션에 CLASS 또는 RUMTIME의 RetentionPolicy가 있을 경우, 클래스 파일에 애노테이션 메타데이터를 저장한다.
  • 추후에 JVM이나 다른 프로그램이 메타데이터를 찾아 프로그램의 동작을 바꾸거나 변경할 수 있다.

 

  • 애노테이션 프로세서를 사용해서 애노테이션을 처리하기 위한 또다른 방법은 reflection을 사용하는 것이다.
  • java.lang.reflect 패키지에 AnnotatedElement 인터페이스가 있는데, 자바 reflection으로 구현된다.
  • 이 인터페이스의 구현은 현재 JVM에서 실행중인 프로그램의 애노테이션을 나타낼 수 있다. 이 인터페이스를 통해 애노테이션을 reflectively하게 읽을 수 있다.

 


 

+ Annotation에 대해 막연하게 알고 있었는데 이번에 정리할 기회였던 것 같다.

그치만 아직 와닿지 않..는다

여전히 설명이 많이 부족하지만 내일 라이브를 보며 더 채워야겠다! 감사합니다 :-)

 

< reference >

docs.oracle.com/javase/tutorial/java/annotations

en.wikipedia.org/wiki/Java_annotation

 

Java annotation - Wikipedia

In the Java computer programming language, an annotation is a form of syntactic metadata that can be added to Java source code.[1] Classes, methods, variables, parameters and Java packages may be annotated. Like Javadoc tags, Java annotations can be read f

en.wikipedia.org

 

 

'Java Live Study' 카테고리의 다른 글

Live Study 14주차 : 제네릭  (0) 2021.03.06
Live Study 13주차 : I/O  (0) 2021.03.05
Live Study 9주차 : 예외 처리  (0) 2021.01.16
Live Study 8주차 : 인터페이스  (0) 2021.01.16
Live Study 7주차 : 패키지  (0) 2021.01.02