반응형

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");

 

https://d2.naver.com/helloworld/8725603

반응형