- 애너테이션(annotation): 주석, 주해, 메모의 뜻이 있음
- 주석처럼 프로그래밍 언어에 영향을 미치지 않으며, 유용한 정보 제공
1. 표준 애너테이션
- JDK에서 제공하는 애너테이션은 Java.lang.annotation 패키지에 포함되어 있음
애너테이션 | 설명 |
@Overrid | - 컴파일러에게 메서드를 오버라이딩하는 것이라고 알림 |
@Deprecated | - 앞으로 사용하지 않을 것을 권장하는 대상에 붙임 |
@SuppressWarnings | - 컴파일러의 특정 경고 메시지가 나타나지 않게함 |
@SafeVarargs | - 지네릭스 타입의 가변인자에 사용(JDK1.7) |
@FuctionalInterface | - 함수형 인터페이스라는 것을 알림(JDK1.8) |
@Native | - native 메서드에서 참조되는 상수 앞에 붙임(JDK1.8) |
@Target* | - 애너테이션이 적용 가능한 대상을 지정하는데 사용 |
@Documented* | - 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 함 |
@Ingerited* | - 애너테이션이 자손 클래스에 상속되도록 함 |
@Retention* | - 애너테이션이 유지되는 범위를 지정 |
@Repeatable* | - 애너테이션을 반복해서 적용할 수 있게 함(JDK1.8) |
*붙은 건 메타 애너테이션: 애너테이션에 붙이는 애너테이션
2. 애너테이션 만들기
1) 애너테이션 정의하기
@interface 애너테이션명 {
타입 요소명(); // 애너테이션의 요소 선언
// ...
}
2) 애너테이션의 요소(element)
- 반환값이 있고 매개변수는 없는 추상 메서드의 형태
- 상속을 통해 구현하지 않아도 됨
@interface TestAnno {
int count() default 1; // 기본값 지정 가능(기본값은 null을 제외한 모든 리터럴 가능)
String testedBy();
String[] testTools();
TestType testType();
DateTime testDate(); // 자신이 아닌 다른 애너테이션(@DateTime) 포함 가능
}
enum TestType {First, FINAL}
- 애너테이션 요소 선언 규칙
- 요소 타입은 기본형, String, enum, 애너테이션, Class만 허용 - ()안에 매개변수 선언 불가 - 예외 선언 불가 - 요소를 타입 매개변수로 정의 불가 |
3) 애너테이션의 적용
- 요소들의 값을 빠짐없이 지정해야함
- 순서는 상관 없음
@TestAnno (
count=3, // default 1이므로 지정하지 않는 경우는 count=1
testedBy="sky",
testTools={"JUnit", "AutoTester"}, // 요소의 타입이 배열인 경우 괄호'{}'를 사용하여 여러개의 값 지정
// testTools="JUnit", // 값이 하나인 경우 괄호'{}' 생략 가능
// testTools={}, // 값이 없는 경우 괄호'{}' 필수
testType=TestType.FINAL,
testDate=@DateTime(yymmdd="230116", hhmmss="222828"); // 다른 애너테이션(@DateTime) 사용 가능
)
public class NewClass {
//...
}
3. 모든 애너테이션의 조상, Annotation 인터페이스
- Annotation은 애너테이션이 아닌 일반적인 인터페이스
public interface Annotation {
int hashCode();
String toString();
Class<? extends Annotation> annotationType();
}
- 애너테이션은 상속이 허용되지 않으므로 명시적으로 Annotation을 조상으로 지정 불가
@interface TestAnno extends Annotation { // Error. 허용되지 않는 표현
//...
}
4. 마커 애너테이션
- 요소가 하나도 정의되지 않은 애너테이션
- Serializable, Coneable, Overrid 등의 마커 애너테이션을 예로 들 수 있음
'Java' 카테고리의 다른 글
Java 람다(Lambda) (0) | 2023.01.17 |
---|---|
Java 스레드(thread) (0) | 2023.01.17 |
Java 열거형(enum) (0) | 2023.01.17 |
[Java] 제네릭(Generics) (0) | 2023.01.10 |
Java Collections 클래스 (0) | 2023.01.09 |