개발자 미니민의 개발스터디

[JAVA] 자바 - annotation / 빌트인 어노테이션, 메타 어노테이션

by mini_min

[JAVA]
자바 - 어노테이션 annotation 

✔️ 어노테이션이란?

어노테이션이란, 특정 상황에서 데이터를 쉽게 활용할 수 있도록 소스 코드에 추가한 추가정보를 말한다. 스프링에서 ⭐핵중요 스프링에서 핵중요⭐ 추가적인 정보를 제공하는 메타 데이터다~

(역할을 할당해주는 느낌쓰)

 

🏷️ 어노테이션의 용도

어노테이션은 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공

(오버라이드와 동일!! 문법 에러 체크하도록 정보 제공함)

소프트웨어 개발 툴이 빌드나 배치시 코드 자동 생성하도록 정보를 제공하며, 실행시에 특정 기능을 실행하도록 정보를 또한 제공한다. 

 

🏷️ 빌트인 어노테이션

자바가 기본적으로 제공하는 어노테이션이다. 

@Override : 메소드 오버라이드 확인

@Deprecated : 메소드를 사용하지 말도록 유도하고, 사용하면 경고 일으킴

@SuppressWarnings : 컴파일 경로를 무시하도록 함

@SafeVarargs : 제너릭같은 가변인자 매개변수 사용할 때 경고 무시

@FunctionalInterface : 람다식을 위한 함수형 인터페이스 지정

 

class Uesr{
	@Override
	public String toString() {
		return "annotation test";
	}
//더 나은, 개선된 메소드가 있음을 나타낼 때 사용
	@Deprecated
	public void sub() {
		System.out.println("사용을 자제하삼..");
	}
//경고 메시지를 출력하지 말라는 의미
	@SuppressWarnings("deprecation")
	public void disp() {
		Date date  = new Date();
		
		int y = date.getYear() + 1900;
		System.out.println("년도 : " + y);
	}

 

 

 

✔️ 메타 어노테이션이란?

메타 어노테이션은, 다른 어노테이션에 적용되는 어노테이션이다.

@Retention : 어노테이션 정보가 보관되는 기간! + 어떤 시점까지 영향줄건지 결정

= 가능한 리텐션-Policy.소스/클래스

@Documented : 해당 어노테이션을 javadoc 에 포함한다.

@Target : 어노테이션이 적용될 위치를 결정한다.

@Inherited : 이 어노테이션을 선언하면, 하위 클래스가 어노테이션을 상속 가능!

@Repeatable : 반복적으로 어노테이션 선언 하는 것

 

 

 

✔️ 어노테이션 커스텀 가능!!

클래스처럼 어노테이션도 임의로 정의해서 쓸 수 있다!

어노테이션 정의는 인터페이스 정의와 매우 매우 유사하고, 컴파일러는 다른 자바 인터페이스와 마찬가지로 어노테이션을 클래스로 컴파일 한다. 

 

 

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation {
}

class TestService{
	@MyAnnotation
	public void disp() {
		System.out.println("어노테이션 만들기..");
	}
}
💡 적용될 위치(타겟) : 메소드!
유지 : 어노테이션이 런타임 환경에서 사용됨
내 어노테이션 이름은 : Myannotation ~

 

 

 

✔️ 커스텀 어노테이션에 엘리먼트 O

커스텀 어노테이션에 엘리먼트가 있는 경우, @interface (어노테이션) 아래에 엘리먼트를 작성해주면 된다.

아래처럼 어노테이션을 만들기 (참고)

디폴트 : value 는 '-' . number 는 '15' 값을 가진다. (어노테이션에 어떤 엘리먼트를 넣느냐에 따라 메소드 실행시 결과 다를 수 있음)

 

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface PrintAnnotation{
	//어노테이션 속성 설정(엘리먼트)
	public String value() default "-";
	public int number() default 15;
	
}
class PrintService {
	
	@PrintAnnotation
	public void disp1() {
		System.out.println("실행 내용 1");
	}
	
	@PrintAnnotation("*")	//value 는 * , number 는 15를 가질 것
	public void disp2() {
		System.out.println("실행 내용 2");
	}
	
	@PrintAnnotation(value = "#", number = 20)
	public void disp3() {
		System.out.println("실행 내용 3");
	}
	
	public void disp4() {
		System.out.println("annotation 적용 안한 경우..");
	}

 

 

◾ PrintService 클래스 객체 만들보고 출력하면 그냥 disp1() 가 실행된다.

PrintService ps = new PrintService();
ps.disp1();
	System.out.println();

 

 

◾ PrintService 클래스의 메소드 정보 얻기!

, class.getDeclaredMethods();  사용해서 mm배열에 메소드 정보 담기

// PrintService 클래스의 메소드의 정보 얻기
	Method[] mm = PrintService.class.getDeclaredMethods();
for(Method m : mm) {
		//\\System.out.println(m);
			
		//메소드의 이름 출력
		System.out.println(m.getName());
		//print 어노테이션이 적용된 경우
		if(m.isAnnotationPresent(PrintAnnotation.class)) {
			//Annotation의 속성 값을 이용하여 구분선 출력//
				
			///PrintAnnotatio 객체 얻기
			//어노테이션으로 가져옴
			PrintAnnotation pa = m.getAnnotation(PrintAnnotation.class);
💡 m.getName() : 이름 가져오기
m에 어노테이션이 존재하는 경우(적용된 경우), isAnnotationPresent 어떤 어노테이션? => (PrintAnnotation.class) 이 어노테이션!! 만약 어노테이션이 올바르게 적용되어 true 라면 if문을 실행한다.

다음으로 어노테이션 객체 생성.
m에 있는 어노테이션을 get해주어 pa 객체로 만든다. PrintAnnotation pa = m.getAnnotation(PrintAnnotation.class);

 

 

 

for(int i=0; i<pa.number(); i++) {
	System.out.print(pa.value()); //값 15번 출력
}
System.out.println();
	//설정된 값을 가져다가 소스를 고쳐서 다른 기능을 수행함. 
}
//메소드 호출 (인보크)
	try {
		m.invoke(ps);
	} catch (Exception e) {
	}
💡 이제 메소드에 어떤 value 와 number 이냐에 따라서 나오는 값이 다르다.

 

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기