어노테이션의 정의
어노테이션은 사전적 의미로는 주석이라는 뜻이다. 자바에서 사용될 때의 어노테이션은 코드 사이에 주석처럼 쓰여서 특별한 의미, 기능을 수행하도록 하는 기술이다. 즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터(meta data: 데이터를 위한 데이터)라고 볼 수 있다.
어노테이션은 다음과 같은 용도로 사용된다.
- 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공
- 소프트웨어 개발툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보 제공 (SW 개발 툴에서 어노테이션의 정보를 통해 특정 코드를 자동으로 추가할 수 있)
- 실행시(런타임시) 특정 기능을 실행하도록 정보를 제공
그래서 요약하자면, 어노테이션은 작성한 코드에 대해 추가적인 정보를 제공하면서 컴파일 타임 혹은 런타임 시점에서 해당 코드에 필요한 추가적인 처리를 해 주는 역할을 한다.
이러한 어노테이션을 사용하는 순서는 다음과 같다.
- 어노테이션을 정의
- 클래스에 어노테이션을 배치
- 코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하고, 기능 실시
+) 추가 정보 - Reflection이란?
자바에서 이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩(Dynamic Loading)하여 생성자(Constructor), 멤버 필드(Member Variables) 그리고 멤버 메서드(Member Method) 등을 사용할 수 있는 기법.
클래스의 패키지 정보, 접근 지정자, 수퍼 클래스, 어노테이션(Annotation) 등을 얻을 수 있다.
어노테이션의 종류는 다음과 같이 세 가지로 나뉜다.
- 표준(내장) 어노테이션 : 자바가 기본적으로 제공해주는 어노테이션
- 메타 어노테이션 : 어노테이션을 위한 어노테이션
- 사용자 정의 어노테이션 : 사용자가 직접 정의하는 어노테이션
표준 어노테이션
- @Override : 오버라이딩을 올바르게 했는지 컴파일러가 체크한다. 메서드 이름을 잘못 적는 실수 등을 방지해준다.
- @Deprecated : 앞으로 사용하지 않을 것을 권장하는 필드나 메서드에 붙인다.
- @FunctionallInterface : 함수형 인터페이스에 붙이면, 함수형 인터페이스의 "하나의 추상메서드만 가져야 한다는 제약"을 확인해준다.
- @SuppressWarnings : 컴파일러의 경고메세지가 나타나지 않게 한다.
메타 어노테이션
메타 어노테이션은 어노테이션을 위한 어노테이션이다.
- @Target : 어노테이션을 정의할 때 적용 대상을 지정하는 데 사용된다.
- @Retention. 어노테이션이 유지되는 기간을 지정하는 데 사용된다.
- @Ingerited : 어노테이션을 자손 클래스에 상속하고자 할 때 사용된다.
- @Repeatable : 반복해서 붙일 수 있는 어노테이션을 정의할 때 사용된다.
어노테이션 정의하기
어노테이션은 다음 코드와 같은 형태로 정의하면 된다.
@interface 이름{
타입 요소 이름(); // 어노테이션의 요소를 선언
...
}
@interface DateTime{
String yymmdd();
String hhmmss();
}
@interface TestInfo{
int count() default 1;
String testedBy();
TestType testType();
DateTime testDate();
}
@TestInfo{
testedBy="Kim",
testTools={"JUnit", "AutoTester"},
testType=TestType.FIRST,
testDate=@DateTime(yymmdd="210922", hhmmss="211311")
)// count를 생략했으므로 default인 "count=1"이 적용된다.
public class NewClass{...}
@interface를 사용해 어노테이션을 선언할 것임을 알고, 그 옆에 어노테이션의 이름을 적으면 된다.
어노테이션 선언 과정에서 지켜야 하는 규칙은 다음과 같다.
- 요소의 타입은 기본형, String, enum, 어노테이션, Class만 허용된다.
- 괄호()안에 매개변수를 선언할 수 없다.
- 예외를 선언할 수 없다.
- 요소의 타입을 매개변수로 정의할 수 없다.(<T>)
출처
'Computer Science > Java' 카테고리의 다른 글
JVM의 구조와 JAVA의 실행방식 (1) | 2023.04.10 |
---|---|
제네릭 (0) | 2023.04.10 |
String, StringBuilder, StringBuffer의 차이 (0) | 2023.04.10 |
동일성과 동등성 (0) | 2023.04.10 |
원시 타입과 참조 타입 (1) | 2023.04.10 |