안드로이드에서 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 되었습니다.
아니 이 좋은 것을 왜 계속 쓰지 않고? 라는 생각을 하고 있다면 이유를 살펴보겠습니다.
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
- https://junyoung-developer.tistory.com/27
자 그렇다면 이제 어떤 방법으로 View에 접근해줘야 할까요?
구글에서 권장하는 방법은 ViewBinding / DataBinding 입니다.
글이 너무 길어지니깐 다음 글에서 알아보겠습니다.
- 참조
https://junyoung-developer.tistory.com/27
https://velog.io/@deepblue/Kotlin-Android-Extensions%EC%9D%B4-deprecated%EB%90%9C-%EC%9D%B4%EC%9C%A0
https://thdev.tech/android/2020/10/07/Remove-kotlinx-synthetic/
// https://thdev.tech/android/2020/10/07/Remove-kotlinx-synthetic/
// https://junyoung-developer.tistory.com/27
'Android Jetpack' 카테고리의 다른 글
Android ViewModel - 2 (Activity ViewModel) (0) | 2021.12.18 |
---|---|
Android ViewModel - 1 (ViewModel의 필요성) (0) | 2021.12.18 |
Android View에 대한 접근 - 4 (Databinding with DataClass) (0) | 2021.12.15 |
Android View에 대한 접근 - 3 (databinding) (0) | 2021.12.14 |
Android View에 대한 접근 - 2 (ViewBinding) (0) | 2021.12.11 |