애너테이션

seongmin·2022년 9월 17일
0

Java

목록 보기
9/30
post-thumbnail

애너테이션

  • 애너테이션은 특정 코드를 사용하는 프로그램 에게 정보를 전달한다.

  • 애너테이션의 주요한 역할

    1. 컴파일러에게 문법 에러를 체크하도록 정보를 제공한다.
    2. 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
    3. 런타임에 특정 기능을 실행하도록 정보를 제공한다.
@Test // 아래 메서드가 테스트 대상임을 테스트 프로그램에게 알리는 애너테이션
public void run() {...생략...}

public void stop() {...생략...}

두 개의 메서드 중 @Test 애너테이션이 붙여진 run() 메서드만 테스트 프로그램에게 테스팅이 필요한 메서드로 전달이 되며, 애너테이션은 해당 테스트를 수행하는 프로그램 외의 다른 프로그램들에게는 아무런 영향을 주지 않는다.

표준 애너테이션

  • 자바에서 기본적으로 제공하는 애너테이션.
표준 애너테이션설명
@Override컴파일러에게 메서드를 오버라이딩하는 것이라고 알림
@Deprecated앞으로 사용하지 않을 대상을 알릴 때 사용
@FunctionalInterface함수형 인터페이스가 부합하는지 확인
@SuppressWarning컴파일러가 경고메세지를 나타내지 않음
  1. @Override는 메서드 앞에만 붙일 수 있는 애너테이션으로, 선언한 메서드가 상위 클래스의 메서드를 오버라이딩하는 메서드라는 것을 컴파일러에게 알려주는 역할을 수행한다.

    오버라이딩을 할 때 아래의 코드처럼 메서드의 이름을 잘못 작성하는 경우 Override 사용하면 에러를 발생시켜 알려줌.

class Super {
	void run() {}
}
class Sub extends Super {
	@Override
	void rnu() {} // 컴파일 에러 발생, 오타가 난 것을 발견할 수 있음.
}
  1. 기존 메서드를 하위 버전 호환성 문제로 삭제하기 곤란해 남겨두어야만 하지만 더 이상 사용하는 것을 권장하지 않을 때 @Deprecated 를 사용한다.
class OldClass {
	@Deprecated
	int oldField;

	@Deprecated
	int getOldField() { return oldField; };
}
  1. @SuppressWarnings 애너테이션은 컴파일 경고 메시지가 나타나지 않도록 한다.
애너테이션설명
@SuppressWarings(”all”)모든 경고를 억제
@SuppressWarings(”deprecation”)Deprecated 메서드를 사용한 경우 나오는 경고 억제
@SuppressWarings(”fallthrough”)switch문에서 break 구문이 없을 때 경고 억제
@SuppressWarings(”finally”)finally 관련 경고 억제
@SuppressWarings(”null”)null 관련 경고 억제
@SuppressWarings(”unchecked”)검증되지 않은 연산자 관련 경고 억제
@SuppressWarings(”unused”)사용하지 않는 코드 관련 경고 억제
  • 아래와 같은 코드 작성으로 둘 이상의 경고의 억제도 가능하다.
@SuppressWarnings({"deprecation", "unused", "null"})
  1. @FunctionalInterface 애너테이션은 함수형 인터페이스를 선언할 때, 컴파일러가 함수형 인터페이스의 선언이 바르게 선언되었는 지 확인하도록 한다. 참고로, 함수형 인터페이스는 단 하나의 추상 메서드만을 가져야하는 제약이 있다.
@FunctionalInterface
public interface Runnable {
	public abstract void run (); // 하나의 추상 메서드
}

@FunctionalInterface 애너테이션을 붙이지 않아도 함수형 인터페이스를 선언할 수는 있지만 코드 작성과정에서 실수를 방지하기 위한 확인용 애너테이션이다.

메타 애너테이션

  • 애너테이션에 붙이는 애너테이션으로, 애너테이션을 정의하는 데에 사용된다.
메타 애너테이션설명
@Target애너테이션을 정의할 때 적용 대상을 지정하는데 사용한다.
@Documented애너테이션 정보를 javadoc으로 작성된 문서에 포함시킨다.
@Inherited애너테이션이 하위 클래스에 상속되도록 한다.
@Retention애너테이션이 유지되는 기간을 정하는데 사용한다.
@Repeatable애너테이션을 반복해서 적용할 수 있게 한다.
  1. @Target 애너테이션은 이름 그대로 애너테이션을 적용할 “대상"을 지정하는 데 사용한다.
    아래의 내용은 java.lang.annotation.ElementType 이라는 열거형에 정의되어 있다.
대상 타입적용범위
ANNOTATION_TYPE애너테이션
CONSTRUCTOR생성자
FIELD필드(멤버변수, 열거형 상수)
LOCAL_VARIABLE지역변수
METHOD메서드
PACKAGE패키지
PARAMETER매개변수
TYPE타입(클래스, 인터페이스, 열거형)
TYPE_PARAMETER타입 매개변수
TYPE_USE타입이 사용되는 모든 대상
  • 다음과 같이 작성한다.
@Target({FIELD, TYPE, TYPE_USE})	// 적용대상이 FIELD, TYPE
  1. @Documented 애너테이션은 애너테이션에 대한 정보가 javadoc으로 작성한 문서에 포함되도록 하는 애너테이션 설정이다. 자바에서 제공하는 표준 애너테이션과 메타 애너테이션 중 @Override@SuppressWarnings 를 제외하고는 모두 @Documented 가 적용되어 있다.

  2. @Inherited 애너테이션은 하위 클래스가 애너테이션을 상속받도록 한다. @Interited 애너테이션을 상위 클래스에 붙이면, 하위 클래스도 상위 클래스에 붙은 애너테이션들이 동일하게 적용된다.

@Inherited // @SuperAnnotation이 하위 클래스까지 적용
@interface SuperAnnotation{ }

@SuperAnnotation
class Super { }

class Sub extends Super{ } // Sub에 애너테이션이 붙은 것으로 인식
  1. @Retention 애너테이션도 이름 그래도 특정 애너테이션의 지속 시간을 결정하는 데 사용한다.
유지 정책설명
SOURCE소스 파일에 존재, 클래스파일에는 존재하지 않음
CLASS클래스 파일에 존재, 실행시에 사용 불가, 기본값
RUNTIME클래스 파일에 존재, 실행시에 사용 가능

5, @Repeatable 애너테이션을 여러 번 붙일 수 있도록 허용한다는 의미를 가지고 있다.

@interface Works {  // 여러개의 ToDo애너테이션을 담을 컨테이너 애너테이션 ToDos
    Work[] value(); 
}

@Repeatable(Works.class) // 컨테이너 애너테이션 지정 
@interface Work {
	String value();
}
  • @Repetable 애너테이션을 사용하여 이것을 여러번 사용할 수 있도록 함.
@Work("코드 업데이트")  
@Work("메서드 오버라이딩")  
class Main{  
	... 생략 ...
}

사용자 정의 애너테이션

  • 사용자가 직접 정의하는 애너테이션으로 다음과 같이 정의한다.
@interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있습니다. 
	타입 요소명(); // 애너테이션 요소를 선언
}
  • 애너테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속 받을 수 없다.

0개의 댓글