리꾸므

[JAVA] 애너테이션 본문

발걸음/일지

[JAVA] 애너테이션

리꾸므 2022. 11. 14. 16:02

애너테이션

 주석은 소스 코드를 읽는 '사람'에게 정보를 제공하는 반면, 애너테이션은 특정 코드를 사용하는 '프로그램'에게 정보를 전달한다.

  • 컴파일러에게 문법 에러를 체크하도록 정보를 제공한다.
  • 프로그램을 빌드할 때 코드를 자동생성할 수 있도록 정보를 제공한다.
  • 런타임에 특정 기능을 실행하도록 정보를 제공한다.

 

표준 애너테이션 설명 : 자바에서 기본으로 제공하는 애너테이션
@Override - 메서드 앞에만 붙이는 애너테이션
- 상위클래스의 메서드를 오버라이딩하는 메서드라는 것을 컴파일러에게 알려준다.
- 상위클래스에서 @Override가 붙어있는 메서드명과 동일 메서드를 찾을 수 없으면 컴파일 에러 발생
- 오버라이딩 중 코드 오타로 오버라이딩이 안될때 있는데 이러한 경우를 방지하기 위해 사용
@Deprecated - 새로운 버전의 JDK가 소개되어 더이상 사용하지않는 필드나 메서드 경우, 애너테이션이 붙은 대상이 새로운 것으로 대체되었으니 기존의 것을 사용하지 않는 것을 권장하는데 사용
@Functionallnterface - 함수형 인터페이스를 선언할 때 컴파일러가 함수형 인터페시의 선언이 바르게 되었는지 확인
- 코드 작성과정에서 실수를 방지하기 위한 확인용 애너테이션
* 함수형 인터페이스는 단 하나의 추상 메서드만을 가져야하는 제약이 있다.
@SuppressWarning - 컴파일 경고 메시지가 나타나지않도록 한다.
- 뒤에 괄호를 붙이고 그 안에 억제하고자하는 경고 메시지 지정 가능(ex:SuppressWarning("all"))
 - all : 모든 경고를 억제
 - deprecation : Deprecated 메서드 사용한 경우 나오는 경고 억제
 - fallthrough : switch문에서 break 구문이 없을 떄 경고 억제
 - finally : finally 관련 경고 억제
 - null : null 관련 경고 억제
 - unchecked : 검증되지 않은 연산자 관련 경고 억제
 - unused : 사용하지 않는 코드 관련 경고 억제
*둘이상의 경고를 한번에 묵인가능(ex:SuppressWarning("deprecation","unused"))
메타 애너테이션 설명 : 애너테이션에 붙이는 애너테이션, 애너테이션을 정의하는데 사용
@Target - 애너테이션을 정의할 때 적용 대상을 지정하는데 사용한다.
- 뒤에 괄호를 붙이고 적용하고자하는 대상 지정 가능(ex:@Target({FIELD, TYPE_USE})
 - ANNOTATION_TYPE : 애너테이션
 - CONSTRUCTOR : 생성자
 - FIELD : 필드(멤버변수, 열거형 상수)
 - LOCAL_VARIABLE : 지역변수
 - METHOD : 메서드
 - PACKAGE : 패키지
 - PARAMETER : 매개변수
 - TYPE : 타입(클래스, 인터페이스, 열거형)
 - TYPE_PARAMETER : 타입 매개변수
 - TYPE_USE : 타입이 사용되는 모든 대상
@Documented - 애너테이션 정보를 javadoc으로 작성된 문서에 포함시킨다.
- 자바에서 제공하는 표준, 메타 애너테이션 중 @Override, @SuppressWarninge를 제외하고 모두 적용되어 있다.
@Inherited - 하위클래스가 애너테이션을 상속받도록 한다.
- 하위 클래스에 붙이면 하위클래스도 상위클래스에 붙은 애너테이션들이 동일하게 적용된다.
@Retention - 특정 애너테이션이 유지되는 기간을 정하는데 사용한다.
- 유지정책 종류는 세가지이다.
 - SOURCE : 소스 파일에 존재, 클래스파일에는 존재하지 않음
 - CLASS : 클래스 파일에 존재, 실행시에 사용불가, 기본값
 - RUNTIME : 클래스 파일에 존재, 실행시에 사용가능
@Repeatable  - 애너테이션을 여러번 붙일 수 있도록 허용

사용자 정의 애네테이션 : 사용자가 직접 애너테이션을 정의해서 사용하는 것

@interface 애너테이션명 { // 인터페이스 앞에 @기호만 붙이면 애너테이션을 정의할 수 있습니다. 
	타입 요소명(); // 애너테이션 요소를 선언
}

*애너테이션은 java.lang.annotation 인터페이스를 상속받기 때문에 다른 클래스나 인터페이스를 상속받을 수 없다.

 

'발걸음 > 일지' 카테고리의 다른 글

[JAVA]Thread  (0) 2022.11.15
[JAVA] Stream(feat. Optional<T>)  (0) 2022.11.14
[JAVA]컬렉션 프레임워크  (0) 2022.11.10
[JAVA] Exception Handing(feat. try - catch)  (0) 2022.11.10
[JAVA] Generic  (0) 2022.11.10