유지 정책과 대상 유형
SOURCE, CLASS, RUNTIME 유지 정책 중 하나를 선택하고 @Target으로 대상 요소를 제한합니다.
유지 정책과 대상 유형은(는) CoddyKit의 무료 Java Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Java Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
세 가지 보존 정책
SOURCE: 컴파일러가 삭제합니다(APT에만 유용함). CLASS: .class 파일에 기록되지만 런타임에는 사용할 수 없습니다. RUNTIME: 리플렉션으로 사용할 수 있습니다. 대부분의 프레임워크 애너테이션은 RUNTIME을 사용합니다.
SOURCE 보존: 컴파일 시점에만 사용
SOURCE 애너테이션은 애너테이션 프로세서가 처리한 후 삭제됩니다. @Override와 @SuppressWarnings는 SOURCE이므로 컴파일러에 정보를 제공하지만 .class 파일에는 포함되지 않습니다.
@Retention(RetentionPolicy.SOURCE)
public @interface GenerateBuilder {}
// APT generates a Builder class when it sees @GenerateBuilder
// The annotation itself disappears from the compiled outputCLASS 보존: 바이트코드 분석
CLASS 애너테이션은 바이트코드 분석 도구(PMD, FindBugs, ASM)를 위해 .class 파일에 포함되지만, 리플렉션을 통해 런타임에 읽을 수는 NOT 없습니다.
@Retention(RetentionPolicy.CLASS)
public @interface ThreadSafe {}
// Visible in bytecode, invisible to Class.getAnnotation() at runtimeRUNTIME 보존: 리플렉션을 통한 처리
RUNTIME 애너테이션은 런타임까지 유지되며 getAnnotation()으로 읽을 수 있습니다. Spring, JUnit, Jackson, Hibernate는 RUNTIME 보존을 사용합니다.
@Retention(RetentionPolicy.RUNTIME)
public @interface Route {
String path();
String method() default "GET";
}
// At runtime:
Route r = handler.getClass().getMethod("handle").getAnnotation(Route.class);
System.out.println(r.path()); // e.g. "/users"@Target: 적용 위치 제한
@Target은 ElementType 상수를 사용하여 애너테이션이 나타날 수 있는 위치를 제한합니다. 허용되지 않은 요소에 적용하면 컴파일 시점에 오류가 발생합니다.
import static java.lang.annotation.ElementType.*;
@Target({METHOD, CONSTRUCTOR})
@Retention(RetentionPolicy.RUNTIME)
public @interface Measured {}모든 ElementType 값
전체 목록: TYPE (class/interface/enum), FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE, ANNOTATION_TYPE, PACKAGE, TYPE_PARAMETER (제네릭 유형 매개변수), TYPE_USE (모든 유형 사용)입니다.
// TYPE_USE: annotate any type reference
@NotNull String name;
List<@NonNull String> items;
public @Valid User createUser(@NotNull String name) { ... }TYPE과 TYPE_USE 비교
TYPE은 class/interface/enum 선언을 대상으로 합니다. TYPE_USE(Java 8 이상)는 제네릭, 형변환, extends 절을 비롯한 유형의 모든 사용을 대상으로 하므로 유형 수준의 null 안전성 애너테이션을 사용할 수 있습니다.
@Target(ElementType.TYPE_USE)
@interface NonNull {}
// Can be applied to:
List<@NonNull String> list;
@NonNull String result = (@NonNull String) obj;Target과 Retention 조합하기
대부분의 유용한 프레임워크 애너테이션은 RUNTIME 보존과 특정 대상을 함께 사용합니다. 예를 들어 필드에만 적용되는 검증 애너테이션이 있습니다.
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Range {
int min() default 0;
int max() default Integer.MAX_VALUE;
}@Inherited로 애너테이션 상속하기
@Inherited는 클래스 수준 애너테이션이 하위 클래스에 상속되도록 하는 메타 애너테이션입니다. 메서드 또는 필드 애너테이션에는 영향을 주지 않습니다.
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface Framework {}
@Framework class Base {}
class Child extends Base {} // @Framework visible on Child too@Documented: Javadoc에 포함하기
애너테이션이 적용된 요소의 생성된 Javadoc에 애너테이션이 표시되도록 @Documented를 적용합니다. 이를 적용하지 않으면 API 문서에서 애너테이션이 보이지 않습니다.
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Auditable {
String description() default "";
}런타임에 보존 정보 읽기
애너테이션 클래스 객체에서 getAnnotation(Retention.class)을 사용하여 애너테이션 유형 자체의 보존 정보를 확인할 수 있습니다.
Retention r = Retry.class.getAnnotation(Retention.class);
System.out.println(r.value()); // RUNTIME, CLASS, or SOURCE빠른 확인
클래스, 인터페이스, enum 선언을 대상으로 하는 ElementType은 무엇인가요?
정리
컴파일 시점 도구에는 SOURCE를, 바이트코드 분석에는 CLASS를, 리플렉션 기반 프레임워크에는 RUNTIME을 사용합니다. 잘못된 사용을 방지하려면 @Target으로 범위를 제한합니다. API 애너테이션에는 @Documented를 추가하고, 클래스 계층 구조 애너테이션에는 @Inherited를 추가합니다.
AI 튜터와 함께 Java을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 104
- 레슨
- 374
자주 묻는 질문
“유지 정책과 대상 유형” 강의는 무료인가요?
네 — “유지 정책과 대상 유형” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Java Academy 강의 전체를 잠금 해제할 수 있습니다. Java Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“유지 정책과 대상 유형”에서 뭘 배우나요?
SOURCE, CLASS, RUNTIME 유지 정책 중 하나를 선택하고 @Target으로 대상 요소를 제한합니다. 브라우저에서 직접 실행하는 실습 코드로 Java Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Java Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Java Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“유지 정책과 대상 유형” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Java Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Java Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 주석 정의: 요소와 기본값
- 유지 정책과 대상 유형
- 런타임 주석 처리
- 컴파일 시점 주석 처리기