@Test //JUnit에게 이게 Test라고 알려 줌
public void method() {}
Java에서 제공하는 Annotation
어노테이션 | 설명 |
---|---|
@Override | 컴파일러에게 오버라이딩하는 메소드라는 것을 알린다 |
@Deprecated | 앞으로 사용하지 않을 것을 권장하는 대상에게 붙인다 |
@FunctionallInterface | 함수형 인터페이스라는 것을 알린다 (JDK 1.8) |
@SuppressWarnings | 컴파일러의 특정 경고메시지가 나타나지 않게 해준다 |
@SafeVarags | 제네릭스 타입의 가변인자에 사용한다 (JDK 1.7) |
@Native | native 메소드에서 참조되는 상수 앞에 붙인다 (JDK 1.8) |
오버라이딩을 올바르게 했는지
컴파일러가 체크하게 한다class Child extends Parent {
@Override
void parentMethod() {}
}
사용하지 않을 것을 권장하는 필드나 메서드
에 붙인다@Deprecated
public int getDate() {
return normalize().getDayOfMonth();
}
함수형 인터페이스
에 붙이면, 컴파일러가 올바르게 작성했는지 체크한다하나의 추상메소드
만 가져야 한다는 제약이 있다@FunctionalInterface
public interface Runnable {
public abstract void run(); //추상 메서드
}
@SuppressWarnings
{"deprecation", "unchecked", "varags"}
형태로 작성하기import java.util.ArrayList;
@SuppressWarnings("unchecked") //제네릭스와 관련된 경고를 억제
ArrayList list = new ArrayList(); //제네릭 타입을 지정하지 않았음
list.add(obj); //여기서 unchecked 경고가 발생
어노테이션을 위한 어노테이션!
어노테이션을 만들 때 사용한다
어노테이션 | 설명 |
---|---|
@Target | 어노테이션이 적용가능한 대상을 지정하는데 사용한다 |
@Documented | 어노테이션 정보가 javadoc으로 작성된 문서에 포함되게 한다 |
@Inherited | 어노테이션이 자손 클래스에 상속되도록 한다 |
@Retention | 어노테이션이 유지되는 범위를 지정하는데 사용한다 |
@Repeatable | 어노테이션을 반복해서 적용할 수 있게 한다 (JDK 1.8) |
어노테이션을 정의할 때, 적용 대상 지정에 사용한다
SOURCE
이다RUNTIME
이다유지 정책 | 의미 |
---|---|
SOURCE | 소스 파일에만 존재 / 클래스 파일에는 존재하지 않음 |
CLASS | 클래스 파일에 존재 / 실행시에 사용 불가 / 기본값 |
RUNTIME | 클래스 파일에 존재 / 실행시에 사용 가능 |
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target ({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {
String[] value();
}
import java.lang.annotation.Inherited;
@Inherited //@SuperAnno가 자손까지 영향을 미치게 한다
@interface SuperAnno {}
@SuperAnno
class Parent{}
class Child extends Parent {} //Child에 어노테이션이 붙은 것으로 인식한다
import java.lang.annotation.Repeatable;
@Repeatable(ToDos.class)
@interface Todo {
String value();
}
@ToDo("delete test codes.")
@ToDo("override inherited methods")
class MyClass {
}
@interface ToDos { //여러 개의 ToDo 어노테이션을 담을 컨테이녀 어노테이션 ToDos
ToDo[] value(); //ToDo 어노테이션 배열타입의 요소를 선언, 이름이 반드시 value이어야 함
}
프로그램에게 정보를 제공
한다@interface 어노테이션이름 {
타입 요소이름(); //어노테이션의 요소를 선언한다
}
@interface TestInfo {
int count();
String testedBy();
String[] testTools();
TestType testType(); //Enum testType {FIRST, FINAL}
DateTime testDate(); //자신이 아닌 다른 어노테이션을 포함할 수 있다
}
@TestInfo (
count=3, testedBy="Kim",
testTools={"JUnit", "AutoTester"},
testType=TestType.First,
testDate=@DateTime(yymmdd="240430", hhmmss="114040")
)
public class NewClass { ... }
어노테이션의 요소를 선언할 때, 아래의 규칙을 반드시 지켜야 한다
@interface TestInfo {
int count() default 1; //기본값을 1로 지정
}
@TestInfo //TestInfo(count=1)과 동일
public class NewClass { ... }
@interface TestInfo {
String value();
}
@TestInfo("passed") //@TestInfo(value="passed")와 동일
public class NewClass { ... }
@Test(testTools={"JUnit", "AutoTester"})
@Test(TestTools={}) //요소가 없을 경우에는 빈 괄호라도 주어야 한다