Java annotation
- 주석과 비슷하지만 주석과 달리 런타임시 JVM에 유지 가능
- 위키의 정의가 제일 유용한 것 같다.
- 필요에 따라 런타임시 JVM에 유지할 수 있고, 리플렉션을 이용해서 읽고 추가적인 작업이 가능하다.
- 발음이 어렵다. 미국사람들은 애(아에 살짝 가까운)너테이션, 영국사람들은 아노테이션으로 발음하는 것 같다.
In the Java computer programming language, an annotation is a form of syntactic metadata that can be added to Java source code. Classes, methods, variables, parameters and Java packages may be annotated. Like Javadoc tags, Java annotations can be read from source files. Unlike Javadoc tags, Java annotations can also be embedded in and read from Java class files generated by the Java compiler. This allows annotations to be retained by the Java virtual machine at run-time and read via reflection. It is possible to create meta-annotations out of the existing ones in Java.
(https://en.wikipedia.org/wiki/Java_annotation)
표준 애너테이션
annotation | description |
---|
@Overide | 컴파일러에게 오버라이딩 메소드라고 알려줌 |
@Deprecated | 앞으로 사용하지 않는 대상 |
@SupressWarning | 컴파일러 경고 메시지 표시 안하기 |
@SafeVarags | 제네릭스 타입 가변인자 사용 |
@FunctionalInterface | 철자주의, 함수형 인터페이스라는 것을 알림 |
@Native | 네이티브 메소드에서 참조하는 상수 |
@Target* | 애너테이션 적용대상 지정에 사용 |
@Documented* | 애너테이션 정보가 자바독에 포함됨 |
@Retention* | 애니테이션의 유지범위 지정 |
@Repeatable* | 애너테이션을 반복 적용할 수 있게 함 |
@Repeatable(ToDos.class)
@interface(TODO {
String value();
}
@ToDo("Delete this")
@ToDo("I'm in hunger, Frostmore")
class DeathKnight {
}
애너테이션 정의하기
@interface 애너테이션_이름 {
타입 요소_이름(); //추상메소드
}
예제
@interface Info {
int count() default 1;
String value();
DateTime date();
}
@interface DateTime {
String yymmdd();
String hhmmsss();
}
@Info
class Foo {
@Info("foo-bar")
void bar() {
}
}
@retention
SOURCE: 소스 파일에만 존재. 클래스에 존재하지 않음
CLASS: 컴파일된 클래스 파일에 존재. 런타임시 사용불가 기본값
RUNTIME: 실행시 사용가능
@target
종류 | 의미 |
---|
ANNOTATION_TYPE | 애너테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드 (멤버변수 및 이넘상수) |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메소드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입(클래스, 인터페이스, 이넘) |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든 곳 |
- 쓰다 보니 헷갈려서 다시 검색해봤는데 parameter는 매개변수, argument는 인자로 번역하는 경향이 있다. 인자보다는 인수가 어울린다라는 내용과 argument is actual parameter 라는 문구도 나쁘지 않은 듯.
@documented
- 자바독으로 작성한 문서에 포함시키고 싶을 때 사용한다.
애노테이션 프로세서
- 구글링으로 찾아서 공부했는데, 이전에 공부했었구나만 기억난다.
- TODO: 스터디 끝나고 다시 공부하고 정리하기.
package com.example;
@SupportedSourceVersion(SourceVersion.latestSupported())
@SupportedAnnotationTypes({
})
public class MyProcessor extends AbstractProcessor {
@Override
public synchronized void init(ProcessingEnvironment env){ }
@Override
public boolean process(Set<? extends TypeElement> annoations, RoundEnvironment env) { }
}
팩토리 패턴 예제