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
'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 |