애너테이션에 대해

SionBackEnd·2022년 7월 16일
0

자바 스터디

목록 보기
12/21
post-thumbnail

애너테이션은 주석처럼 프로그래밍 언어에 영향을 미치지 않고, 유용한 정보를 제공한다.

예시

@Test //이 메소드가 테스트 대상임을 테스트 프로그램에게 말한다.
public void method() {
		...
}

애너테이션 종류

  • 표준애너테이션 -> 자바에서 제공하는 애너테이션이다.
  • 메타애너테이션 -> 애너테이션을 만들때 사용하는 애너테이션이다.

표준애너테이션

@Override

  • 오버라이딩을 올바르게 했는지 컴파일러가 체크해줌
  • 오버라이딩할 때 메소드이름을 잘못적는 실수를 하는 경우가 많음
@Override
void method(){}

@Deprecated

  • 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다. 이전에는 사용하던 메소드를 이제는 더이상 사용하지 않으니 사용하지 말라고 알려주는 것이다.
class Child{
    @Deprecated
    void pre(){
        System.out.println(1);
    }
}

@Functionallnterface

  • 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크해줌
  • 함수형 인터페이스는 하나의 추상메서드만 가져야한다는 제약이 있다.
@FunctionalInterface
public interface Runnable {
	public abstract void run();
}

@SuppressWarnings

  • 컴파일러의 경고메세지가 나타나지 않게 억제한다.
  • 괄호()안에 억제하고자하는 경고의 종류를 문자열로 지정
  • 어떻게 보면 내가 경고를 확인했다의 의미로 @SuppressWarnings을 사용한다.
public class tryja {
    @Deprecated
    public static void main(String[] args) {
        Child c = new Child();
        c.pre();
    }
}
class Child{
    @Deprecated
     void pre(){
        System.out.println(1);
    }

}

메타애너테이션

@Target

애너테이션의 적용 범위는 @Target 애너테이션으로 정할 수 있다. 다음 표의 값들은 열거형으로 ”java.lang.annotation.ElementType”에 정의되어 있다

  • ANNOTATION_TYPE 애너테이션
  • CONSTRUCTOR 생성자
  • FIELD 필드(멤버변수, 열거형 상수)
  • LOCAL_VARIABLE 지역변수
  • METHOD 메서드
  • PACKAGE 패키지
  • PARAMETER 매개변수
  • TYPE 타입(클래스, 인터페이스, 열거형)
  • TYPE_PARAMETER 타입 매개변수
  • TYPE_USE 타입이 사용되는 모든 대상
import java.lang.annotation.*;

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

@Target({FIELD, TYPE, TYPE_USE})	// 적용대상이 FIELD, TYPE
public @interface CustomAnnotation { }	// CustomAnnotation을 정의
//에너테이션 만들고
____________________________________________________________________

//Main클래스에서 사용
@CustomAnnotation	// 적용대상이 TYPE인 경우
class Main {
    @CustomAnnotation	// 적용대상이 FIELD인 경우
    int i;
}

@Retention

애너테이션이 유지(retention)되는 기간을 지정하는데 사용

  • SOURCE 소스 파일에만 존재. 클래스파일에는 존재하지 않음
  • RUNTIME 클래스 파일에 존재. 실행시에 사용가능
//실제 만들어져있는 애너테이션 분석

// 컴파일러에 의해 사용되는 애너테잇션의 유지 정책은 SOURCE이다.
@Target(ElemnetType.METHOD)
@Retention(RetentionPolucy.SOURCE)
public @interface Override {}
________________________________________________________
// 실행시에 사용 가능한 애너테이션의 정책은 RUNTIME이다. 
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FunctionalInterface {}

@Documented

  • javadoc으로 작성한 문서에 포함시키려면 @Documented를 붙인다.
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FuntionalInterface{} 

우리가 자주 사용하진 않을것이다.

@Repeatable

  • 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용

에너테이션 타입 정의 : 에너테이션을 직접 만들 수 있음

@interface [annotation_name] {}
에너테이션의 메서드는 추상 메서드, 에너테이션 적용 시 지정(순서x)

에너테이션 요소 : 적용 시 값지정 안하면 사용가능한 기본값 지정가능, 단일 요소이고 이름이 value이면 요소이름 생략가능
요소 타입이 배열이면 {}사용

모든 에너테이션의 조상 : public interface Annotation

마커 에너테이션(Marker Annotation) : 요소가 하나도 x

에너테이션 요소와 규칙

요소 타입은 기본형, String, enum, 에너테이션, Class만 선언
괄호()안 매개변수 선언x
예외 선언 x
요소를 타입 매개변수로 정의 x

정리

표준 애너테이션을 잘 기억하자

profile
많은 도움 얻어가시길 바랍니다!

0개의 댓글