본문 바로가기
스터디/워밍업-클럽

[인프런 워밍업 클럽] 1일차 - 어노테이션에 대해

by 빙수야 팥빙수야 2024. 2. 19.

✨ 어노테이션을 사용하는 이유 (효과)는 무엇일까?

- Annotation은 무엇인가?

1. 컴파일러에게 코드 문법 에러를 체크하도록 정보 제공

2. 빌드 또는 배치 시 코드를 자동으로 생성할 수 있도록 정보 제공

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

 

- Annotation의 뜻은?

사전상으로는 주석의 의미이지만 Java에서는 주석 이상의 기능을 가지고 있습니다.

Anootation은 자바 소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종입니다. 소스 코드에 추가하면 단순 주석의 기능을 하는 것이 아니라 특별한 기능을 사용할 수 있습니다.

 

- Annotation 사용하는 이유

기존의 자바 웹 어플리케이션들은 대부분 설정값을 XML파일에 명시하여 관리했습니다. 변경될 수 있는 데이터들은 코드가 아닌 외부 설정 파일(XML)에 분리하기 때문에 재컴파일 없이도 쉽게 변경사항을 저장할 수 있었습니다.

하지만, 프로그램 작성을 위해 매번 많은 설정을 해야 하며 수많은 설정 파일들을 관리해야 했습니다.

이러한 문제점을 해결하기 위해 고안된 문법이 Annotation 입니다.

 

어노테이션을 사용하면 데이터에 대한 유효성 검사조건을 보다 쉽게 파악할 수 있게 되며 코드가 깔끔해집니다.

단순히 부가적인 표현뿐만 아니라 리플렉션을 이용하면 어노테이션 지정만으로 원하는 클래스를 주입할 수 있습니다.

 

- Annotation 용도

1. @Override 어노테이션처럼 컴파일러를 위한 정보를 제공하기 위한 용도

2. 스프링 프레임워크의 @Controller 어노테이션처럼 런타임에 리플렉션을 이용해서 특수 기능을 추가하기 위한 용도

3. 컴파일 과정에 어노테이션 정보로부터 코드를 생성하기 위한 용도

 

🎨 나만의 어노테이션은 어떻게 만들 수 있을까?

- 사용자 정의 어노테이션 (Custom Annotation)

1. 어노테이션 생성

사용자 정의 어노테이션을 사용하기 위해 @interface를 통해 어노테이션 클래스를 작성할 수 있습니다.

public @interface CustomAnnotationClass {

}

 

위와 같이 생성된 어노테이션은 다른 곳에서 참조되지만 아무런 기능을 하지 않는다.

 

2. 메타 어노테이션 추가

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

}

 

- 메타 어노테이션 종류

  • Retention: 해당 어노테이션의 정보를 어느 범위까지 유지할 것인지를 설정함
    • RetentionPolicy.SOURCE: 컴파일 전까지만 유효하며 컴파일 이후에는 사라짐
    • RetentionPolicy.CLASS: 컴파일러가 클래스를 참조할 때까지 유효함
    • RetentionPolicy.RUNTIME: Reflection을 사용하여 컴파일 이후에도 JVM에 의해 계속 참조가 가능함
  • Documented: JavaDoc 생성 시 Document에 포함되도록 함
  • Target: 해당 어노테이션이 사용되는 위치를 결정함
    • ElementType.PACKAGE : 패키지 선언 시
    • ElementType.TYPE : 타입 선언 시
    • ElementType.CONSTRUCTOR : 생성자 선언 시
    • ElementType.FIELD : 멤버 변수 선언 시
    • ElementType.METHOD : 메서드 선언 시
    • ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언 시
    • ElementType.LOCAL_VARIABLE : 지역 변수 선언 시
    • ElementType.TYPE_PARAMETER : 매개 변수 타입 선언 시
  • Inherited: 해당 어노테이션을 하위 클래스에 적용함
  • Repeatable: Java8부터 지원하며, 연속적으로 어노테이션을 선언하는 것을 허용함

3. 변수 추가

@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Target(ElementType.TYPE)
public @interface CustomAnnotationClass {
	String name() default "dafault name";
    	int number() default 0;
}

 

어노테이션에 값을 부여하기를 원한다면 변수를 다음과 같이 선언해 줄 수 있습니다.

 

 

 

강의 링크

https://inf.run/XKQg

 

참고 링크

https://dev-musa.tistory.com/54

https://sassun.tistory.com/57

https://ittrue.tistory.com/158

https://mangkyu.tistory.com/130