3-3. Annotation

zhyun·2020년 9월 20일
0

HighJava

목록 보기
15/67

annotation

  • 프로그램 소스코드 안에 다른 프로그램의 정보를 미리 약속된 형식으로 포함시킨 것.
    (JDK1.5부터)

annotation의 목적

  • 주석처럼(있는듯 없는듯) 쓰지만 프로그래밍 언어에 영향을 미치지 않으면서
    다른 프로그램에 유용한 정보를 제공함.

annotation의 종류

1) 표준(내장) 어노테이션
: 주로 컴파일러에게 유용한 정보를 제공하기 위한 어노테이션
: 메타 어노테이션을 제외한 일반적인 어노테이션
: @Override, @SuppressWarnings, @Deprecated
@Repeatable(1.7) @FunctionalInterface(1.7)등

2) 메타어노테이션
: 어노테이션을 위한 어노테이션, 즉 어노테이션을 정의할 때 사용함.
: @Documented, @Target, @Retention, @Inherited 등

annotation 타입 정의하기

@interface 어노테이션이름{
        int id = 100; // 상수 선언 가능
        타입요소이름(); // 반환값이 있고 매개변수는 없는 추상메서드 형태
}

annotation의 규칙

1) 요소의 타입은 기본형, String, enum, annotation, class만 허용된다.
2) ()안에 매개변수를 선언할 수 없다.
3) 예외를 선언할 수 없다.
4) 요소의 타입에 타입 매개변수(제너릭타입문자)를 사용할 수 없다.

=>메타 어노테이션 (ex) PrintAnntation

@Target(ElementType.METHOD)// annotation이 적용가능한 대상을 지정함 -> Method에 붙이는 annotation
@Retention(RetentionPolicy.RUNTIME)//annotation이 유지되는 기간(SOURCE,CLASS가 기본값)
public @interface PrintAnnotation{ //interface앞에 @붙이면 annotation
	int id = 100; // 상수선언 가능. static final int id = 100;
	String value() default "+"; //기본값을 '+'로 지정
	int count() default 20; // 기본값을 20으로 지정
	
	
}

=> Service창

package kr.or.ddit.basic;
//200918 (PrintAnnotation)어노테이션 붙일수 있는 클래스

public class Service {
	
	@PrintAnnotation // 타겟을 메서드로 해놔서 메서드 위에 어노테이션 붙인거임
	public void method1() {
		System.out.println("메서드1에서 출력되었습니다.");
	}

	@PrintAnnotation(value = "%") // value타입의(%) 값이 하나가 있으면 value가 생략된다. 
	public void method2() {
		System.out.println("메서드2에서 출력되었습니다.");
	}
	
	@PrintAnnotation(value="#", count=25) // 다른타입의 요소가 있는 것은 value 생략 불가능
	public void method3() {
		System.out.println("메서드3에서 출력되었습니다.");
	}

	
}

main메서드

public class AnnotationTest {
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		// PrintAnnotaion의 static 변수값 출력
		System.out.println(PrintAnnotation.id); //100 PrintAnnotation에서 100으로 선언해놓음
		
		//reflection 기능을 이용한 메서드 실행하기
		//선언된 메서드 목록 가져오기
		Method[] declaredMethods = Service.class.getDeclaredMethods();
		
		for(Method m : declaredMethods) {
			System.out.print(m.getName()); //메서드명 출력     //count() -> PrintAnnotation에서 20으로 default 해놓음
			for(int i=0; i<m.getDeclaredAnnotation(PrintAnnotation.class).count(); i++) {
				System.out.print(m.getAnnotation(PrintAnnotation.class).value());//value값 출력: %, #
			}
		
		System.out.println();//줄바꿈 처리
		
		//방법1 - 주석해놓고 방법2 실행해도 되고
		//m.invoke(new Service()); // reflection기능 이용한 메서드 실행 // throws Exception
		
		//방법2 - 주석해놓고 방법1 실행해도 됨
		Class<Service> klass = Service.class;
		Service service = (Service)klass.newInstance(); //throws Exception
		m.invoke(service);
		}
	}
}

콘솔창=>

reflection 정리도 참고

profile
HI :)

0개의 댓글