Annotation
(Metadata)
클래스나 메서드 등의 선언 시에 @를 붙인다.
자바언어에서 사용하는 어노테이션
@Override
해당 메서드가 부모 클래스의 메서드를 Override 했다는 것을 명시
컴파일러에게 부모클래스로부터 Override를 하였다고 전달하여
문제가 생긴다면 알려주도록 할 수 있다.
@Deprecated
이 클래스나 메서드는 더이상 사용하지 않을 경우를 명시
만약 사용한다면 경고를 받게 된다.
지워버린 메서드나 클래스를 참조하게 되면
힘겹게 만든 프로그램이 변경사항도 모른 채로 컴파일할 때 에러가 날 것이다.
이러한 하위 호환성을 위해 필요한 어노테이션이다.
@SupressWarnings
프로그램에는 문제가 없는데 경고가 날 경우
컴파일러에게 경고해줄 필요 없다고 전달해 준다.
남용하면 좋지 않다.
어노테이션을 선언하기 위한 메타 어노테이션
@Target
어노테이션을 어떤 것에 적용할지를 선언
ex)
@Target(ElementType.METHOD)
요소 타입 | 대상 |
CONSTRUCTOR | 생성자 선언시 |
FIELD | enum 상수를 포함한 필드(field)값 선언시 |
LOCAL_VARIABLE | 지역 변수 선언시 |
METHOD | 메서드 선언시 |
PACKAGE | 패키지 선언시 |
PARAMETER | 매개 변수 선언시 |
TYPE | 클래스, 인터페이서, enum 등 선언시 |
@Retention
얼마나 오래 어노테이션 정보가 유지되는지를 선언
@Retention(RetentionPolicy.RUNTIME)
타입 | 대상 |
SOURCE | 어노테이션 정보가 컴파일시 사라짐 |
CLASS | 클래스 파일에 있는 어노테이션 정보가 컴파일러에 의해서 참조 가능함. 하지만, 가상 머신(Virtual Machine)에서는 사라짐 |
RUNTIME | 실행시 어노테이션 정보가 가상 머신에 의해서 참조 가능 |
@Documented
해당 어노테이션의 정보가 Javadocs(API) 문서에 포함되었다는 것을 선언
@Inherited
모든 자식 클래스에서 부모 클래스의 어노테이션을 사용 가능하다는 것을 선언
@interface
어노테이션을 선언할 때 사용
JAVA 5 이전
JAVA 5 이전까지 모든 자바 애플리케이션의 설정은
XML 또는 properties 파일에서 지정해 주었다.
위와 같은 방법은 설정이 복잡하고 어떻게 쓰이는지 이해하는 것에
많은 시간이 걸린다.
어노테이션이 생기면서 필요한 위치에 관련 설정이 존재하게 되면서
코드 가독성이 매우 좋아졌다.
어노테이션 만들어서 사용해보기
어노테이션 만들어보기
package org.example;
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 TestAnnotation {
public int number();
}
어노테이션으로 연산해 보기
package org.example;
public class TestAnnotationExam {
@TestAnnotation(number = 1)
public static void main(String[] args) throws NoSuchMethodException {
TestAnnotation testAnnotation = TestAnnotationExam
.class.getDeclaredMethod("main", String[].class)
.getAnnotation(TestAnnotation.class);
int num_1 = testAnnotation.number();
int num_2 = testAnnotation.number();
int result = num_1 + num_2;
System.out.println(num_1 + "+" + num_2 + "+" + result);
}
}
getDeclaredMethods()
해당 클래스에 선언되어 있는 메서드들의 목록을 배열로 반환한다.
getAnnotation()
해당 메서드에 선언되어 있는 매개 변수로 넘겨준 어노테이션이 있는지 확인하고,
있을 경우 어노테이션의 객체를 반환한다.
어노테이션에 default가 있을 경우
직접 만든 어노테이션
package org.example;
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 TestAnnotation {
public String text() default "안녕하세요. 반갑습니다!";
}
어노테이션 default로 출력해 보기
package org.example;
public class TestAnnotationExam {
@TestAnnotation
public static void main(String[] args) throws NoSuchMethodException {
TestAnnotation testAnnotation = TestAnnotationExam
.class.getDeclaredMethod("main", String[].class)
.getAnnotation(TestAnnotation.class);
String str = testAnnotation.text();
System.out.println(str);
}
}
@TestAnnotaion에 값을 지정해주지 않으면 default의 값이 출력되는 것을 알 수 있다.
어노테이션에 값을 지정한 경우
package org.example;
public class TestAnnotationExam {
@TestAnnotation(text = "안녕하세용!!")
public static void main(String[] args) throws NoSuchMethodException {
TestAnnotation testAnnotation = TestAnnotationExam
.class.getDeclaredMethod("main", String[].class)
.getAnnotation(TestAnnotation.class);
String str = testAnnotation.text();
System.out.println(str);
}
}
입력한 문자열이 출력된다.
내용 참고 - 자바의 신 -
'자바 탐구' 카테고리의 다른 글
인텔리제이) Entity ERD 확인하기 (0) | 2023.04.27 |
---|---|
자바) 제네릭 (0) | 2023.04.26 |
스프링) HTTP 상태코드 (0) | 2023.04.25 |
스프링) Bean (0) | 2023.04.23 |
스프링) 제어의 역전(Inversion of Control) (0) | 2023.04.23 |