애너테이션 타입 정의하기, 애너테이션의 요소
애너테이션 타입 정의하기
- 애너테이션을 직접 만들어 쓸 수 있다.
애너테이션을 만드는 방법은 아주 간단하다.
interface라는 키워드앞에 @를 붙히면 애너테이션을 만들 수 있다.
예를 들어서 DateTime이라는 애너테이션은 2개의 요소를 가지고 있다.
날짜를 의미하는 요소와, 시간을 의미하는 요소를 가지고 있다.
생긴것은 꼭 추상 메서드같이 생겼다.
- 애너테이션의 메서드는 추상 메서드이며, 애너테이션을 적용할 때 지정(순서X)
애너테이션의 메서드는 추상 메서드이다.
우리가 인터페이스에 추상 메서드를 가질 수 있는 것 처럼,
애너테이션도 추상 메서드로 선언이 되어있다.
그리고, DateTime testDate(); 처럼,
애너테이션이 또다른 애너테이션을 요소로 정의할 수 있다.
TestInfo라는 애너테이션을 만들었는데,
이 애너테이션을 사용하려면, 위 예시와 같이 사용하면 된다.
NewClass 라는 클래스에 @TestInfo 라는 애너테이션을 붙인 것인데,
@TestInfo 애너테이션의 요소의 값들을 다 적어줘야한다. 타입을 맞춰서 적어줘야 한다.
애너테이션의 추상메서드는 구현할 필요가 없다.
사용할 때 써주면 된다.
그리고, 요소를 적어줄 때 순서는 없다. 왜냐하면 요소 이름과 값을 같이 적어주엇기 때문에 순서가 바뀌어도 상관없다.
그리고, 해당 애너테이션의 추상메서드를 호출하면 ex)TestInfo.count() 를 호출하면 3을 얻을 수 있다.
이러한 매커니즘으로 되어있다.
애너테이션의 요소
- 적용시 값을 지정하지 않으면, 사용될 수 있는 기본 값 지정 가능(null 제외)
애너테이션에 default 값을 줄 수 있다.
원래는 애너테이션에 정의된 요소의 값은 필수로 적어줘야 하는데,
default값이 있는 경우에는 아래 두번쨰 예시처럼 생략이 가능하다.
그러면, @TestInfo 애너테이션의 의미가 @TestInfo(count=1)로 준 것과 동일하다.
그리고, 기본 default 값으로 null은 사용할 수 없다.
- 요소가 하나이고 이름이 value일 때는 요소의 이름 생략가능
요소의 이름이 value일 때는 요소의 이름이 생략할 수 있다.
원래는 @TestInfo(value="passed") 이렇게 써야하는데,
요소의 이름이 value일 때만, @TestInfo("passed") 이렇게 쓸 수 있다.
- 요소의 타입이 배열인 경우, 괄호{}를 사용해야 한다.(1개 일 때는 생략할 수 있고, 값이 없을 때는 괄호{} 반드시 필요)
애너테이션 요소의 타입이 배열인 경우,
값이 1개일 때는 @Test(testTools="JUnit") 처럼 괄호를 사용하지 않아도 되지만,
값이 0개이거나 2개 이상인 경우에는 괄호{} 를 사용해야 한다.
@TEST(testTools={"JUnit", "AutoTester"})
@Test(testTools={})
모든 애너테이션의 조상 - java.lang.annotation.Annotation
- Annotation은 모든 애너테이션의 조상이지만 상속은 불가
모든 애너테이션의 조상은 Annotation 이라는 인터페이스 이다.
하지만 상속은 불가능하다.
- 사실 Annotation은 인터페이스이다.
Annotation 인터페이스는,
다양한 추상메서드를 가지고 있다.
그러면, Annotation 인터페이스가 가진 추상메서드는, 모든 애너테이션이 물려받는다.
그래서 모든 애너테이션에 대해서
equasls 라든가, hashCode(), toString() 같은 메서드를 사용할 수 있다.
이 메서드들이 추상메서드로 선언되었지만,
Annotation 인터페이스에 선언되어있는 추상메서드들은 구현할 필요 없다.
사용은 가능하다.
컴파일러가 자동으로 해당 추상 메서드들을 구현해주기 때문이다.
마커 애너테이션 - Marker Annotation
- 요소가 하나도 정의되지 않은 애너테이션
마커 애너테이션이란, 요소가 하나도 정의되지 않은 애너테이션이다.
예를 들어 애너테이션 @interface Override{} 나, @interface Test{}는 괄호 안이 비어있다.
요소가 하나도 정의되지 않았다.
이러한 것을 마커 애너테이션이라고 한다.
정의된 요소가 없으므로, 넣을것이 없다.
따라서 그냥 붙여서 사용하면 된다.
대표적으로 @Test, @Deprecated 애너테이션을 마커 애너테이션이라고 부른다.
애너테이션 요소의 규칙
- 애너테이션의 요소를 선언할 때 아래의 규칙을 반드시 지켜야 한다.
- 요소의 타입은 기본형, String, enum, 애너테이션, Class 만 허용됨
- 괄호()안에 매개변수를 선언할 수 없다.
- 예외를 선언할 수 없다.
- 요소를 타입 매개변수로 정의할 수 없다.
애너테이션의 요소를 선언할 때는,
요소의 타입은 기본형이거나, String, enum, 애너테이션, Class 만 허용된다
Class 는 설계도 객체이다.
추상 메서드의 괄호안에 매개변수를 선언할 수 없다.
그리고, 예외를 선언할 수 없다.
그리고, 요소를 타입 매개변수<T>로 정의할 수 없다.
아래의 코드에서 잘못된 부분은 무엇인지 생각해보자.
id는 인터페이스처럼 static final이 생략된 것이다. (상수이다.) OK.
major는 (int t, int j)라는 매개변수를 가지고 있는데, 애너테이션의 요소는 매개변수를 선언할 수 없다. 따라서 X
minor()는 예외를 선언했는데, 애너테이션의 요소는 예외를 선언할 수 없다. 따라서 X
ArrayList<T> list(); 는 타입 매개변수를 썻다. 하지만, 애너테이션의 요소는 타입 매개변수를 사용할 수 없다 따라서 X
'JAVA' 카테고리의 다른 글
쓰레드의 구현과 실행 (0) | 2022.05.30 |
---|---|
프로세스와 쓰레드, 멀티쓰레드의 장단점 (0) | 2022.05.29 |
메타 애너테이션 (0) | 2022.05.11 |
표준 애너테이션 (0) | 2022.05.11 |
애너테이션 (0) | 2022.05.09 |
댓글
이 글 공유하기
다른 글
-
쓰레드의 구현과 실행
쓰레드의 구현과 실행
2022.05.30 -
프로세스와 쓰레드, 멀티쓰레드의 장단점
프로세스와 쓰레드, 멀티쓰레드의 장단점
2022.05.29 -
메타 애너테이션
메타 애너테이션
2022.05.11 -
표준 애너테이션
표준 애너테이션
2022.05.11