애너테이션 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뿐..........
'diary > codestates (be39)' 카테고리의 다른 글
05/19-20/22 스트림 Stream 기본 개념 (0) | 2022.05.23 |
---|---|
05/19-20/22 람다식 Lambda (0) | 2022.05.22 |
05/19/22 열거 타입 Enum (0) | 2022.05.20 |
05/17~18/22 제네릭과 컬렉션 프레임워크 공부 중 ㅠㅠ (0) | 2022.05.20 |
05/16/22 (복습) 데일리 회고 (0) | 2022.05.17 |