[Java] 어노테이션(Annotation) 개념 및 사용법

2024. 4. 29. 23:50JAVA

어노테이션이란? (Annotation)

: 어노테이션(Annotation)은 다른 프로그램에게 유용한 정보를 제공하기 위해 사용되는 것으로 주석과 같은 의미를 가진다.

-> 자바에서 Annotation(@)은 코드 사이에 특별한 의미, 기능을 수행하도록 하는 기술

 

[어노테이션 역할]

- 컴파일러에게 사용하는 정보 제공

- 소프트웨어 개발 툴이 자동으로 코드를 생성할 때 사용하는 정보 제공

- 실행 시 특정 기능을 실행하도록 정보 제공

 

 

그렇다면, 어노테이션(Annotation)을 사용하는 이유(효과)는 무엇일까?

 

1. 생산성이 증가한다.

-> 필요한 메서드를 자동으로 생성하여 입력하는 코드량이 감소한다.

 

2. 유지보수가 용이하다.

-> 특정 기능의 동작 방식을 변경할 때,  해당 기능과 관련된 어노테이션만 수정함으로 유지보수가 간편하다.

 


 

 

어노테이션(Annotation) 종류 및 사용법

자바에서 제공하는 어노테이션 중 자주 사용하는 것들로만 나열하자면,

 

@Override

: 메소드 오버라이드로, 메서드의 선언 위에 붙여준다.

상속받은 부모 클래스나 구현해야할 인터페이스에 해당 메서드가 존재하지 않는다면 컴파일 오류가 발생한다.

@Override
public void getMethod() {
	System.out.println("get Method");
}

 

 

@Deprecated

:메소드 Deprecated로, 이 메서드를 사용하면 앞으로 사용하지 않을 것임으로 사용을 자제해달라는 메시지를 알리고 싶을 때 사용한다.

@Deprecated
public void deprecatedMethod() {
	System.out.println("deprecatedMethod")
}

 

 

@SuppressWarnings

: 이 어노테이션을 사용하면 컴파일러가 경고 메시지를 나타내지 않도록 한다.

 


 

메타 어노테이션(Meta - Annotation) 종류 및 사용법

: 메타 어노테이션은 어노테이션을 붙이는 어노테이션이다.

즉, 사용할 어노테이션을 정의하는데 사용한다.

 

@Target

: 어노테이션을 정의할 때 적용 대상을 지정하는 데 사용한다.

value  
ElementType.ANNOTATION_TYPE 어노테이션
ElementType.CONSTRUCTOR 생성자
ElementType.FIELD 필드 선언
ElementType.LOCAL_VARIABLE 로컬 변수
ElementType.METHOD 메서드
ElementType.PARAMETER 파라미터
ElementType.PACKAGE 패키지
ElementType.TYPE 클래스, 인터페이스, enum

 

 

@Documented

: 자바 문서에 어노테이션 정보가 표시된다.

 

@Ingerited

: 자식 클래스가 어노테이션 상속을 받을 수 있다.

 

@Repeatalbe

: 반복적으로 어노테이션을 선언할 수 있다.

 


커스텀 어노테이션 생성

1. 어노테이션 생성

-> 인터페이스 앞에 @를 붙여서 생성

public @interface TagetAnnotation {
	
}

 

2. 메타 어노테이션 추가

@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target(ElementType.TYPE)
public @interface TagetAnnotation {
	
}

 

3. 변수 추가

@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target(ElementType.TYPE)
public @interface TagetAnnotation {
	String name();
    String value();
}

 

4. 적용하기

@TagetAnnotation(name = "memberController", value = "memberController")
@RequiredArgsConstructor
public class MemberController {
	private final MemberService memberService;
    
    @GetMapping("/list")
    public MemberResponse findMember() {
    	return memberService.getMember();
    }
}