hyeonga_code
Java의 신_Chapter 17_Annotation 본문
2024.03.28
- 어노테이션_Annotation
-- 클래스나 메소드를 선언할 때에 @를 사용하는 것
-- 메타데이터라고도 한다
-- 컴파일러에게 정보를 알려주는 기능
-- 컴파일 할 때, 설치 시 작업을 지정
-- 실행할 때 별도의 처리가 필요한 경우 사용한다.
-- 어노테이션은 상속할 수 없다.
-- 이미 지정되어 있는 어노테이션
---- @Override
------ 해당 메소드가 부모 클래스의 메소드를 Override 했다는 것을 명시적으로 선언
---- @Deprecated
------ 더이상 사용하지 않음을 명시하고 누군가 사용하는 경우 경고를 해준다.
---- @SupressWarnings("//속성값을 지정할 수 있다.")
------ 경고를 무시할 수 있도록 한다.
-- 메타 어노테이션_Meta Annotation
---- 어노테이션을 직접 선언할 때 사용
---- @Target
------ 어노테이션을 어떤 것에 적용할 지 선언
@Target(ElementType.METHOD)
/*
-- CONSTRUCTO0R : 생성자 선언 시
-- FIELD : enum 상수를 포함한 필드 값 선언 시
-- LOCAL_VARIABLE : 지역 변수 선언 시
-- METHOD : 메소드 선언 시
-- PACKAGE : 패키지 선언 시
-- PARAMETER : 매개변수 선언 시
-- TYPE : 클래스, 인터페이스, enum 등 선언 시
*/
---- @Retention
------ 어노테이션 정보의 유지 시간을 설정
@Retention(RetentionPolicy.RUNTIME)
/*
-- SOURCE : 컴파일 시 사라짐
-- CLASS : 클래스 어노테이션 정보가 컴파일러에 의해 참조 가능하지만 VM에서는 사라짐
-- RUNTIME : 실행 시 VM에 의해 참조 가능
*/
---- @Documented
------ 해당 어노테이션에 대한 정보가 API 문서에 포함된다는 것을 선언
---- @Inherited
------ 모든 자식 클래스에서 부모 클래스의 어노테이션을 사용 할 수 있다는 것을 선언
---- @Interface
------ 어노테이션을 선언할 때 사용
package annotation.base;
import java.lang.annotation.*;
@Target(ElementType.METHOD) // 메소드에 사용하는 어노테이션임을 명시(두 개 이상 사용 가능)
@Retention(RetentionPolicy.RUNTIME) // 실행 시 어노테이션을 참조한다.
public @Interface MyAnnotation { // @MyAnnotation으로 사용할 수 있다.
public int number(); // 해당 항목에 대한 타입으로 값을 지정할 수 있다.
public String text() default "This is first annotation"; // 기본값을 설정할 수 있다.
} //end MyAnnotation
public class UseAnnorationSample {
@MyAnnotation(number=0)
public static void main(String[] args) {
UseAnnotationSample sample = new UseAnnotationSample();
} //end main()
@MyAnnotation(number=1)
public void annotationSample1() { }
@MyAnnotation(number=2, text="second")
public void annotationSample2() { }
} //end class(UseAnnotationSample)
-- 어노테이션으로 지정한 값 확인하기
Class.Method
---- 자바의 리플렉션_Reflection API에서 제공하는 클래스
---- 메소드의 정보를 확인하는 데에 사용
Method[] methods = Class.getDeclaredMethods();
// 해당 클래스에 선언되어 있는 메소드들의 목록을 배열로 리턴
for(Method method : methods) {
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
// 해당 메소드에 선언되어 있는 매개 변수로 넘겨준 어노테이션 객체를 리턴한다.
if( annotation != null ) {
int number = annotation.number();
String text = annotation.text();
}
}
-- 어노테이션의 용도
// 제약 사항 등을 선언하기 위해
@Deprecated
@Override
@NoNull
// 용도를 나타내기 위해
@Entity
@TestCase
@WebService
// 행위를 나타내기 위해
@Statefull
@Transaction
// 처리를 나타내기 위해
@Column
@XmlElement
-- 어노테이션 이전에는 XML / properties 파일에 지정했다.
-- 어노테이션이 변환된 모습은 컴파일 단계에서 생성되므로 역컴파일하지 않는 이상 직접 확인할 수 없다.
'Java' 카테고리의 다른 글
Java의 신2_Chapter 3_Generic (0) | 2024.04.02 |
---|---|
Java의 신2_Chapter 2_ java.lang 패키지 (0) | 2024.04.02 |
Java의 신_Chapter 16_Nested Class (0) | 2024.03.29 |
Java의 신_Chapter 15_String (0) | 2024.03.29 |
Java의 신_Chapter 14_Exception (0) | 2024.03.28 |