-
1. 어노테이션
- 코드에서 @으로 작성되는 요소를 어노테이션이라고 한다.
- 어노테이션은 클래스 또는 인터페이스를 컴파일하거나 실행할 때 어떻게 처리해야 할 것인지를 알려주는 설정 정보이다.
- 어노테이션의 컴파일 시 사용하는 정보 전달, 빌드 툴이 코드를 자동으로 생성할 때 사용하는 정보 전달, 실행 시 특정 기능을 처리할 때 사용하는 정보 전달.
2. 표준 애너테이션
자바에서 제공하는 기본 어노테이션이다.
3. 메타 어노테이션
어노테이션을 정의하기 위한 어노테이션이다.
3.1 @Target : 어노테이션이 적용가능한 대상을 지정하는데 사용된다.
- 적용범위는 기본속성 value로 ElementType 열거 상수 배열을 값으로 가짐
3.2 Retention : 어노테이션 유지되는 기간을 지정하는데 사용한다.
- 유지기간 값은 RetentionPolicy 열거 상수로 정의되어 있다.
- SOURCE : 컴파일시 적용, 소스파일에만 존재
- CLASS: 메모리로 로딩시 적용, 클래스 파일에 존재
-RUNTIME: runtime에서 적용,클래스 파일에 존재
* 직접 컴파일러를 작성할 것이 아니면, SOURCE는 딱히 필요없음
CLASS가 어노테이션 유지기간의 기본 값이지만 잘 사용안된다.
RUNMTIME 리플렉션을 통해 클래스 파일에 저장된 애너테이션 정보를 읽어서 처리할 수 있다.
- @Inherited : 어노테이션이 자손 클래스에 상솓된다.
- @Repeatable : 하나의 대상에 한 종류의 어노테이션 붙이는게 일반적임.
어노테이션을 붙여서 어노테이션을 정의하면, 특정 클래스에 해당 어노테이션을 여러번 사용할 수 있다.
-@ Native: 네이티브 메서드에 의해 참조되는 상수 필드에 붙이는 어노테이션임
4. 어노테이션 정의하기
4.1 @Interface
- 어노테이션을 정의하는 것은 인터페이스를 정의하는 것과 비슷하다.
- @interface 뒤에 사용할 어노테이션 이름이 온다.
public @interface AnonotationName{ }
4.2 속성
- 어노테이션을 속성을 가질 수 있다.
- 모양은 추상메서드와 똑같다.
public @interface AnonotationName{ String prop1(); int prop2() default 1; } @AnonotationName(prop1="val") @AnonotationName(prop1="val",prop2=3)
- prop1은 String타입을 값으로 가지는 속성이다.
- prop2는 int를 값으로가지며, 기본값은 1이다.
- 기본속성이 1개이고 이름이 value인 경우에만 속성명을 생략할 수 있다.
public @interface AnonotationName{ String value(); int prop2() default 1; } @AnonotationName("값")
4.3 메타정보
@Target({Element.TYPE, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface AnonotationName{ String value(); int prop2() default 1; }
- 위와 어노테이션에 대한 메타정보를 설정할 수 있다.
4.4 리플렉션을 통한 어노테이션 활용
- RUNTIME으로 설정된 어노테이션은 리플렉션을 통해 어노테이션을 활용할 수 있다.
boolean isAnnotationPresent(AnnotationName.class) 지정한 어노테이션 적용되었는지 여부 Annotation getAnnotation(AnnotationName.class) 지정한 어노테이션이 적용되어 있으면, 어노테이션 리턴 아니면 null Annotation[] getDeclaredAnnotaions() 적용된 모든 어노테이션 리턴 @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface PrintAnnotation{ String value() default "-"; int number() default 15; }
어노테이션 정의
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); } }
어노테이션 사용
public class Ex{ public static void main(String[] args) throws Exception{ Method[] declaredMethod = Service.class.getDeclaredMethods(); for(Method method : declaredMethods){ //printAnnotation 얻기 PrintAnnotation printAnnotation = method.getAnnotation(PrintAnnotation.class); //설정 정보를 이용해서 선 출력 printLine(prinyAnnotation); //메소드 호출 method.invoke(new Servie()); //설정 정보를 이용해서 선 출력 printLine(printAnnotation); } } public static void printLine(PrintAnnotation printAnnotation){ if(printAnnotation != null){ int number = printAnnotation.number(); for(int i=0; i<number; i++) { String value = printAnnotation.value(); System.out.print(value); } System.out.println(); } } } }
'언어 > JAVA' 카테고리의 다른 글
컬렉션 예시들 (0) 2023.07.09 컬렉션 (0) 2023.07.09 중첩 선언과 익명 객체 (0) 2023.07.07 상속,동적생성 (0) 2023.07.06 클래스,인스턴스 메서드 메모리 저장,싱글톤,접근제한자 (0) 2023.07.06