똑같은 삽질은 2번 하지 말자
Java @ Annotation 애노테이션 이해 본문
Annotation 이란?
근본적인 취급은 주석과 같은데 기능이 달려있는 주석이라고 생각하면 편할 것 같다.
자, 바로 기능 달린 주석을 만들어 보자.
package annotation;
public @interface MyAnnotation {
}
간단하게 만들 수 있다.
그리고 바로 클래스에 달아보자.
import annotation.MyAnnotation;
@MyAnnotation
public class OnlineClass {
private Integer id;
private String title;
private boolean closed;
public OnlineClass(Integer id, String title, boolean closed) {
this.id = id;
this.title = title;
this.closed = closed;
}
}
이렇게 클래스에 달아보고
불러서 출력을 하려고 하면,
여지없이 에러가 뜬다.
조회가 안된다? 왜? 기본적으로 Annotation은 주석이랑 마찬가지 이다.
그래서 기본적으로 클래스까지는 남지만, 바이트 코드를 로딩했을때 메모리상에는 남지않는다.
근데 나는 이 Annotation을 메모리상에 남기고 싶다 하면,
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
그리고 다시 실행해보면
오! 출력이 된다.
이외에 Anntation의 또 다른 기능들을 추가해 보면
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD}) // 타입과 필드에만 붙일 수 있다.
@Inherited // 해당 Annotation을 하위 클래스까지 전달
public @interface MyAnnotation {
String name() default "heewon"; // 기본값 설정
int number(); // 기본값 설정을 안하면 애노테이션을 붙일 때 값을 부여해야한다.
}
-
@Retention: 해당 애노테이션을 언제까지 유지할 것인가? 소스, 클래스, 런타임
-
@Inherit: 해당 애노테이션을 하위 클래스까지 전달할 것인가?
-
@Target: 어디에 사용할 수 있는가?
'Java' 카테고리의 다른 글
Java NullPointException 조심하자 (0) | 2020.11.20 |
---|---|
Java 8 Stream (0) | 2020.10.25 |
Java 8 인터페이스의 변화 (0) | 2020.10.25 |
Java 8 @FunctionalInterface(함수형 인터페이스), 람다 표현식 (0) | 2020.10.18 |
Java Reflection API(리플렉션) (0) | 2020.09.21 |
Comments