에너테이션
에너테이션 : 프로그램의 영향을 미치지않으며, 유용한 정보를 제공하는것.
JDK에서 제공하는 표준 에너테이션은 주로 컴파일러에게 유용한 정보를 제공하며, 새로운 에너테이션을 정의할때 사용할 수 있는 메타 에너테이션을 제공한다.
에너테이션 목록
표준 에너테이션
@Override : 컴파일러에게 오버라이딩 메서드라는 것을 알린다.
@Deprecated : 앞으로 사용하지 않을것을 권장하는 대상에 사용한다.
@SuppressWarnings : 컴파일러에 지정한 경고메시지가 나타나지않게해준다.
@SafeVarargs : 지네릭스 타입의 가변인자에 사용한다.
@FunctionalInterface : 함수형 인터페이스라는 것을 알릴때 사용한다.
@Native : native 메서드에서 참조되는 상수 앞에 사용한다.
메타에너테이션
@Target : 에너테이션이 적용가능한 대상을 지정할때 사용한다.
@Documented : 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다.
@Inherited : 에너테이션이 자손클래스에도 상속되도록 할때 사용하낟.
@Retention : 에너테이션이 유지되는 범위를 지정하는데 사용한다.
@Repeatable : 애너테이션이 반복해서 적용될 수 있도록 할 때 사용한다.
표준 에너테이션
@Override
메서드 앞에만 붙일 수 있으며, 조상의 메서드를 오버라이딩 한 메서드라는 것을 컴파일러에게 알려준다.
필수는 아니지만 사용할경우 실수를 줄일 수 있다.
오버라이딩하는 메서드의 이름을 잘못적는 경우를 방지해준다.
@Deprecated
JDK버전에 따라 기존의 기능을 대체하는것들이 나오기도한다. 이미 여러 곳에서 사용되고 있는 기능이라면 함부로 교체할 수 없기 때문에 더이상 사용을 권장하지 않는것을 알리는 @Deprecated가 생겼다.
추가적인 사용을 권장하지 않는 필드나 메서드에 @Deprecated를 사용한다.
@Deprecated가 되어있을 경우 IntelliJ에서 줄이 쳐져있다.
@FunctionalInterface
함수형 인터페이스(functional interface)를 선언할 때, @FunctionalInterface를 붙이면 컴파일러가 '함수형 인터페이스'를 올바르게 선언했는지 확인하고 잘못 선언되었는 경우 에러를 발생시킨다. 필수 에너테이션은 아니며, 사용시 오류를 줄일 수 있다.
ex)
@FunctionalInterface
public interface Runnalbe{
public abstract void run();
}
함수형 인터페이스는 추상메서드가 하나만 있어야 한다.
@SuppressWarnings
컴파일러가 출력해주는 경고메세지가 출력되지않도록 억제해준다.
@SuppressWarnings가 억제할 수 있는 메시지 종류는 여러가지가 있다 그중 'deprecation', 'unchecked', 'rawtypes', 'varargs' 가 주로 억제하는 메세지로 사용된다.
'deprecation'은 @Deprecated가 붙은 대상에 대한 경고를, 'unchecked'는 지네릭스 타입을 지정하지 않았을경우 발생하는 경고를, 'rawtypes'는 지네릭스를 사용하지 않아서 발생하는 경고를, 'varargs'는 가변인자의 타입이 지네릭 타입일 때 발생하는 경고를 억제할 때 각각 사용된다.
main메서드 앞에 붙임으로써 main메서드 내부에서 발생하는 deprecation과 관련된 모든 경고를 억제한다.
ArrayList객체를 생성하는곳 바로앞에 @SuppressWarnings("unchecked")를 작성함으로써 타입에 따른 경고를 억제한다.
메타 애너테이션
메타 에너테이션은 에너테이션을 위한 에너테이션이다. 에너테이션의 적용대상(target) 또는 유지기간(retention)등을 지정하는데 사용한다.
@Target
에너테이션이 적용가능한 대상을 지정하는데 사용된다.
ex)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnins{
String[] value();
}
@SupressWarnings를 정의한 것이다.
@Target으로 지정할 수 있는 애너테이션 적용 종류
ANNOTATION_TYPE : 애너테이션
CONSTRUCTOR : 생성자
FIELD : 필드
LOCAL_VARIABLE : 지역변수
METHOD : 메서드
PACKAGE : 패키지
PARAMETER : 매개변수
TYPE : 타입(클래스, 인터페이스, enum)
TYPE_PARAMETER : 타입 매개변수
TYPE_USE : 타입이 사용되는 모든곳
위처럼 에너테이션을 정의할때 에너테이션의 적용 대상을 지정할 수 있다.
@Retention
에너테이션이 유지(retention)되는 기간을 지정하는데 사용된다.
에너테이션의 유지 정책의 종류
SOURCE : 소스 파일에만 존재. 클래스 파일에는 존재하지 않는다.
CLASS : 클래스 파일에 존재. 실행시 사용불가
RUNTIME : 클래스 파일에 존재. 실행시 사용가능
@Override나 @SuppressWarnings 같이 컴파일러가 사용하는 애너테이션은 유지 정책이 'SOURCE'이다.
ex)
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override{}
@FunctionalInterface의 경우 실행시에도 사용되기 때문에 유지 정책이 'RUNTIME'으로 되어있다.
ex)
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface{}
@Documented
에너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 한다. 자바에서 제공하는 기본 에너테이션 중 @Override, @SuppressWarnings를 제외하고는 모두 이 메타 에너테이션이 붙어 있다.
@Inherited
에너테이션이 자손 클래스에 상속되도록 한다. @Inherited가 붙은 에너테이션을 조상 클래스에 붙이면 자손클래스도 이 에너테이션이 적용된다.
ex)
@Inherited
@interface SupperAnno{}
@SuperAnno
class Parent{ }
class Child extends Parent{ }
위와 같은경우 Child에도 @SupperAnno가 붙은것으로 인식된다. 자식클래스에도 해당 에너테이션이 상속되는것이다.
'Programming > JAVA' 카테고리의 다른 글
쓰레드 우선순위와 쓰레드 그룹 (0) | 2021.08.13 |
---|---|
쓰레드(Thread) (0) | 2021.08.13 |
열거형(Enums) (0) | 2021.08.10 |
지네릭스(Generics) (0) | 2021.08.07 |
Collection 정리 (0) | 2021.08.07 |