-
Kotlin) 코틀린 안드로이드 익스텐션 폐기 - Android Kotlin Extensions Will be removed in a futureKotlin 2020. 12. 8. 00:04
Kotlin Android Extensions
대표적인 기능으로 아래의 기능을 제공합니다.
- Synthetics: findViewById를 대체하는 kotlinx.android.synthetic 바인딩. 해당 View의 id를 바로 참조하여 사용가능한 기능
btnGo.setOnClickListener { TODO() }
- Parcelize: 직렬화/역직렬화 Serializable의 장점과 Parcelable의 보일러 플레이트 코드를 덜어내고 성능상 이점을 가진 기능
- @Parcelize 어노테이션과 Parcelable을 구현해주기만 하면 사용할 수 있습니다.
import android.os.Parcelable import kotlinx.android.parcel.Parcelize @Parcelize data class Student( var age: Int, var name: String, val college: String ) : Parcelable
But Why?
위와 같은 좋은 퍼포먼스를 제공하는 기능들이 있는데 왜 deprecated 될까요? 아래에 kotlin synthetic의 단점으로 알려진 이슈들이 있습니다.
- 전역 네임 스페이스를 오염시킵니다.
- Kotlin 전용입니다.
- 뷰가 일부 구성에만있는 경우 null 허용 여부를 노출하지 않습니다.
- 이러한 모든 문제로 인해 API가 Android 앱의 비정상 종료 횟수를 증가시킵니다.
- 또한 Google은 모듈화를 장려하고 있지만 합성 속성은 모듈 간 작동하지 않습니다.
Alternatives
그럼 kotlin synthetic의 대안은 무엇이 될 수 있을까요?
- "View Binding" 을 통해 뷰와 상호작용하는 코드를 쉽게 작성할 수 있습니다.
- 또한 모듈에서 사용 설정된 View Binding은 모듈에 있는 각 XML 레이아웃 파일의 결합 클래스를 생성해 바인딩 클래스의 인스턴스에는 상응하는 레이아웃에 ID가 있는 모든 뷰의 직접 참조가 포함됩니다.
View Binding의 특징
- Null 안전 - 뷰의 직접 참조를 생성하므로 유효하지 않은 뷰 ID로 인해 null 포인터 예외가 발생할 위험이 없습니다. 또한 레이아웃의 일부 구성에만 뷰가 있는 경우 결합 클래스에서 참조를 포함하는 필드가 @Nullable로 표시됩니다.
- 유형 안전 - 각 바인딩 클래스에 있는 필드의 유형이 XML 파일에서 참조하는 뷰와 일치하기 때문에 클래스 변환 예외가 발생할 위험이 없습니다.
- 빠른 컴파일 속도와 따로 xml 파일에 태그가 필요하지 않고 자동으로 적용되므로 사용 편의성이 있습니다.
- Data Binding과 비교했을 때 레이아웃 변수 또는 레이아웃 표현식을 지원하지 않으므로 XML 레이아웃 파일에서 직접 동적 UI 콘텐츠를 선언하는 데 사용할 수 없습니다. -> 개발자는 사항을 고려해 Data Binding, View Binding을 함께 적절히 사용하는 것이 좋다.
- 양방향 데이터 결합을 지원하지 않습니다.
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) binding.txtMain.text = "kotlin-android-extensions-deprecated"
View Binding은 위와 같이 사용이 가능합니다. 자세한 사용법은 문서 참조 바랍니다.
Parcelize는 어떻게 될까요? 이러한 변화는 안드로이드의 다음 버전 릴리스에서 제공될 것이므로 현재는 참고만 하길 바랍니다.
- Parcelize 기능의 API 및 어노테이션은 유지되므로 계속해서 사용 가능합니다.
- 단, 어노테이션 패키지 이름이 아래의 코드처럼 변경되며
android-kotlin-extension대신 kotlin-parcelize 플러그인을 사용해야 합니다.
import kotlinx.android.parcel.Parcelize
import kotlinx.parcelize.Parcelize
References
- Migrating the deprecated Kotlin Android Extensions compiler plugin
- Parcelable implementation generator
- 코틀린 익스텐션의 미래
반응형'Kotlin' 카테고리의 다른 글
Kotlin) 코틀린 inner 클래스 알아보기 (0) 2020.12.18 Kotlin) 코틀린 infix 키워드 알아보기 (0) 2020.12.15 Kotlin) 코틀린 Collection - List, Map, Set 사용법 (0) 2020.12.15 Kotlin) inline 함수와 고차함수 알아보기 (0) 2020.12.15 Kotlin) 코틀린 ::class.java와 리플렉션(Reflection) (0) 2020.12.14