본문 바로가기

diary/codestates (be39)

05/19/22 애너테이션 Annotation

애너테이션  Annotation

소스 코드에 영향을 미치지 않으면서 프로그램에게 정보를 제공한다

1. 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공한다

2. 프로그램을 빌드할 때 코드를 자동으로 생성할 수 있도록 정보를 제공한다

3. 실행 시(런타임) 특정 기능을 실행하도록 정보를 제공한다

 

***정보를 제공한다는 것에 집중하자


애너테이션의 타입 정의와 적용

@interface AnnotationName {}
//애너테이션 정의

@AnnotationName
//애너테이션 사용

 

 

엘리먼트를 멤버로 가질 수 있다. 엘리먼트는 타입과 이름으로 구성되며, 디폴트 값을 갖는 게 가능하다.

@interface AnnotationName{
    타입 elementName() [default value];
}

 

element type : 기본 타입, 참조 타입(String, 열거 타입, Clas 타입, 배열 타입)

 

e.g.

@interface AnnotationName {
    String elementName1(); //elememt 이름에 ()를 붙여야 한다
    int elementName2() default 7;
}

@AnnotaitonName(elementName1="값", elementName2=4);
@AnnotationName(elementName1="값")
//elementname2는 default 값이 설정되어 있으므로 생략 가능

기본 엘리먼트 value

@interface AnnotationName {
    String value(); //기본 엘리먼트 선언
    int elementName2() default 7;
}

@AnnotationName("값")
//엘리먼트 명 없이 값만 작성할 수 있음
//값=기본 엘리먼트인 value 값으로 자동 설정

@AnnotationName(value="값", elementName=2);
//value 엘리먼트와 다른 엘리먼트의 값을 동시에 주기

 

애너테이션 적용 대상

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

표준 애너테이션

자바에서 기본으로 제공하는 애너테이션

 

@Override

메서드 앞에 붙여 선언한 메서드가 상위 클래스의 메서드를 오버라이딩 하는 메서드라는 것을 알림

오버라이딩 되지 않았다면=상위 클래스에 동일한 이름의 메서드가 없다면 error

 

@Deprecated

더 이상 사용하지 않는 필드나 메서드임을 알림

기존 필드나 메서드를 호환성 문제로 삭제하기는 곤란하지만 사용하는 것을 권장하고 싶지 않을 때 사용

 

@SuppressWarnings

컴파일 경고가 나타나지 않게 함

경고가 발생할 것을 알면서도 묵인해야 할 때 사용

 

사용 e.g.

Annotation  
@SuppressWarnings("all") 모든 경고 억제
@SuppressWarnings("deprecation") Deprecated 메서드를 사용한 경우 나오는 경고 억제
@SuppressWarnings("fallthrough") switch문에서 break문이 없을 때 경고 억제
@SuppressWarnings("finally") finally 관련 경고 억제
@SuppressWarnings("null") null 관련 경고 억제
@SuppressWarnings("uncheched") 검증되지 않은 연산자 관련 경고 억제
@@SuppressWarnings("unused") 사용하지 않는 코드 관련 경고 억제

 

@FunctionalInterface

함수형 인터페이스(추상 메서드를 하나만 가지는 인터페이스)를 올바르게 선언했는지 확인

추상 메서드가 2개 이상인 경우 error


메타 애너테이션

애너테이션에게 붙이는 애너테이션으로 애너테이션을 정의(적용 대상/유지 기간 설정)

 

@Target

애너테이션의 적용 범위를 정한다

 

사용 e.g.

import static java.lang.annotation.ElementType.*;

@Target({TYPE, FIELD, METHOD})
//import한 경우

 

@Documented

애너테이션에 대한 정보를 javadoc 문서에 표기

(표준, 메타 애너테이션에서 @Override, @SuppressWarnings를 제외하고 모두 @Documented가 적용된 상태)

 

@Inherited

하위 클래스가 애너테이션을 상속받도록 함

상위 클래스에 @Inherited  애너테이션 적용시 하위 클래스에도 상위 클래스의 애너테이션이 적용됨

 

@Retention

RetentionPolicy  
SOURCE .java 소스 파일까지 유지, 컴파일 후 class 파일이 되면 사라짐
CLASS .class 파일까지 유지, runtime에서 사라짐
RUNTIME runtime 실행 시까지 유지

 

@Retention(RetetentionPolicy.RUNTIME)

@Repeatable

여러 번 작성할 수 있는 애너테이션 

이해 X


사용자 정의 애너테이션

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

애너테이션을 정의하고, Elememt type과 이름, 필요하다면 default 값을 설정해 생성한다.


🐑

1. @Repeatable

  • 여러 번 작성할 수 있는 애너테이션 (>원래는 여러 번이 안 된단 말임....?)

2. @Documented

  • javadoc.....?

진짜 너무너무너무너무너무너무너무너무너무너무너무 어렵다. 사용 예를 더 찾아보고 이해해야 할 것 같다. 제가 아는 건.......... @Override뿐..........