Recent Posts
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 달인막창
- Spring Batch
- pytest
- RouteLocator
- 코루틴 빌더
- table not found
- 개성국밥
- addhooks
- tolerated
- PersistenceContext
- Value too long for column
- terminal
- gitflow-shFlags
- 깡돼후
- 겨울 부산
- ErrorResponse
- JanusWebRTCServer
- JanusGateway
- vfr video
- taint
- JanusWebRTC
- VARCHAR (1)
- mp4fpsmod
- python
- 코루틴 컨텍스트
- preemption #
- kotlin
- 자원부족
- JanusWebRTCGateway
- PytestPluginManager
Archives
너와 나의 스토리
[Java] 어노테이션(Annotation) 만들고 적용하는 방법 본문
반응형
어노테이션(Annotation)이란?
- 어노테이션은 메타데이터(metadata)라고 볼 수 있다.
- 메타데이터: 애플리케이션이 처리해야 할 데이터가 아니라, 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지를 알려주는 정보.
- 어노테이션의 세 가지 용도
- 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공
- 예: @Override
- 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성할 수 있도록 정보를 제공
- 실행 시(런타임 시) 특정 기능을 실행하도록 정보를 제공
- 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공
어노테이션을 정의하고 적용해보기
- 정의:
- @interface를 사용해서 정의
public @interface AnnotationName {
}
- 이렇게 정의한 어노테이션은 다른 곳에서 '@AnnotationName' 형태로 사용할 수 있다.
- 어노테이션은 element를 멤버로 가질 수 있다.
- element 이름 뒤에 '()'를 붙여줘야 한다.
- default 명령어를 이용해 값을 초기화해줄 수 있다.
public @interface AnnotationName {
String elementName1();
int elementName2() default 5;
}
- 위에서 정의한 AnnotationName적용하는 방법
- @AnnotationName(elementName1="값", elementName2=3);
- @AnnotationName(elementName1="값");
- elementName1은 디폴트 값이 없기 때문에 반드시 값을 기술해야 하고, elementName2는 디폴트 값이 있기 때문에 생략할 수 있다.
- 어노테이션의 기본 element: value
public @interface AnnotationName {
String value();
int elementName() default 5;
}
- value element를 가지는 어노테이션은 코드에서 적용할 때 다음과 같이 값만 기술할 수 있다.
- @AnnotationName("값");
- 하지만 다른 element도 같이 사용하는 경우에는 이름을 정의해줘야 한다.
- @AnnotationName(value="값', elementName=3);
어노테이션 적용 대상
- 어노테이션을 적용할 대상을 지정할 수 있다.
- 'java.lang.annotation.ElementType'으로 설정
ElementType | 적용 대상 |
TYPE | Class, Interface, Enum |
ANNOTATION_TYPE | Annotation |
FIELD | Field |
CONSTRUCTOR | Constructor |
METHOD | Method |
LOCAL_VARIABLE | Local variable |
PACKAGE | Package |
- @Target 어노테이션을 사용해 정의한 어노테이션이 적용될 대상을 지정할 수 있다.
- 예:
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface AnnotationName {
String value();
int elementName() default 5;
}
@AnnotationName // 적용 가능 (TYPE)
public class ClassName{
@AnnotationName // 적용 가능 (FIELD)
private String fieldName;
@AnnotationName // 적용 불가
public ClassName() {}
@AnnotationName // 적용 가능 (METHOD)
public void methodName() {}
}
어노테이션 유지 정책
- 어노테이션을 어느 범위까지 유지할 것인지 지정해야 한다.
- 소스상에서만 유지할 것인가? 컴파일된 클래스까지 유지할 것인가? 런타임 시에도 유지할 것인가?
- 'java.lang.annotation.RetentionPolicy'으로 설정
RetentionPolicy | 설명 |
SOURCE | 소스상에서만 유지. 소스 코드를 분석할 때만 의미가 있다. |
CLASS | 바이트 코드 파일까지 유지. 리플렉션 이용해서 어노테이션 정보 얻을 수 없다. |
RUNTIME | 바이트 코드 파일까지 유지하면서 리플랙션을 이용해서 런타임 시에 어노테이션 정보 얻을 수 있다. |
- 리플렉션(Reflection): 런타임 시에 클래스의 메타 정보를 얻는 기능
- 예를 들어, 클래스가 가지고 있는 필드가 무엇인지, 적용된 어노테이션은 무엇인지 알아내는 것.
- 보통 어노테이션은 런타임 시점에서 사용하기 위해 만든다.
- 사용 방법: @Retention 어노테이션 이용
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationName {
String value();
int elementName() default 5;
}
출처:
- [이것이 자바다]
반응형
'Programming Language > Java' 카테고리의 다른 글
[Java] static vs final vs static final (0) | 2021.04.16 |
---|---|
[Java] 추상 클래스 / 인터페이스 (2) | 2021.04.13 |
[Java] 싱글톤(Singleton)을 만들자! (0) | 2021.04.07 |
[Java] Static field의 복잡한 초기화 작업을 위한 정적 블록(Static block) (0) | 2021.04.07 |
[Java 기초부터 다시] 4. 데이터 - 참조 타입/JVM/Enum (0) | 2021.04.07 |
Comments