1. 개념
    1. 주석처럼 프로그래밍 언어에 영향을 미치지 않으며, 유용한 정보를 제공 (프로그램의 설정 정보를 담고 있음.)
    2. Returns true if the specified object represents an annotation that is logically equivalent to this one.
  2. 표준 애너테이션
    1. 일반 애너테이션
      1. @Override: 오버라이딩을 올바르게 했는지 컴파일러가 체크한다.
      2. @deprecated: 앞으로 사용하지 않을 것을 권장하는 필드나 매서드에 붙인다.
    2. 메타 애너테이션
      1. 개념: 애너테이션 생성을 위한 애너테이션
      2. @Target: 애너테이션이 적용 가능한 대상을 지정하는데 사용한다.
      3. @Documented: 애너테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다.
      4. @Inherited: 애너테이션이 자손 클래스에 상속되도록 한다.
      5. @Retention: 애너테이션이 유지되는 스코프를 지정하는데 사용한다.
        1. Source: 소스 파일에만 존재. 클래스파일에는 존재하지 않음
        2. Class 클래스 파일에 존재. 실행 시에 사용 불가. 기본값. ⇒ 클래스로더가 클래스들을 메모리에 올릴때 까지 존재한다.
        3. Runtime 클래스 파일에 존해. 컴파일 시에도 사용 가능.
      6. @Repeatable: 애너테이션을 반복해서 적용할 수 있게 한다.
        1. @Repeatable인 @ToDo를 하나로 묶을 컨테이너 애너테이션도 필요하다.
  3. 만드는 법: @intergace 애너테이션 이름.
    1. 애너테이션의 매서드는 추상 매서드이며, 애너테이션을 적용할 때 지정.
    2. 적용시 값을 지정하지 않으면, 사용될 수 잇는 기본값 지정 가능 (null 제외)
    3. 요소의 타입이 배열인 경우 괄호{} 사용.
  4. 애너테이션 요소의 규칙
    1. 요소의 타입은 기본형, String, enum, 애너테이션, class만 허용
    2. 괄호 안에 매개변수를 선언할 수 없다.
    3. 예외를 선언할 수 없다.
    4. 요소를 타입 매개변수로 정의할 수 없다. (와일드 카드 X)