java week 12
in Java on Java
목차
Anotation
인터페이스를 기반으로 @
를 사용하는 문법요소
주석과는 그 역활이다르지만 주석처럼 코드에 달아서 클래스에 특별한 의미를 부여하거나 기능을 주입한다.
소스코드에 메타데이터
를 표현하기 위해서 사용
컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려준다.
쉽게 기능이 담긴 주석이라고 생각하면 편하다.
메타데이터
데이터를 위한 데이터, 한 데이터에 대한 설명을 의미하는 데이터 ex) 사진의 메타데이터 : 촬영한 시간, 장소, 플래쉬 사용 유무 등
자바에서 제공하는 애노테이션 (빌트 인 애노테이션)
- @Override - 메소드가 오버라이드 됐는지 검증한다. 만약 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드를 찾을 수 없다면 컴파일 오류가 난다.
- @Deprecated - 메소드를 사용하지 말도록 유도한다. 만약 사용한다면 컴파일 경고를 일으킨다.
- @SuppressWarnings - 컴파일 경고를 무시하도록 한다.
- @SafeVarargs - 제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시한다. (자바7 이상)
- @FunctionalInterface - 람다 함수등을 위한 인터페이스를 지정합니다. 메소드가 없거나 두개 이상 되면 컴파일 오류가 난다. (자바 8이상)
메타 애노테이션
위에서 본 기본 애노테이션 외에도 메타 애노테이션 들이 있다. 이 메타 애노테이션을 이용해 커스텀 애노테이션을 만들 수 있다.
- @Retention - 애노테이션의 범위라고 할수 있다. 어떤 시점까지 애노테이션이 영향을 미치는지 결정한다.
- @Target - 애노테이션이 적용할 위치를 결정한다.
- @Documented - 문서에도 애노테이션의 정보가 표현된다.
- @Inherited - 이 애노테이션을 선언하면 부모클래스에서 애노테이션을 상속받을 수 있다.
- @Repeatable - 반복적으로 애노테이션을 선언할 수 있게 한다.
애노테이션 정의하는 방법
@interface
를 사용하여 정의한다.
public @interface myanotation{
~~~
}
어노테이션은 필드 요소를 가질 수 있다.
(실제로는 추상메서드이다.)
public @interface myanotation{
//타입 이름() defualt xx;
int id() default 10; //int 값을 주지않으면 10이 넣어진다.
String name(); //문자열
String[] arr(); //배열
Operation opration(); //Enum 타입
Class cc(); //Class 타입
Target t(); //Target 어노테이션
}
@myannotation(id =1, name = "salmon")
처럼 사용가능하다.
@target
어노태이션 적용 대상 설정하기
적용 대상은 java.lang.annotation.ElementType 열거 상수로 정의한다.
ElementType 열거상수 | 내용 |
---|---|
TYPE | 클래스, 인터페이스, 열거 타입 |
ANNOTATION_TYPE | 어노테이션 |
FIELD | 필드 |
CONSTRUCTOR | 생성자 |
METHOD | 메소드 |
LOCAL_VARIABLE | 지역 변수 |
PACKAGE | 패키지 |
어노테이션을 적용할 대상을 지정할 때는 @Target 어노테이션을 사용한다.
@target(ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface myanotation{
//타입 이름() defualt xx;
int id() default 10; //int 값을 주지않으면 10이 넣어진다.
String name(); //문자열
String[] arr(); //배열
Operation opration(); //Enum 타입
Class cc(); //Class 타입
Target t(); //Target 어노테이션
}
@myanotation
public class ClassName {
@myanotation
private String fieldName;
//@myanotatione @Target에 CONSTRUCTOR 가 없어 생성자는 적용할 수 없다. (컴파일 에러)
public ClassName() { }
@myanotation
public void methodName() { }
}
클래스, 필드, 메소드만 어노테이션을 적용할 수 있고, 생성자는 적용할 수 없다.
@rentation
어노테이션 유지 정책
사용 용도에 따라 @myannotation 을 어느 범위까지 유지할 것인지 지정해야 한다.
소스상에서만 유지할 것인지, 컴파일된 클래스까지 유지할 것인지, 런타임 시에도 유지할 것인지 결정해야 한다.
유지 정책은 java.lang.annotation.RetentionPolicy 열거 상수로 아래와 같이 정의 된다.
RetentionPolicy 열거 상수 | 설명 |
---|---|
SOURCE | 소스 상에서만 어노테이션 정보를 유지한다. 소스 코드를 분석할 때만 의미가 있고, 바이트 코드 파일에는 정보가 남지 않는다.(컴파일 후 사라진다.) |
CLASS | default, 바이트 코드 파일까지 어노테이션 정보를 유지한다. 리플렉션을 이용해서 이노테이션 정보를 얻을 수는 없다.(.class에는 존재하지만, 런타임에는 사라진다.) |
RUNTIME | 바이트 코드 파일까지 어노테이션 정보를 유지하면서, 리플렉션을 이용해서 런타임 시에 어노테이션 정보를 얻을 수 있다.(언제나 존재) |
리플렉션(Reflection) : 런타임 시에 클래스의 메타 정보를 얻는 기능
클래스가 가진 필드, 생성자, 메소드, 적용된 어노테이션이 무엇인지 알아내는 것
런타임 시에 어노테이션 정보 얻기 위해서는 유지 정책을 RUNTIME으로 설정해야 한다
@target(ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface myanotation{
//타입 이름() defualt xx;
int id() default 10; //int 값을 주지않으면 10이 넣어진다.
String name(); //문자열
String[] arr(); //배열
Operation opration(); //Enum 타입
Class cc(); //Class 타입
Target t(); //Target 어노테이션
}
@documented
- 애노테이션에 대한 정보가
javadoc
으로 작성한 문서에 포함되도록 한다. - 자바에서 제공하는 기본 애노테이션 중 @Override, @SuppressWarnings를 제외하고는 모두 이 메타 애노테이션이 붙어 있다.
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface FunctionalInterface {}
javadoc
JavaDoc은 Java코드에서 API문서를 HTML 형식으로 생성해주는 도구이다.
HTML 형식이기 때문에 다른 API를 하이퍼 링크를 통해 접근이 가능하다.
/**
* javaDoc Test
*/
public class Annotation {
/**
* 덧셈을 한다.
* @param num1
* @param num2
* @return num1 + num2
*/
public int sum(int num1, int num2) {
return num1 + num2;
}
}
javadoc 변환
javadoc 파일
인텔리 제이에서 javaDoc이 생성될 디렉토리(Output directory)를 설정하면 해당 디렉토리에 위와 같은 html 파일이 생성된다.
documened 애노테이션을 사용한뒤 내가 java doc 문서 만들면 @documened가 붙은 애노테이션이 문서에 표기된다.
애노테이션 프로세서
annotation processor는 자바 컴파일러 플러그인의 일종으로, 애노테이션에 대한 코드베이스를 검사, 수정, 생성하는 역할이다.
애노테이션을 사용하기 위해서는 애노테이션 프로세서가 필요하다.
- 애노테이션 프로세서를 사용한다는 것을 자바 컴파일러가 알고 있는 상태에서 컴파일을 수행한다.
- 애노테이션 프로세서들이 각자의 역할에 맞게 구현되어 있는 상태에서 실행되지 않은 애노테이션 프로세서를 실행한다.
- 애노테이션 프로세서 내부에서 애노테이션에 대한 처리를 한다.
- 자바 컴파일러가 모든 애노테이션 프로세서가 실행 되었는지 검사하고, 모든 애노테이션 프로세서가 실행되지 않았다면 반복한다.
참고
- 애노테이션 정의하는 방법
- https://k39335.tistory.com/40
- https://honbabzone.com/java/java-anontation/
- https://kephilab.tistory.com/55
- @documented
- https://wookcode.tistory.com/24?category=979588
- https://www.notion.so/12-386f4cd47d37448fa0252d3ed22b45b7#6fd927401cfb489fa3f7bb984d82f986
- 애노테이션 프로세서
- https://wookcode.tistory.com/24?category=979588