ABOUT ME

-

  • Kotlin) 코틀린 안드로이드 익스텐션 폐기 - Android Kotlin Extensions Will be removed in a future
    Kotlin 2020. 12. 8. 00:04

     

    Kotlin Android Extensions

    대표적인 기능으로 아래의 기능을 제공합니다.

     

    • Synthetics: findViewById를 대체하는 kotlinx.android.synthetic 바인딩. 해당 Viewid를 바로 참조하여 사용가능한 기능
    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

     

     

     

    반응형

    댓글

Designed by Me.