Annotation은 기본적으로 디버깅을 좀더 덜 할 수 있고
편하게 할 수 있게 하기 위해 제공되는 문법이다.
Java의 Bulit in Annotation
@Override
메소드가 오버라이드 됐는지 확인해준다.
만약 부모 클래스 또는 구현해야할 인터페이스에서 해당 메소드를 찾을 수 없다면 컴파일 오류가 난다.
public class ParentClass {
public void A() {
System.out.println("Do A");
}
}
public class ChildClass extends ParentClass{
@Override
public void A() {
System.out.println("Do A in child");
}
}
@Deprecated
메소드를 사용하지 말도록 유도합니다. 만약 사용한다면 컴파일 경고 메시지를 발생 시킨다.
@Deprecated
public class noGoodClass {
System.out.println("This is no good class");
}
@SuppressWarnings
컴파일 경고를 무시하도록 한다.
public class myClass {
@SuppressWarnings
public void warningFunc() {
System.out.println("This class has warning");
}
}
@SafeVarargs
제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시한다. (자바7 이상)
@FunctionalInterface
람다 함수등을 위한 인터페이스를 지정한다. 메소드가 없거나 두개 이상 되면 컴파일 오류가 한다. (자바 8이상)
@FunctionalInterface
interface myInterface {
public int calc(int a, int b);
}
Android Annotations
Support Annotations 필요 환경
Android Plugin for Gradle 1.3 버전 이상
Support Annotations 라이브러리 22.2.0 버전 이상
Android SDK Platform-tools 23 버전 이상
Android Studio 1.3 버전 이상
Support Annotations 설정
build.gradle에 다음과 같이 설정해야 한다.
dependencies {
compile 'com.android.support:support-annotations:23.4.0'
}
@NonNull
@NonNull이 붙은 변수에 null 값을 대입하면 경고가 나타난다.
@NonNull
final Context mContext; // null이 들어가면 경고 발생
mContext = null; // 에러 발생
@Nullable
@Nullable이 붙은 변수는 null 일 수도 있다는 것을 나타낸다.
이때 @Nullable 애너테이션이 붙은 변수를 null 검사 없이 사용하면 경고가 나타난다.
즉, @Nullable 애너테이션을 사용할 때는, 참조하거나 호출하는 쪽에서 null 검사를 하지 않으면 반드시 경고가 나타나기 때문에, 사용에 주의하여야 한다다.
void setText(@Nullable CharSequence text) {
this.text = text; // Warning
// @Nullable이 붙으면 null 검사 필수
if (text != null) {
this.text = text;
}
else {
this.text = "";
}
}
@UiThread, @MainThread, @WorkerThread, @BinderThread
스레드 관련 애너테이션들로 해당 애너테이션들이 의미하는 스레드와 동일한 유형의 스레들에서만
해당 메서드를 호출할 수 있도록 제약한다.(@UiThread와 @MainThread는 실질적으로 동일하다)
@WorkerThread
void backgroundTask() {
// code
}
@UiThread
void uiTask() {
// code
}
@WorkerThread
void backgroundJob() {
backgroundTask(); // OK
uiTask() // Error
}
@CallSuper
@CallSuper 애너테이션이 붙은 메서드를 하위 클래스에서 오버라이드할 때는
반드시 상위 클래스를 호출하도록 강제한다.
class Test {
@CallSuper
void helloWorld() {
// code
}
void helloWorld2() {
// code
}
}
class Example extends Test {
@Override
void helloWorld() {} // Super를 넣어주지 않아서 ERROR
@Override
void helloWorld() {
super.helloWorld(); // OK
}
@Override
void helloWorld2() {} // @CallSuper를 지정하지 않아서 super를 넣어주지 않아도 OK
}
@CheckResult
@CheckResult 가 붙은 메서드를 호출했을 때는 반드시 메서드의 반환값을 사용하도록 강제한다.
@CheckResult
boolean isFlag() {
boolean flag;
// code
return boolean;
}
isFlag(); // Error
boolean flag = isFlag(); // OK
@RequiresPermission
@RequiresPermission 애너테이션이 나타내는 권한이 AndroidManifest.xml 에 설정되어 있지 않으면 오류가 발생한다.
@RequiresPermission(CALL_PHONE);
void callHome() { ... }
@RequiresPermission(anyOf = { ACCESS_COARSE_LOCATION, ACCESS_FINE_LOCATION })
Location getLocation() { ... }
@RequiresPermission(allOf = { READ_SMS, WRITE_SMS })
void deleteAllSpams() { ... }
@RequiresPermission(BLUETOOTH)
String ACTION = "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";
@RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS))
@RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS))
Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");
'Basic > Android' 카테고리의 다른 글
Android에서 여러가지 콜백 방법 (0) | 2019.07.03 |
---|---|
싱글턴 패턴 구현을 통한 검증 (0) | 2019.06.27 |
Android에서 Intent란? (2) | 2019.06.10 |
[Eclipse] 한글입력시 오류 해결법 (0) | 2014.01.23 |
[Eclipse] No grammar constraints (DTD or XML schema) detected for the document. (0) | 2014.01.14 |