[Java] 애너테이션

최우형·2023년 3월 8일
1

Java

목록 보기
14/24

📌애너테이션

소스 코드가 컴파일되거나 실행될 때에 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해주는 문법 요소

public interface ExampleInterface {
	void example();
}

public class ExampleClass implements ExampleInterface {
    @Override
    public void example() {

    }
}

여기서 @override가 바로 애너테이션이다.

주로 컴파일러에게 알려주는 역할을 한다.

애너테이션의 종류에는 크게 2가지가 있다

  • 표준 애너테이션
  • 메타 애너테이션

애너테이션을 사용자가 직접 정의해서 사용할 수 있는데 이것을 사용자 정의 애너테이션이라고 한다.


표준 에너테이션

@Override : 선언한 메서드가 상위 클래스의 메서드를 오버라이딩하거나, 추상 메서드를 구현하는 메서드라는 것을 컴파일러에게 알려주는 역할을 한다.

@Deprecated : 기존의 사용한 기술이 다른 기술로 대체되어 기존 기술을 적용한 코드를 더 이상 사용하지 않도록 유도하는 경우에 사용한다.

@SuppressWarnings : 컴파일 경고 메시지가 나타나지 않게 해준다. 경우에 따라서 경고가 충분히 예상됨에도 묵인해야할 때 주로 사용한다.

@FunctionalInterface : 함수형 인터페이스를 선언할 때, 컴파일러가 함수형 인터페이스의 선언이 올바르게 선언되었는지 확인하도록 한다. 만약 바르게 선언되지 않았다면, 에러를 발생시킨다.


메타 애너테이션

@Target : 애너테이션을 적용할 '대상' 을 지정하는 데 사용한다.

대상타입적용범위
ANNOTATION_TYPE애너테이션
CONSTRUCTOR생성자
FIELD필드(멤버변수, 열거형 상수)
LOCAL_VARIABLE지역변수
METHOD메서드
PACKAGE패키지
PARAMETER매개변수
TYPE타입(클래스, 인터페이스, 열거형)
TYPE_PARAMETER타입 매개변수
TYPE_USE타입이 사용되는 모든 대상
//예제

import static java.lang.annotation.ElementType.*; 
//import문을 이용하여 ElementType.TYPE 대신 TYPE과 같이 간단히 작성할 수 있습니다.

@Target({FIELD, TYPE, TYPE_USE})	// 적용대상이 FIELD, TYPE
public @interface CustomAnnotation { }	// CustomAnnotation을 정의

@CustomAnnotation	// 적용대상이 TYPE인 경우
class Main {
    
		@CustomAnnotation	// 적용대상이 FIELD인 경우
    int i;
}

@Documented : 애너테이션 정보가 javadoc으로 작성 가능한 문서에 포함되도록 하는 에너테이션 설정이다.

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

@Retention : 애너테이션의 지속시간을 결정하는 데 사용한다.

유지정책설명
SOURCE소스파일에 존재, 클래스 파일에는 존재하지 않음
CLASS클래스 파일에 존재, 실행시에는 사용불가, 기본값
RUNTIME클래스 파일에 존재, 실행시 사용가능

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


사용자 정의 애너태이션

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

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

profile
프로젝트, 오류, CS 공부, 코테 등을 꾸준히 기록하는 저만의 기술 블로그입니다!

0개의 댓글