Java-Advanced09-Annotation
애노테이션 (Annotations)
애노테이션이란
- 애노테이션의 사전적인 의미는 주석
- JVM, 컴파일러, 프레임워크 등에게 전달하는 메타데이터로 사용됨
기본 애노테이션
| 애노테이션 | 설명 | 비고 |
|---|---|---|
| @Override | 상속하여 오버라이드된 메소드 | |
| @Deprecated | 앞으로 사라질 예정임을 표기 | |
| @SuppressWarnings | 컴파일러에게 특정 경고 메세지를 무시하도록 한다. | eg. @SuppressWarnings(“unused”) |
| @FunctionalInterface | 함수형 인터페이스임을 표기 (Lambda) |
애노테이션의 구성 요소
- 애노테이션의 작성
- 추상 메소드와 유사한 형태로 구현
1 | // 메타 애노테이션 |
- 애노테이션의 사용
- key=value 형태로 애노테이션에 속성의 값 전달
1 | // 키 = 값 배열 |
Target 설정
애노테이션을 사용할 수 있는 대상을 설정
ElementType 열거형 상수 사용
ElementType범위 TYPE클래스, 인터페이스, 애노테이션, 열거형 FIELD필드(멤버 변수), 열거형 상수 METHOD메소드 PARAMETER메소드의 파라미터 CONSTRUCTOR생성자 LOCAL_VARIABLE로컬 변수 ANNOTATION_TYPE애노테이션 PACKAGE패키지
Retention 설정
애노테이션 정보를 언제까지 유지할 것인지 설정
RetentionPolicy 열거형 상수 사용
reflection: java.lang.reflect API
RetentionPolicy범위 SOURCE컴파일러가 사용. 빌드된 .class 파일에는 포함되지 않음 CLASS.class 파일에 포함되나, VM이 사용하지 않으며 reflection에 정보를 포함하지 않음 RUNTIME.class에 포함, VM에서 인식, reflection에 정보를 포함
사용자 정의 애노테이션
사용자 정의 애노테이션 구현
1
2
3
4
5
6
public CustomAnnotation {
String value();
String valueTwo() default "기본값";
}사용자 정의 애노테이션 사용
1
2
3
4
5
6
7
8
9
10class CustomAnnotationUsage {
String gameName = "여러분의 틱택토";
String serverIP;
String gameMode = "AI vs. AI";
String serverPort;
}Reflection을 이용하여 애노테이션에 할당된 값 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24class CustomAnnotationTest {
public static void main(String[] args) throws Exception {
CustomAnnotationUsage obj = new CustomAnnotationUsage();
Map<String, Object> gameProp = new HashMap<>();
Map<String, Object> serverProp = new HashMap<>();
Field[] fields = CustomAnnotationUsage.class.getDeclaredFields();
for (Field field: fields) {
CustomAnnotation annotation = field.getDeclaredAnnotation(CustomAnnotation.class);
if (field.get(obj) == null) {
field.set(obj, annotation.valueTwo());
}
if (annotation.value().equals("game")) {
gameProp.put(field.getName(), field.get(obj));
} else {
serverProp.put(field.getName(), field.get(obj));
}
}
System.out.println(gameProp);
System.out.println(serverProp);
}
}