https://youtu.be/81U0MyuZQKo?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp
📖본 포스팅은 '자바의 정석 - 남궁성 저자' 님의 책과 유튜브 강의를 보고 작성되었습니다.
[애너테이션 타입 정의하기]
- 애너테이션을 직접 만들어 쓸 수 있다.
@interface 애너테이션 이름{
타입 요소이름();
}
- 애너테이션의 메서드는 추상 메서드며, 애너테이션을 적용할 때 지정한다. (순서X)
- 요소 이름과 값을 같이 적어주기 때문에 어떤 요소에 어떤 값을 지정했는지를 다 알 수 있어서 순서는 상관이 없다.
[직접 만들어 본 애너테이션]
@interface TestInfo {
int count();
String testedBy();
String[] testTools();
TestType testType();
DateTime testDate();
}
@TestInfo {
count = 3, testedBy = "Kim",
testTools = {"JUnit", "AutoTester"},
testType = TestType.FIRST,
testDate = @DateTime(yymmdd = "16010", hhmmss = "235959")
}
public class NewClass{...}
- 다양한 타입을 넣을 수 있음을 보여준다.
- 순서는 상관 없이 요소에 지정해서 넣어주는 것을 볼 수 있다.
[애너테이션의 요소]
- 적용 값을 지정하지 않으면, 사용될 수 있는 기본값 지정이 가능하다. (null값을 제외하고)
@interface TestInfo {
int count() default 1;
}
@TestInfo // @TestInfo(count = 1)과 동일해서 생략 가능
public class Newclass{ ... }
- 요소가 하나이고 이름이 value일 때는 요소의 이름 생략 가능하다.
@interface TestInfo {
String value();
}
@TestInfo("passed") //@TestInfo(value="passed")와 동일 요소 이름이 value일때만 생략 가능!!!
class NewClass
- 요소의 타입이 배열인 경우, 괄호{ }를 사용해야 한다.
@interface TestInfo {
String[] testTools();
}
@Test(testTools = {"JUnit", "AutoTester"})
@Test(testTools = "JUnit") //요소 하나라 {} 생략
@Test(testTools = {}) // 값이 없을 땐 빈 괄호{}라도 써주어야 한다.
[모든 애너테이션의 조상]
- 사실 Annotation은 인터페이스다.
- 그렇기 때문에 Annotation은 모든 애너테이션의 조상이지만 상속은 불가하다.
- 모든 애너테이션의 조상인 Annotation에 정의된 추상 메서드를 자식들이 모두 사용 가능하다.(상속이 되지 않아도 사용이 가능하다!!)
- 이때 추상 메서드는 따로 구현하지 않아도 사용이 가능하도록 되어있다.
[마커 애너테이션 - Marker Annotation]
- 요소가 하나도 정의되지 않은 애너테이션을 의미한다.
[애너테이션 요소의 규칙]
- 애너테이션의 요소를 선언할 때 아래의 규칙을 반드시 지켜야 한다.
- 요소의 타입은 기본형, String, enum, 애너테이션, class만 허용된다.
- 예외 선언이 불가하다.
- 매개변수를 선언할 수 없다.
- 요소를 타입 매개변수로 정의할 수 없다.
@interface AnnoTest {
int id = 100; // 상수라서 OK //static final int id = 100; 이런식이라 되는데 defaul메소는든 안 됨
String major (int i, int j); // 괄호() 안에 매개변수 선언해서 안 됨
String minor() throws Exception; // 예외 선언해서 안 됨
ArrayList<T> list(); // 타입 예외변수로 정의해서 안 됨
[실습]
package javajungsuk;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention;
//@Deprecated
@TestInfo(testedBy = "aaa", testDate = @DateTime(yymmdd = "160101", hhmmss = "235959"))
class Java12_8 {
public static void main(String[] args) {
// Java12_8의 Class객체를 얻는다.
Class<Java12_8> cls = Java12_8.class;
TestInfo anno = cls.getAnnotation(TestInfo.class);
System.out.println("anno.testedBy() = " + anno.testedBy());
System.out.println("anno.testDate().yymmdd() = " + anno.testDate().yymmdd());
System.out.println("anno.testDate().hhmmss() = " + anno.testDate().hhmmss());
for (String str : anno.testTools()) {
System.out.println("testTools = " + str);
}
System.out.println();
// AnnotationEx5에 적용된 모든 애노테이션을 가져온다.
Annotation[] annoArr = cls.getAnnotations();
for (Annotation a : annoArr) {
System.out.println(a);
}
}
}
@Retention(RetentionPolicy.RUNTIME) // 실행 시에 사용가능하도록 지정
@interface TestInfo {
int count() default 1;
String testedBy();
String[] testTools() default "JUnit";
TestType testType() default TestType.FIRST;
DateTime testDate();
}
@Retention(RetentionPolicy.RUNTIME) // 실행 시에 사용가능하도록 지정
@interface DateTime {
String yymmdd();
String hhmmss();
}
enum TestType { FIRST, FINAL }
'Java > 객체지향' 카테고리의 다른 글
[객체지향][쓰레드/thread] - 쓰레드구현과 실행 (0) | 2022.02.26 |
---|---|
[객체지향][쓰레드/thread] - 쓰레드 (0) | 2022.02.26 |
[객체지향][애너테이션/Annotation] - 메타 애너테이션(Meta Annotation) (0) | 2022.02.25 |
[객체지향][애너테이션/Annotation] - 애너테이션(Annotation) (0) | 2022.02.24 |
[객체지향][열거형] - 열거형에 멤버 추가하기 (0) | 2022.02.22 |