
학습할 것
주석은 사람에게 정보를 제공하는 것이라면,
어노테이션은 특정 코드를 사용하는 프로그램에게 정보를 전달한다.
Annotation은 자바소스 코드에 추가하여 사용할 수 있는 메타데이터의 일종.
소스코드에 추가하면 단순 주석의 기능을 하는 것이 아니라 특별한 기능을 사용할 수 있다.
클래스와 메서드에 추가하여 다양한 기능을 부여하는 역할을 한다.
Annotation을 통하여 코드량이 감소하고 유지보수하기 쉬우며, 생산성이 증가된다.
어노테이션은 @를 사용하여 작성하며, 해당 타겟에 대한 동작을 수행하는 프로그램 외에는 다른 프로그램에게 영향을 주지 않는다.
@Override
: 컴파일러에게 메서드를 오버라이딩하는 것이라고 알린다.
@Deprecated
: 앞으로 사용하지 않을 대상임을 알린다.
@FunctionalInterface
: 함수형 인터페이스라는 것을 알린다.
@SuppressWarning
: 컴파일러가 경고 메시지를 나타내지 않는다.
@SafeVaragrs
: 제네릭과 같은 가변 인자의 매개변수를 사용할 때의 경고를 나타내지 않는다.
@Target
: 어노테이션을 정의할 때 적용 대상을 지정하는 데 사용
@Documented
: 어노테이션 정보를 javadoc으로 작성된 문서에 포함시킨다.
@Inherited
: 어노테이션이 하위 클래스에 상속되도록 한다.
@Retention
: 어노테이션이 유지되는 기간을 정하기 위해 사용
@Repeatable
: 어노테이션을 반복해서 적용할 수 있도록 한다.
사용자가 직접 정의하여 사용하는 어노테이션
메타데이터?
애플리케이션이 처리해야할 데이터가 아니라 컴파일 과정과 실행 과정에서 코드를 어떻게 처리해야하는지를 알려주기 위한 추가 정보
@interface는 애노테이션 타입(annotation type)을 선언하는 키워드.
애노테이션 타입 선언을 일반적인 인터페이스(interface)선언과 구분하기 위해 interface 앞에 기호@를 붙인다.

스프링부트에서 사용되는 @Service 애노테이션을 들어가봤다.
@interface를 볼 수 있다.
이런 식으로 정의하면된다.
enum은 java.lang.Enum에 상속되어 있다고 한다.

애노테이션의 조상님은? java.lang.annotation.Annotation
어노테이션은 인터페이스로 구성되었기 때문에 구현하려면 implements를 사용하던가 익명클래스로 만들어야 한다고 한다.

리플렉션 기술을 이용해서 사용된다는 것을 짐작할 수 있다.
(자바 리플렉션 Java Reflection : 구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API. 런타임 시에 클래스 이름만 알고있다면 클래스에 대한 정보를 가져오고 활용할 수 있게 해준다.)

어노테이션의 리텐션(유지) 기간을 명명
즉, 어느 시점까지 애노테이션의 메모리를 가져갈지 설정


생성할 어노테이션이 적용될 수 있는 위치를 나열
적용 가능한 대상을 여러개 지정하고 싶다면 {} 배열 사용
요소 타입이 ElementType[] 배열이기 때문에 적용가능한 대상을 여러 개의 값을 지정할 수 있다.
애노테이션 정보가 javadoc 으로 작성된 문서에 포함되도록 하는 메타 애노테이션.
자바에서 제공하는 기본 애노테이션 중에 @Override, @SuppressWarnings를 제외하고 모두 @Docummented 메타 애너테이션이 붙어있다.


위에 Target에서 말했던 것 처럼 적용 가능한 대상을 여러개로 {} 배열을 사용해 지정한 모습도 볼 수 있다.
대표적인 예제
: 롬복(Lombok) - @Getter, @Setter, @Builder
애노테이션 프로세서의 장점
: 컴파일 시점에 조작하기 때문에 런타임 비용이 없다.
https://bangu4.tistory.com/199
https://melonicedlatte.com/2021/07/18/182600.html
https://ittrue.tistory.com/m/156
https://hbase.tistory.com/169
https://cyk0825.tistory.com/30