티스토리 뷰
예전에 안드로이드 프로그래밍을 할 때도, @Override와 같은 어노테이션을 많이 쓰기는 했지만,
단순히 오버라이드한 메소드를 체크하도록 하는 표시 정도로만 알고 지나갔었다.
그러나 Spring 프로젝트를 다루다 보면 이보다 훨씬 더 많은 어노테이션을 쓰고, 형태도 좀 더 많아져
제대로 알아볼 필요를 느꼈다.
어노테이션이란?
어노테이션(Annotation)은, 어플리케이션이 처리해야 할 데이터가 아닌 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할지 알려주는 정보이다. 이런 점에서, 어노테이션은 메타데이터(Metadata)라고 할 수 있다.
어노테이션은 다음 세 가지 용도로 사용된다.
- 컴파일러에게 코드 문법 에러를 체크하도록 정보를 제공
- Framework 또는 Library가 빌드 시 코드를 자동으로 생성할 수 있도록 정보를 제공
- 런타임에서 특정 기능을 실행하도록 정보를 제공
어노테이션의 정의와 사용
어노테이션은 아래와 같이 정의한다.
public @interface AnnotationName {
// Code...
}
위 어노테이션은 코드에서 아래와 같이 사용된다.
@AnnotationName
// Some Codes will start from here...
// Codes...
어노테이션은 아래와 같이 엘리먼트(element)들을 멤버로 가질 수 있다.
public @interface AnnotationName {
String element1();
int element() default 5;
}
엘리먼트의 이름 뒤에는 메소드를 작성하는 것처럼 ()를 붙여야 하며, default 키워드를 통해 디폴트 값을 지정할 수 있다.
엘리먼트의 타입은 아래의 타입들이 가능하다.
- 기본 데이터 타입 : int, double 등..
- Class 타입
- 열거 타입
- 배열 타입
위의 어노테이션을 코드에서 적용할 때는 아래와 같이 사용한다.
@AnnotationName(element1 = "String1", element2 = 10)
// Some codes will start from here...
@AnnotationName(element1 = "String2")
// Other codes will start from here...
디폴트 값이 없는 엘리먼트에 대해서는 반드시 값을 지정해야 하고, 디폴트 값이 있는 엘리먼트에 값을 지정하지 않으면 디폴트 값으로 지정된다.
아래와 같이 기본 엘리먼트 value를 가질 수 있다.
public @interface AnnotationName {
String value();
int element() default 5;
}
value에만 값을 지정하거나, 다른 엘리먼트와 함께 값을 지정한다면 아래와 같이 사용하면 된다.
@AnnotationName("This is String")
// Code
@AnnotationName(value = "This is another String", element = 3)
// Code
어노테이션 적용 대상
어노테이션을 적용할 대상을 지정할 때에는 @Target 어노테이션을 사용한다.
@Target의 기본 엘리먼트인 value는 java.lang.annotation.ElementType에서 정의된 ElementType 배열을 가진다.
ElementType 열거 상수는 아래와 같다.
| ElementType 열거 상수 | 적용 대상 |
| TYPE | 클래스, 인터페이스, 열거 타입 |
| ANNOTATION_TYPE | 어노테이션 |
| FIELD | 필드 |
| CONSTRUCTOR | 생성자 |
| METHOD | 메소드 |
| LOCAL_VARIABLE | 지역 변수 |
| PACKAGE | 패키지 |
아래는 적용 대상을 지정하여 어노테이션을 정의하고, 코드에서 사용한 예시이다.
// 클래스, 필드, 메소드
@Target({ ElementType.TYPE, ElementType.FIELD, ElementType.METHOD })
public @interface AnnotationName {
// code
}
@AnnotationName
public class ClassExample {
@AnnotationName
private String fieldName;
// @AnnotationName
// 생성자는 지정하지 않아 사용할 수 없음.
public ClassExample () {
}
@AnnotationName
public void method() {
// some code
}
}
어노테이션의 유지
어노테이션을 소스까지만, 클래스의 컴파일까지만, 런타임 까지도 유지할 지 지정해야 한다.
어노테이션 유지 정책은 java.lang.annotation.RetentionPolicy 열거 상수로 아래와 같이 정의되어 있다.
| RetentionPolicy 열거 상수 | 내용 |
| SOURCE | 소스상에서만 유지. 소스 코드 분석에서 의미를 가짐. 컴파일된 바이트 코드에는 정보가 남지 않음. |
| CLASS | 컴파일된 바이트 코드까지 정보를 유지한다. 리플렉션을 이용해 정보를 얻을 수는 없다. |
| RUNTIME | 컴파일된 바이트 코드에 정보를 유지한다. 추가로 리플렉션을 이용해 런타임에서 어노테이션 정보를 얻을 수 있다. |
'개발 > Java' 카테고리의 다른 글
| [Java] 싱글톤 (Singleton) (0) | 2022.03.27 |
|---|---|
| [Java] Lambda Expression(람다식) - 1 (0) | 2022.03.21 |
| [Java] 인스턴스 멤버 vs. 정적 멤버와 static (0) | 2022.03.09 |
| [Java] JVM의 메모리 구조 (0) | 2022.03.09 |
- Total
- Today
- Yesterday
- 경기도 청소년 교통비 지원
- m1 mac
- M1 맥
- Non Max Suppression
- 오라클 클라우드
- 싱글톤
- JVM 메모리 구조
- hint
- Canny Edge Detector
- 오라클 데이터베이스
- DTO
- Thresholding
- 강남면허시험장
- Java
- Edge Detector
- pagination
- 경기지역화폐
- 인텔리제이
- spring
- 오라클 JDBC
- 코드로 배우는 스프링 웹 프로젝트
- 1종대형
- jvm
- 경기교통비지원
- 경기버스
- runtime data area
- 실행 계획
- IntelliJ
- 컴퓨터비젼
- 객체지향
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |