자바의 정석
프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것
주로 컴파일러를위한 것으로 컴파일러에게 유용한 정보를 제공한다. 그리고 새로운 애너테이션을 정의할 때 사용하는 메타 애너테이션을 제공한다.
종류에 대해서 간단히 살펴보자
메서드 위에 붙이는 메서드가 오버라이딩 한다는 것을 컴파일러에게 알려주는 애노테이션
@Override
void parentmethod() { }
다른 것으로 대체되었으니 더 이상 사용하지 마시오!
함수형 인터페이스를 선언할 때 사용함
@FunctionalInaterface
public interface Runnable {
public abstract void run();
}
컴파일러가 주는 경고를 나타나지 않게 함
@SuppressWarnings("unchecked")
ArrayList<NewClass> list = new ArrayList();
## 복수개 사용할때
@SuppressWarnings({"deprecation","varargs"});
애너테이션을 정의 할때 사용하는 애너테이션
그럼 이 메타 애너테이션에는 어떤 것이 있을까?
애너테이션을 어디에 적용할 것인가?
다음과 같이 사용할 있다. 여기서 이 어노테이션은 타겟으로 타입과 필드를 지정해주었다.
@Target({Type, FIELD})
public @interface SuppressWarnings {
String [] value();
}
적용할 수 있는 대상은 다음과 같다.
대상 | 의미 |
---|---|
ANNOTATION_TYPE | 애너테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드( 멤버 변수, enum 상수) |
LOCAL_VARIABLE | 지역 변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입(클래스, 인터페이스, enum) |
TYPE_PARAMETER | 타입 매개변수 |
TYPE_USE | 타입이 사용되는 모든 곳 |
애너테이션이 유지 되는 기간 설정
@Target(ElementsType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {}
SOURCE
는 소스 파일에서만 존재, 클래스 파일에서는 존재하지 않음
CLASS
는 클래스 파일에 존재. 실행시에 사용 불가인 기본값
RUNTIME
은 클래스 파일에 존재. 실행시에 사용가능
애너테이션이 자손 클래스에게 상속되도록 함
@Inherited
@Interface SupperAnno {}
@SuperAnno ## 상속되서 자손에게도 적용
class Parent {}
class Child extends Parent {}
여러번 붙이기 가능
@Repeatable(ToDos.class)
@interface ToDO {
String value();
}
상수 필드에 붙이는 애너테이션
TODO : annation 만들어보기