안드로이드 연구소

[코딩테스트 제출 시 필독] Deprecated메서드 제거 본문

안드로이드 연구소

[코딩테스트 제출 시 필독] Deprecated메서드 제거

안드로이드 연구원 2023. 5. 5. 14:35

Deprecated

사전적인 의미로는 "더 이상 사용되지 않음"을 뜻하는 말이다.

소프트웨어에서는 어떤 기능이 아직까지 사용하고 있지만 중요도가 떨어졌거나 새로운 기능이 나와 조만간 사라지게 될 상태를 의미한다.

그렇다면 안드로이드에서는 어떤 의미로 사용되고 있을까?

 

Q1. chatGPT, 안드로이드에서 Deprecated에 대해 설명해줘.

더 이상 사용을 권장하지 않음을 나타내기 위해 메소드, 클래스 또는 필드에 추가되는 "주석(annotation)"을 의미합니다.
Android OS의 향후 버전에서 지원되지 않을 수 있고 예상대로 작동하지 않을 수 있으므로 일반적으로 권장되지 않습니다.
향후 잠재적인 문제를 방지하기 위해 가능한 한 빨리 새로운 권장 대안으로 마이그레이션하는 것이 좋습니다.

 

Q2. 그렇다면 안드로이드에서 Deprecated된 문법 예시를 보여줘.

- ActionBar class
: 액션바는 Android 5.0 (API level 21)에서 Deprecated되었다.
그리고 다양하고 커스텀이 쉬운 Toolbar class로 대체되었다. 

- AsyncTask class
: AsyncTask는 Android 11 (API level 30)에서 Deprecated되었다.
그리고 효과적이고 유연하게 비동기를 다룰 수 있는 java.util.concurrent 패키지로 대체되었다.

- getPixel() method
: Bitmap class안에 있는 getPixel은 Android 10 (API level 29)에서 Deprecated되었다.
그리고 더 정확한 색상 구현이 가능한 getPixel(int x, int y, Color color)으로 대체되었다.

- android.hardware.Camera class
: Android 9 (API level 28)에서 Deprecated되었다.
그리고 더 나은 카메라 제어 및 이미지 처리 기능을 제공하는 android.hardware.camera2 package으로 대체되었다.

- setNavigationOnClickListener() method
: Toolbar class 내부에 있던 setNavigationOnClickListener() 메서드는 Android 11 (API level 30)에서 Deprecated되었다.
아이콘과 클릭을 유연하게 다룰 수 있는 setNavigationIcon() and setNavigationOnClickListener(OnClickListener)로 대체되었다.

AsyncTask말고는 들어보지 못한거 같은데 사용을 권장하지 않으니까

많이 없어져 지금 우리가 쓰고 있는 코드들로 대체가 되어진 것 같다.

 

Q3. 그렇다면 나의 안드로이드에서 Deprecated된 문법이 있는지 없는지 어떻게 검사를 할 수 있니?

(상단)Analyze>Run Inspection by Name

"Deprecated API usage" 입력

OK 클릭

그러면 오른쪽 하단에 빌드 돌아가듯이

로딩 프로그래스가 생깁니다.

한 5분~10분정도 검사가 마치면

왼쪽에 영역에 Deprecated문법이 있는 파일들이 쫘르륵 나옵니다.

xml, Activity, Adapter, Fragment, 커스텀 클래스까지 모두 다 나오고 있습니다.

제 파일의 오류들에 몇몇개를 보여드리고

어떻게 고쳤는지 한번 보여드리겠습니다.

가장 먼저 나오는 xml파일을 클릭하니 <fragment> 뷰 태그에 Deprecated가 있다고 얘기를 해주네요.

노란색 오류 표시줄에 마우스를 올리면 "Replace with ~~~"라는 버튼이 나오게됩니다.

또 위쪽에 노란색 전구 표시에도 있네요.

해당 버튼을 누르게 되면

<fragment>태그를 말고 <android.fragment.app.FragmentContainerView>로 교체해줍니다.

완전 쉽죠?

그 다음 xml 파일을 가보니

<switch>태그에 Deprecated가 있다고 알려주는데 "Replace with~~~" 알림이 안나오네요.

노란색 오류 표시줄에 마우스를 올리니 "Use SwithchCompat or SwitchMaterial"이라고 안내를 해줍니다.

<switch>대신 <SwitchCompat>을 사용해주니 바로 극복!

그 다음은 Activity 파일을 한번 보겠습니다.

getDrawable(int): Drawable is Deprecated.

너무나도 제가 많이 쓰던 구문인데 더 이상 사용하지 않는다고 한다니...

심지어 위의 예시들처럼 대체 코드를 언급해주지도 않네요.

구글에 "getDrawable(int): Drawable is Deprecated."를 검색해보니

ContextCompat으로 변경해주니 바로 극복!

resources.getDrawable(R.drawable.이미지명)
ContextCompat.getDrawable(this, R.drawable.이미지명)

 

마지막으로 Deprecated검사를 무시하는 방법을 보여드리겠습니다.

아래 Deprecated는 Google Cluster를 쓰지 않으면 해당 메서드를 사용하지 마시오라고 얘기를 하는데

저는 Google Cluster를 사용하여 목적에 맞게 사용하고 있기 때문에

 

노란색 전구 Provides feedback on this warning 오른쪽에 supress를 누르시면

@SuppressLint("PotentialBehaviorOverride") 어노테이션이

해당 클래스를 감싸면서 더 이상 오류가 나오지 않습니다.

그렇다면 오늘은 여러분의 프로젝트에 Deprecated검사를 마치고

신선한 코드로 바꿔보세요. 

감사합니다!

Comments