1. 어노테이션
▷ 코드에서 @으로 작성되는 요소
▶ 클래스 또는 인터페이스를 컴파일하거나 실행할 때 어떻게 처리해야 할 것인지를 알려주는 설정 정보
▷ ① 컴파일시 사용하는 정보 전달
▷ ② 빌드 툴이 코드를 자동으로 생성할 때 사용하는 정보 전달
▷ ③ 실행 시 특정 기능을 처리할 때 사용하는 정보 전달
2. 어노테이션 타입 정의와 적용
▷ @interface 뒤에 사용할 어노테이션 이름 작성
public @interface AnnotationName{ // 정보전달할 값 정의; }
@AnnotationName
3. 어노테이션 적용 대상
▷ 어노테이션을 적용할 수 있는 대상의 종류는 ElementType 열거 상수로 정의
▷ @Target 어노테이션으로 적용 대상 지정. @Target의 기본 속성 value 값은 ElementType 배열
NO | ElementType 열거 상수 | 적용 요소 |
1 | TYPE | 클래스, 인터페이스, 열거 타입 |
2 | ANNOTATION_TYPE | 어노테이션 |
3 | FIELD | 필드 |
4 | CONSTRUCTOR | 생성자 |
5 | METHOD | 메소드 |
6 | LOCAL_VARIABLE | 로컬 변수 |
7 | PACKAGE | 패키지 |
4. 어노테이션 유지 정책
▷ 어노테이션 정의 시 @AnnotationName을 언제까지 유지할지 지정
▷ 어노테이션 유지 정책은 RetentionPolicy 열거 상수로 정의
NO | RetentionPolicy 열거 상수 | 어노테이션 적용 시점 | 어노테이션 제거 시점 |
1 | SOURCE | 컴파일할 때 적용 | 컴파일된 후에 제거됨 |
2 | CLASS | 메모리로 로딩할 때 적용 | 메모리로 로딩된 후에 제거됨 |
3 | RUNTIME | 실행할 때 적용 | 계속 유지됨 |
5. 어노테이션 설정 정보
▷ 애플리케이션은 리플렉션을 이용해 적용 대상에서 어노테이션의 정보를 다음 메소드로 얻어냅니다.
NO | 리턴 타입 | 메소드명(매개변수) | 설명 |
1 | boolean | isAnnotationPresent(AnnotationName.class) | 지정한 어노테이션이 적용되었는지 여부 |
2 | Annotation | getAnnotation(AnnotationName.class) | 지정한 어노테이션이 적용되어 있으면 어노테이션을 리턴하고, 그렇지 않다면 null을 리턴 |
3 | Annotation[] | getDeclaredAnnotations() | 적용된 모든 어노테이션을 리턴 |
◎ 어노테이션 예제
◎ PrintAnnotation 어노테이션
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface PrintAnnotation { String value() default "-"; int number() default 15; }
◎ Service 클래스
public class Service { @PrintAnnotation public void method1() { System.out.println("실행 내용1"); } @PrintAnnotation("*") public void method2() { System.out.println("실행 내용2"); } @PrintAnnotation(value="#", number=20) public void method3() { System.out.println("실행 내용3"); } }
◎ PrintAnnotationExample 메인 클래스package annotation; import java.lang.reflect.Method; public class PrintAnnotationExample { public static void main(String[] args) throws Exception { Method[] declaredMethods = Service.class.getDeclaredMethods(); for(Method method : declaredMethods) { // PrintAnnotation 얻기 PrintAnnotation printAnnotation = method.getAnnotation (PrintAnnotation.class); // 설정 정보를 이용해서 선 출력 printLine(printAnnotation); // 메소드 호출 method.invoke(new Service()); // 설정 정보를 이용해서 선 출력 printLine(printAnnotation); } } public static void printLine(PrintAnnotation printAnnotation) { if(printAnnotation != null) { // number 속성 값 얻기 int number = printAnnotation.number(); for(int i=0; i<number; i++) { // value 속성 값 얻기 String value = printAnnotation.value(); System.out.print(value); } System.out.println(); } } } // 출력 : // --------------- // 실행 내용1 // --------------- // *************** // 실행 내용2 // *************** // #################### // 실행 내용3 // ####################
어노테이션은 값을 출력할 때 기본 값으로 미리 지정해 놓는 역할을 합니다.
위의 예시에서도 보면 실행 내용을 출력하기 전후로 어노테이션을 이용해 특수문자들을 나타낸 것을 확인할 수 있습니다.
아직은 좀 어려운 개념이라 이해하기 어려웠고 이후 사용될 때 좀 더 학습해볼게요~!!
많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~
'BackEnd > Java' 카테고리의 다른 글
[java] 스레드(Thread) (0) | 2023.01.21 |
---|---|
[java] 이것이 자바다 ch13 제네릭(Generic) (0) | 2023.01.21 |
[java] 이것이 자바다 ch12 리플렉션(reflection) (0) | 2023.01.21 |
[java] 이것이 자바다 ch12 정규 표현식 클래스 (0) | 2023.01.21 |
[java] 이것이 자바다 ch12 날짜와 시간 클래스 (0) | 2023.01.20 |