728x90

에너테이션

에너테이션 : 프로그램의 영향을 미치지않으며, 유용한 정보를 제공하는것.

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가 붙은것으로 인식된다. 자식클래스에도 해당 에너테이션이 상속되는것이다.

 

 

 

 

728x90

'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

+ Recent posts