애너테이션

Java

목록 보기
9/26
post-thumbnail

애너테이션이란?

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만 허용됨
  • 괄호()안에 매개변소를 선언할 수 없다
  • 예외를 선언할 수 없다
  • 요소를 타입 매개변수로 정의할 수 없다
    이런 거 외우느라 고생하지마세요!
    나중에 만들 때 참고하는 정도로만!

0개의 댓글