목표
자바의 애노테이션에 대해 학습하세요.
학습할 것 (필수)
- 애노테이션 정의하는 방법
- @retention
- @target
- @documented
- 애노테이션 프로세서
애노테이션이란
미리 정의된 태그들을 이용해서 주석 안에 정보를 저장하고, jacadoc.exe라는 프로그램이 이 정보를 읽어 문서를 작성한다.
이를 응용하여 프로그램의 소스코드 안에 다른 프로그램을 위한 정보를 미리 약속된 형식으로 포함시킨 것이다.
주석처럼 프로그래밍 언어에 영향을 미치지 않으면서도 유용한 정보를 제공한다.
애노테이션 정의하는 방법
@기호를 붙이며 이외에는 인터페이스를 정의하는 것과 같다.
@interface 애노테이션이름 {
타입 요소이름(); // 애노테이션 요소 선언
...
}
애노테이션의 요소
- 애노테이션 내의 선언된 메소드
- 반환 값이 있고 매개변수는 없는 추상 메서드의 형태
- 상속을 통해 구현하지 않아도 된다.
- 애노테이션 적용 시 요소들의 값을 빠짐없이 지정해주어야 한다.
- 요소의 이름도 적으므로 순서는 상관없다.
@interface TestInfo {
int count();
String testedBy();
String[] testTools();
TestType testType(); // enum TestTpye { FIRST, FINAL }
DateTime testDate(); // 자신이 아닌 다른 애너테이션을 포함할 수 있다.
}
@interface DateTime {
String yymmdd();
String hhmmss();
}
@TestInfo(count = 3, testedBy = "SuJin",
testTools = {"JUnit", "AutoTester"},
testType = TestType.FIRST,
testDate = @DateTime(yymmdd = "210424", hhmmss="114312")
public class NewClass { . . . }
애노테이션의 각 요소는 기본값을 가질 수 있으며, 기본값이 있는 요소는 애노테이션을 적용할 때 값을 지정하지 않으면 기본값이 사용된다.
@interface TestInfo {
int count() default 1;
}
@TestInfo // @TestInfo(count = 1)과 동일
public class NewClass { . . . }
애노테이션 요소가 하나뿐이고 이름이 value인 경우, 요소의 이름을 생략하고 값만 적어서 정의할 수 있다.
@interface TestInfo {
String value();
}
@TestInfo("passed")
class NewClass { . . . }
@retention
애노테이션이 유지되는 기간을 지정하는 데 사용된다.
유지 정책 | 의미 |
SOURCE | 소스 파일에만 존재. 클래스파일에는 존재하지 않음. |
CLASS | 클래스 파일에 존재. 실행 시에 사용 불가. 기본값 |
RUNTIME | 클래스 파일에 존재. 실행 시에 사용 가능. |
@target
애노테이션이 적용 가능한 대상을 지정하는 데 사용된다.
// @SuppressWarnings에 적용할 수 있는 대상을 @Target으로 지정함.
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface SuppressWarnings {
String[] value();
}
대상 타입 | 의미 |
ANNOTATION_TYPE | 애노테이션 |
CONSTRUCTOR | 생성자 |
FIELD | 필드 |
LOCAL_VARIABLE | 지역변수 |
METHOD | 메서드 |
PACKAGE | 패키지 |
PARAMETER | 매개변수 |
TYPE | 타입(클래스, 인터페이서, enum) |
TYPE_PARAMETER | 타입 매개변수(JDK1.8) |
TYPE_USE | 타입이 사용되는 모든 곳(JDK1.8) |
- @Target으로 지정할 수 있는 애노테이션 적용 대상의 종류
@documented
애노테이션에 대산 정보가 javadoc으로 작성한 문서에 포함되도록 한다.
자바에서 제공하는 기본 애노테이션 중에 '@Override'와 '@SuppressWarnings'를 제외하고는 모두 이 메타 애노테이션이 붙어 있다.
애노테이션 프로세서
- annotation processor는 자바 컴파일러 플러그인의 일종이다.
- 어노테이션을 사용하기 위해서는 어노테이션 프로세서가 필요하다.
동작 구조
- 어노테이션 프로세서를 사용한다는 것을 자바 컴파일러가 알고 있는 상태에서 컴파일을 수행한다.
- 어노테이션 프로세서들이 각자의 역할에 맞게 구현되어 있는 상태에서 실행되지 않은 어노테이션 프로세서를 실행한다.
- 어노테이션 프로세서 내부에서 어노테이션에 대한 처리를 한다.
- 자바 컴파일러가 모든 어노테이션 프로세서가 실행되었는지 검사하고, 모든 어노테이션 프로세서가 실행되지 않았다면 반복한다.
Reference)
자바의 정석 - 남궁 성
im-recording-of-sw-studies.tistory.com/37
'IT > JAVA' 카테고리의 다른 글
자바 Enum - 백기선님 스터디 11주차 과제 (0) | 2021.04.02 |
---|---|
자바 멀티쓰레드 프로그래밍 - 백기선님 스터디 10주차 과제 (0) | 2021.03.29 |
자바 예외처리 - 백기선님 스터디 9주차 과제 (0) | 2021.03.16 |
자바 인터페이스 - 백기선님 스터디 8주차 과제 (0) | 2021.03.01 |
자바 패키지 - 백기선님 스터디 7주차 과제 (0) | 2021.02.26 |