Java

어노테이션

공부처음하는사람 2024. 7. 10. 15:32

@으로 작성되는 요소를 어노테이션이라고 한다.

어노테이션은 클래스 또는 인터페이스를 컴파일하거나 실행할 때 어떻게 처리해야 할 것인지를 알려주는 설정 정보이다.

 

어노테이션의 세가지 용도

1. 컴파일 시 사용하는 정보 전달

2. 빌드 툴이 코드를 자동으로 생성할 때 사용하는 정보 전달

3. 실행 시 특정 기능을 처리할 때 사용하는 정보 전달

 

컴파일 시 사용하는 정보 전달의 대표적인 예는 @Override 어노테이션이다. @Override는 컴파일러가 메소드 재정의 검사를

하도록 설정한다. 정확히 재정의 되지 않았다면 컴파일러는 에러를 발생 시킨다.

 

어노테이션 타입 정의와 적용

어노테이션도 하나의 타입이므로 어노테이션을 사용하기 위해서는 먼저 정의부터 해야한다.

어노테이션을 정의하는 방법은 인터페이스를 정의하는 것과 유사하다.

public @interface AnnotationName{
}

@AnnotationName

정의한 어노테이션은 @AnnotationName으로 사용된다.

 

어노테이션은 속성을 가질 수 있다. 속성은 타입과 이름으로 구성되며, 이름 뒤에 괄호를 붙인다.

 

public @interface AnnotationName{
	String prop1();
    int prop2() default 1;
}

 

이렇게 정의한 어노테이션은 다음과 같이 사용할 수 있다.

@AnnotationName(prop1 = "값");
@AnnotationName(prop1 = "값", prop2 = 3);

 

prop1은 기본값이 없기 때문에 반드시 값을 기술해야하고, prop2는 default값이 있기 때문에 값을 생략할 수 있다.

 

어노테이션은 기본속성인 value를 가질 수 있다.

public @interface AnnotationName {
	String value();
    int prop2() defualt 1;
}


@AnnotationName("값");
@AnnotationName(value = "값", prop2 = 3);

 

value 속성을 가진 어노테이션을 코드에서 사용할 땐 위와 같이 값만 기술할 수 있다. (자동 대입됨)

value 속성과 다른 속성의 값을 동시에 주고 싶다면 value 속성 이름을 반드시 언급해야한다.

 

어노테이션 적용 대상

어노테이션은 설정 정보이다. 그렇다면 어떤 대상에 설정 정보를 적용할 것인지, 즉 어떤 클래스에 적용할 것인지, 메소드에 적용할

것인지 명시해야한다. 적용할 수 있는 대상의 종류는 ElementType 열거 상수로 정의되어 있다.

 

ElementType 열거상수 적용 요소
TYPE 클래스, 인터페이스, Enum
ANNOTATION_TYPE 어노테이션
FIELD 필드
CONSTRUCTOR 생성자
METHOD 메소드
LOCAL_VARIABLE 로컬 변수
PACKAGE 패키지

 

적용 대상을 지정할 땐 @Target 어노테이션을 사용한다. @Target 의 기본속성인 value는 ElementType 배열을 값으로 가진다.

적용 대상을 복수 개로 지정하기 위해서이다.

 

@Target( { ElementType.TYPE, ElementType.FIELD, ElementType.METHOD } )
public @interface AnnotationName{
}


@Annotation
public class ClassName {
	@AnnotationName // 클래스 (TYPE)에 적용
    private String fieldName;
    
    //@AnnotationName  <- @Target에 CONSTRUCT가 없으므로 생성자에 적용 불가
    public ClassName() {}
    
    @AnnotationName  // 메소드에 적용
    public void methodName() {}  
}

                                                          

 

어노테이션에 대한 자세한 부분은 추후에 다시 학습하기로 함

'Java' 카테고리의 다른 글

제네릭(Generic) 메소드  (0) 2024.07.11
제네릭 (Generic)  (0) 2024.07.10
정규표현식  (0) 2024.07.10
래퍼 (wrapper) 클래스  (0) 2024.07.10
롬복 (Lombok)  (0) 2024.07.09