똑같은 삽질은 2번 하지 말자

Java @ Annotation 애노테이션 이해 본문

Java

Java @ Annotation 애노테이션 이해

곽빵 2020. 11. 7. 19:08

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: 어디에 사용할 수 있는가?

 

 

Comments