Android Jetpack

Android View에 대한 접근 - 1 (findViewById, Kotlin Extensions)

개복치 개발자 2021. 12. 11. 19:57

 안드로이드에서 View에 접근하는 방법은 매우 다양합니다.

 

 여기에서 설명드릴 방법은 4가지입니다.

 

 1. findViewById

 2. Kotlin Extension

 3. ViewBinding

 4. DataBinding

 

 이렇게 4가지를 사용할 수 있습니다.

 

 하나씩 살펴보겠습니다.

 

 1. findViewById 

 

 이 부분은 굉장히 익숙할 것입니다. 

 

 간단하게 버튼 4개를 findViewById 를 통해서 가져오는 예제를 작성해보겠습니다.

 

 

 

 위의 View를 Activity에서 가져와서 사용을 한다면 이렇게 사용할 것입니다.

 

 

 

 자, 그런데 여기쯤에서 의문이 하나 듭니다.

 

 버튼이 100개라면 저 findViewById를 100번 만들어야 하는거야? 이거 좀 다른 아름다운 방법 없어? 

 

 라는 생각이 강하게 들기 시작합니다.

 

 

 2. Kotlin Extension

 

 그 때, Kotlin Extension이라는 친구가 등장합니다.

 

 build.gradle 에 plugin쪽에 id를 추가해주면 

 

 id 'kotlin-android-extensions'

 

 이 기능을 사용할 수 있는데, 이 기능을 사용하면 어떻게 되는지 한번 보겠습니다.

 

 기존 방법은 아래와 같은데

 

 

 Kotlin Extension을 사용하면 기존에 findByViewId로 view에 접근해서 받아온 부분을 다이렉트로 아래와 같이 변경해서 사용할 수 있습니다.

 

 자, 여기까지 하면 굉장히 아름답고 좋은 방식이고 이것만 쓰면 되지, 왜 다른 것들을 쓸려고 하나? 라는 생각이 듭니다.

 

 하지만 Kotlin Extension은 구글 형님들에 의해 depricated 되었습니다.

 

https://developer.android.com/topic/libraries/view-binding/migration

 

 아니 이 좋은 것을 왜 계속 쓰지 않고? 라는 생각을 하고 있다면 이유를 살펴보겠습니다.

 

 2-1. 동일한 ID값 문제

 

 우선적으로 가장 발생할 수 있는 문제점이 동일한 id에 대한 문제입니다.

 

 그런데 kotlin exteinsion 에서는 

 

 test1.xml 파일에 id값을 btn1 을 갖고 있는 것과

 test2.xml 파일에 id값을 btn1 을 갖고 있는 것을 동일한 코드로 호출할 수 있습니다.

 

 이 때문에, 실제로 런타임상에서 오류가 날 가능성이 있습니다.

 

 실제로 아래의 코드를 보시면 activity_second.xml에서 버튼을 하나 만들어서 MainActivity에서 호출해보겠습니다.

 

 

 위와 같이 activity_second에서 btn1을 만들고 MainActivity에서 호출을 한다면 어떻게 될까 보겠습니다.

 

 아래와 같이 acitivity_second에 있는 곳에 접근하여 

 

 

 

 

  작업을 해도 에러가 나지 않고 MainActivity에 있는 내용물이 변경됩니다.

 

 

 이 친구들이 문제를 야기할 수 있습니다.

 

 2-2 일부 성능 저하

 

 일부 잘못된 케이스에서 성능 저하가 일어날 때가 있습니다. 그 부분들은 아래의 글을 참고해보시면 좋을 것 같습니다.

 

 -https://stackoverflow.com/questions/29595223/kotlin-extension-overhead-for-android

 

Kotlin extension overhead for Android

It´s a good idea to use kotlin extensions all over the code? I miss a lot the extensions from iOS, but this is a good way to use those kind of things in android? Refering to http://antonioleiva.com/

stackoverflow.com

 - https://junyoung-developer.tistory.com/27

 

[Android] Kotlin Android Extensions deprecated

시간이 좀 지난 일이지만 개발 방식을 조금 바꾸게 되어 정리해본다. 안드로이드 4.1 버전에서 새로운 프로젝트 생성 시 기본 플러그인으로 제공하던 apply plugin: 'kotlin-android-extensions'이 제거되고,

junyoung-developer.tistory.com

 

 자 그렇다면 이제 어떤 방법으로 View에 접근해줘야 할까요?

 

 구글에서 권장하는 방법은 ViewBinding / DataBinding 입니다.

 

 글이 너무 길어지니깐 다음 글에서 알아보겠습니다.

 

 

 

 - 참조

 

https://junyoung-developer.tistory.com/27

 

[Android] Kotlin Android Extensions deprecated

시간이 좀 지난 일이지만 개발 방식을 조금 바꾸게 되어 정리해본다. 안드로이드 4.1 버전에서 새로운 프로젝트 생성 시 기본 플러그인으로 제공하던 apply plugin: 'kotlin-android-extensions'이 제거되고,

junyoung-developer.tistory.com

 

https://velog.io/@deepblue/Kotlin-Android-Extensions%EC%9D%B4-deprecated%EB%90%9C-%EC%9D%B4%EC%9C%A0

 

Kotlin-Android-Extensions이 deprecated된 이유

잘가 Kotlin Android Extensions

velog.io

 

https://thdev.tech/android/2020/10/07/Remove-kotlinx-synthetic/

 

Android Studio 4.1에서 제거된 Kotlin Android Extensions을 알아보자. |

I’m an Android Developer.

thdev.tech

 

// https://thdev.tech/android/2020/10/07/Remove-kotlinx-synthetic/
// https://junyoung-developer.tistory.com/27