본문 바로가기

BackEnd/Java

[java] 이것이 자바다 ch12 어노테이션(annotation)

728x90
반응형

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
//	####################

 

어노테이션은 값을 출력할 때 기본 값으로 미리 지정해 놓는 역할을 합니다.

 

위의 예시에서도 보면 실행 내용을 출력하기 전후로 어노테이션을 이용해 특수문자들을 나타낸 것을 확인할 수 있습니다.

 

아직은 좀 어려운 개념이라 이해하기 어려웠고 이후 사용될 때 좀 더 학습해볼게요~!!

 

많은 분들의 피드백은 언제나 환영합니다! 많은 댓글 부탁드려요~~

 

 

 

728x90
반응형