본문 바로가기

Java

Java 애너테이션(annotation)이란?

 

- 애너테이션(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