728x90

Obj. 자바의 애노테이션에 대해 학습.

Todo.

12-1.애노테이션 정의하는 방법

12-2. @retention

12-3. @target

12-4. @documented

12-5. 애노테이션 프로세서


12-1.애노테이션 정의하는 방법

애노테이션이란? 애노테이션은 주석이라는 뜻을 가지고 있다. 기본적으로 // or /**/와 같이 생겼으나 주석과는 다르다.

- 어노테이션의 역할도 주석과 크게 다르지 않다.

- 일반주석과 큰 차이점은 코드를 작성할 수 있다는 점이다.

- 코드를 작성할 수 있다는 뜻은 어노테이션으로 뭔가를 할 수 있다.

 

특징

- @interface 으로 정의할 수 있다.

- 상속 할 수 없다. -> 이미 java.lang.annotation.Annotation 인터페이스를 상속 받음.

- 제네닉 타입 선언을 할 수 없다.

- 매서드는 매개변수를 가질 수 없다.

- 매서드 선언은 throws 절을 가질 수 없다.

- 추상 메서드를 가지고 있다.

- 추상 메서드를 구현하지 않아도 컴파일러가 자동으로 구현 해준다.

애노테이션에 다이나믹하게 실행되는 코드는 들어가지 않는다.

- 런타임 중에 알아내야 하는 값은 못 들어간다.

@interface 애노테이션_이름 {
	Type Element 이름();
    Type Element 이름() default value;
    }

여기서 value는 null은 불가능 하다.

또한 타입은 기본형, String, enum, Annotation, class만 혀용된다.

 

표준 애노테이션 

- @Override : 컴파일러에게 오버라이팅하는 메서드 라는 것을 알려준다.

- @Deprecated : 앞으로 사용하지 않을 것을 권장하는 대상에 붙인다.

- @SuppressWarnings : 컴파일러의 특정 경고메세지가 나타나지 않게 해준다.

- @SafeVarargs : 제네릭 타입의 가변인자에 사용한다.(1.7)

- @FunctionalInterface : 함수형 인터페이스 라는 것을 알림(1.8)

- @Native : native 메서드에서 참조되는 상수 앞에 붙인다(1.8)

메타 애노테이션 (애너테이션을 정의하는데 사용하는 애너테이션)

- @Target : 애노테이션이 적용가능한 대상을 지정하는데 사용

- @Documented : 애노테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다.

- @Inherited : 애노테이션이 자손 클래스에 상속되도록 한다.

- @Retention : 애노테이션이 유지되는 범위를 지정하는데 사용

- @Repeatable : 애노테이션을 반복해서 사용 할 수 있게 한다(1.8)

 

12-2. @retention

애노테이션 유지되는 기간을 지정하는데 사용한다.

@Retention(RetentionPolict.SOURCE)
@Retention(RetentionPolict.CLASS)
@Retention(RetentionPolict.RUNTIME)

유지정책

- SOURCE : 소스 코드에만 유지 -> 컴파일 시에만 사용하고, 컴파일 후에는 무시

- CLASS : 클래스 파일까지 유지한다. 즉 바이트 코드에 남기겠다.

- RUNTIME : CLASS와 유사하지만, 메모리에 적재된 클래스 정보를 읽어올 때 애노테이션 정보를 그대로 포함한다.

12-3. @target

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

여러 개의 값을 지정할 때는 배열처럼 괄호{}를 이용해서 지정할 수 있다.

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Target(ElementType.Type)}

  대상 타입 종류

- ANNOTATION_TYPE : 애노테이션

- CONSTRUCTOR : 생성자

- FIELD : 필드(멤버 변수, ENUM 상수)

- LOCAL_VARIABLE : 지역 변수

- METHOD : 메서드

- PACKAGE : 패키지

- PARAMETER : 매개 변수

- TYPE : 타입(클래스, 인터페이스, enum)

- TYPE_PARAMETER : 타입 매개션수(1.8)

- TYPE_USE : 타입이 사용되는 모든 곳(1.8)

 

12-4. @documented

애노테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다.

표준 애노테이션 중  Override와 SuppressWarnings를 제외하고 모두  Documented 메타 애노테이션이 붙어 잇다.

 

 

12-5. 애노테이션 프로세서

애노테이션 프로세서는 소스코드 레벨에서 소스코드에 붙어있는 애노테이션을 읽어서 컴파일러가 컴파일 하는 중에 새로운 소스코드를 생성하거나 기존 소스코드를 바꿀 수 있다. 또는, 클래스(바이트코드)도 생성 할 수 있고 별개의 리소스 파일을 생성할 수 있는 강력한 기능이다.

 

장점 

- 바이트코드에 대한 조작은 런타임에 발생되는 조작임으로 런타임에 대한 비용이 발생한다.

- 하지만 애노테이션 프로세서는 애플리케이션을 구동하는 런타임 시점이 아니라 컴파일 시점에 조작하여 런타임에 대한 비용이 제로가 된다.

 

단점 : 기존의 코드를 고치는 방법은 현재로써는 public 한 API가 없다.

 

 

 

Reference

 https://www.geeksforgeeks.org/annotations-in-java/

www.notion.so/37d183f38389426d9700453f00253532

728x90

'Java > [Whiteship]자바스터디' 카테고리의 다른 글

13주차 과제 : I/O  (0) 2021.03.29
11주차 과제 : Enum  (0) 2021.02.28
10주차 과제 : 멀티쓰레드 프로그래밍  (0) 2021.01.27
9주차 과제 : 예외  (0) 2021.01.21
8주차 과제 : 인터페이스  (0) 2021.01.19

+ Recent posts