애너테이션이란?
1. 선언 방법
- 주석처럼 프로그래밍 언어에 영향을 미치지 않으면서 유용한 정보를 제공
- 애너테이션 사용 예
@Test >> 이 메서드가 테스트 대상임을 테스트 프로그램에게 알린다.
public void method() {
...
}

- 애너테이션의 엘리먼트(element)멤버
- 애너테이션을 코드에 적용할 때 외부의 값을 입력받을 수 있도록 하는 역할
앨리먼트 선언public @interface AnnotationNmae {
타입 elementName() [default 값];
...
}
앨리먼트의 타입은 기본타입과 참조타입을 모두 사용할 수 있다. public @interface AnnotationNmae {
String elemnetName();
int elementName2() default 4;
애너테이션 적용시 앨리먼트 값을 지정하는 방법@AnnotationNmae(elementName1='값', elementName2='3');
또는
@AnnotationName(elementName1='값');
2. value(기본 앨리먼트)
public @interface AnnotationName {
String value(); >>기본 앨리먼트 선언
int elementName() default 5;
}
- 애너테이션을 적용할 때 앨리먼트명을 생략가능
@AnnotationName("값");
- 두개 이상의 속성을 기술할 때는 value = 값 형태로 기술
@AnnotationName(value="값", elementName=3);
3. 적용 대상
@Target으로 지정함

- 애너테이션 적용 대상 지정 방법

▲ 클래스, 필드, 메소드에 적용하겠다고 명시한 예
4. 애너테이션 유지 정책
- 애너테이션 적용 코드가 유지되는 기간을 지정할 때 사용

SOURCE와 RUNTIME만 잘 알면 됨. CLASS는 잘 안써요.
컴파일러에 의해 사용되는 애너테이션의 유지정책은 SOURCE이다.
실행시 사용 가능한 애너테이션의 정책은 RUNTAIME이다.
- 몰라...뭔소리야...책 봐

▲ 이자바 책에는 없음
5. 런타임시 애너테이션 정보 사용하기
- 클래스에 적용된 애너테이션 정보 얻기
- 클래스.class의 내너테이션 정보를 얻는 메소드를 이용
- 필드, 생성자, 메소드에 적용된 애너테이션 정보 얻기

clas XXX {
@Annotation
XXX () { }
@Annotation
XXX () { }
}
일단 저 여러개의 생성자들을 배열로 얻어낸 다음 차례대로 어떤 애너테이션이 붙어있는 지를 확인해야하니까, 위 캡처처럼 필드·생성자·메소드를 일단 배열로 얻어내는 것.
2. 애너테이션들 정리
2-1. @Override
- 오버라이딩을 올바르게 했는지 컴파일러가 체크하게 한다.
- 오버라이딩할때 메서드 일므을 잘못적는실수를 하는 경우가 많다.
- 오버라이딩할 때는 메서드 선언부 앞에 @Overrid를 붙이자.
2-2.@Deprecated
- 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다.
- 하위 호환성을 위해 없애지는 않고 남겨는 두는 옛날 메서드들.
- @Deprecated의 사용 예, Date클래스의 getDate()
- 줄 그어서 보여줌


2-3.FunctionalInterface
- 함수형 인터페이스에 붙이면, 컴파일러가 올바르게 작성했는지 체크
- 함수형 인터페이스에는 하나의 추상메서드만 가져야 한다는 제약이 있음
2-4. SuppressWarnings
- 컴파일러의 경고메시지가 나타나지 않게 억제한다.
- 괄호()안에 억제하고자 하는 경고의 종류를 문자열로 지정
3. 메타에너테이션

- 메타 애너테이션 == 애너테이션을 만들 때 사용하는 것.
3-1. @Taget
- 애너테이션을 정의할 떄, 적용대상 지정에 사용


3-2. Retention
- 애너테이션이유지(retention)되는 기간을 지정하는데사용
- 기간 종류는 세 개에요. 근데 두 개만 써요▼

- 컴파일러에 의해 사용되는 애너테이션의 유지 정책은 SOURCE이다.
ex)@Override
- 실행시에 사용 가능한 애너테이션의 정책은 RUNTIME이다.
ex)@FuntionalInterface
3-3. @Documented, @Ingerited
- 첫번째 꺼는 별로 사용할 일 없음
- @inherited : 애너테이션을 자손 클래스에 상속하고자 할 때, @inherited를 붙인다.
이런게 있다는 것만 아시면 될거같아요
3-4. @Repeatable
- 반복해서 붙일 수 있는 애너테이션을 정의할 때 사용

자주 사용되는 것들은 아니에요. 이런게 있다는 정도로만 참고로 알아두세요.
4. 애너테이션 타입 정의하기
@interface 애너테이션 이름{
타입 요소이름();
...
}
- 애너테이션의 메서드는 추상 메서드이며, 애너테이션을 적용할 때 지정(순서X)

왼쪽처럼 정의한 다음,
사용할 때 오른쪽처럼 그 값들을 다 입력해줘야함.
-우리가 직접 만들일은 잘 없을거에요. 우린 만들어진거 사용하는...
4-1. 애너테이션의 요소
- 적용시 값을 지정하지 않으면, 사용될 수 있는 기본값 지정 가능(null제외)

- 요소가 하나이고 이름이 value일 때는 요소의 이름 생략 가능

- 요소의 타입이 배열인 경우, 괄호{}를 사용해야 한다.

값이 없을 떄는 괄호{}가 반드시 필요!<<주의
5. 모든 애너테이션의 조상
- Annotation은 모든 애너테이션의 조상이지만 상속은 불가
- 사실 Annotation은 인터페이스이다.
6. 마커 애너테이션
- Marker Annotation
- 요소가 하나도 정의도지 않은 애너테이션
- 정의된게 없으니 따로 값 안 붙이고 붙이기만 하면 됨.

7. 애너테이션 요소의 규칙
- 애너테이션의 요소를 선언할 때 아래의 규칙을 반드시 지켜야 한다.
- 요소의 타입은 기본형, String, enum, 애너테이션, class만 허용됨
- 괄호()안에 매개변소를 선언할 수 없다
- 예외를 선언할 수 없다
- 요소를 타입 매개변수로 정의할 수 없다
이런 거 외우느라 고생하지마세요!
나중에 만들 때 참고하는 정도로만!