티스토리 뷰

예전에 안드로이드 프로그래밍을 할 때도, @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
댓글