×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 1,499,763명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)

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