2. 1. 어노테이션이란
• @를 이용한 주석, 자바코드에 주석을 달아 특별한 의미를 부여
한 것
• 컴파일러가 특정 오류를 억제하도록 지시하는 것과 같이 프로
그램 코드의 일부가 아닌 프로그램에 관한 데이터를 제공, 코드
에 정보를 추가하는 정형화된 방법.
3. 2. 어노테이션의 용도
1. @Override 어노테이션처럼 컴파일러를 위한 정보를 제공하기 위
한 용도
2. 스프링 프레임워크의 @Controller 어노테이션처럼 런타임에 리플
렉션을 이용해서 특수 기능을 추가하기 위한 용도
3. 컴파일 과정에 어노테이션 정보로부터 코드를 생성하기 위한 용도
※ 자바 리플렉션: 다른언어에는 존재하지 않는 특별한 기능, 컴파일 시간이 아닌 실행시간에 동적으
로 특정 클래스의 정보를 객체를 통해 분석 및 추출해내는 프로그래밍 기법
4. 3. 기본 어노테이션(JDK에서 제공)
• @Override: 해당 메소드가 부모 클래스에 있는 메소드를 재정
의했다는 것을 명시적으로 선언
• @Deprecated: 더이상 사용되지 않는 클래스나 메소드 앞에 추
가
• @SuppressWarnings: 프로그램에는 문제가 없는데 간혹 컴파일
러가 경고를 뿜을 때가 있는데, 이를 무시하라고 프로그래머에
게 알려줌
5. @Deprecated 예제
@Deprecated를 커스텀 어노테이션
(@Test)에 사용
@Test와 관련 엘리먼트에 전부 취소선
이 그어지고, 경고 발생
메소드위에 @Deprecated
를 사용하면 메소드에 취
소선이 그어진다.
6. @SuppressWarnings 예제
클래스의 타입을 확실하게 하기
위해 제네릭을 사용하라고 경고
이 경고를 무시하기위해 @SuppressWarnings 사용
※제네릭: 타입의 안정성, 개발자의 실수를 방지하기 위해 사용하는 기법으로 안써도 되지만, 경고가 발생된다.
* 인자의 종류
7. 4. 메타 어노테이션
• 어노테이션을 선언할때 사용한다. 프로그래머가 어노테이션을
만들때 사용하는 것이다.
1. @Target
2. @Retention
3. @Documented: 해당 어노테이션 정보가 JavaDocs(API) 문서
에 포함
4. @Inherited: 모든 자식 클래스가 부모 클래스의 어노테이션을
사용할 수 있다는 것을 선언
5. @interface: 어노테이션 선언할 때 사용
8. 4-1. @Target
• 어노테이션이 적용할 위치를 결정
import java.lang.annotation.Target;
• 적용 가능 대상(디폴트는 전 범위)
import java.lang.annotation.ElementType;
ElmentType.TYPE : 클래스, 인터페이스, 열거 타입
ElmentType.ANNOTATION_TYPE : 어노테이션 타입
ElmentType.FIELD : 필드
ElmentType.CONSTRUCTOR : 생성자
ElmentType.METHOD : 메서드
ElmentType.PARAMETER : 파라미터
ElmentType.LOCAL_VARIABLE : 로컬 변수
ElmentType.PACKAGE : 패키지
10. @Target 예제(Test.java 소스)
@Target을 메소드로 설정했을 경우 @Target을 클래스,인터페이스로 설정했을 경우
Main.java에서 @Test를 메소드에 주었기 때문에 정상 작동 Main.java에서 @Test를 메소드에 주었기 때문에 에러 발생
11. 4-2. @Retention
• 어떤 시점까지 어노테이션이 영향을 미치는지 결정
import java.lang.annotation.Retention;
• 적용 가능 시점
import java.lang.annotation.RetentionPolicy;
RetentionPolicy.SOURCE: 어노테이션 정보가 컴파일 시 사라짐
RetentionPolicy.CLASS: 클래스 파일에 있는 어노테이션정보가 컴파일
러에 의해 참조 가능, 가상머신에서는 사라짐(리플렉션 불가, 디폴트)
RetentionPolicy.RUNTIME: 실행 시 어노테이션 정보가 가상머신에 의
해서 참조 가능