[Android] ViewBinding

Twaun·2021년 11월 7일
0

Android-Jetpack

목록 보기
3/4
post-thumbnail

ViewBinding이란?

Android 개발에서 UI관련 파일은 크게 View를 그리는 XML과 presentation 로직을 그리는 Activity 두 가지가 있다.

이 두 파일을 ViewBinding을 통해 결합할 수 있다.
결합한다는 것은 Activity에서 XML파일의 Component를 id를 통해 참조 가능하게 하는 것이다.

등장 배경

findViewById -> viewBinding(v3.6) -> kotlinSynthetic(v4.1)

사실 ViewBinding을 사용하기 전에는 findViewById를 통해서 필요한 id를 받아와 변수화 시켰다. 그리고 ViewBinding이 3.6version부터 등장하게 되었다. 이어서 4.1 version에서 kotlinSynthetic이 등장하였으나 deprecated되었다.

kotlinSynthetic은 동일한 id에 대해 nullPointExeption이 발생할 수 있으며 자바는 지원을 안한다는 점에서 deprecatedrk 되었다.

이전의 findViewById에서 지금의 ViewBinding 으로 세대 교체가 이루어 진 것은 두 가지 사용 방식을 비교해보면 알 수 있다.

두 가지 사용 방식 비교 ( FindViewById / ViewBinding)

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
       	android:id="@+id/textview_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/textview_password"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
        
    <Button
    	android:id="@+id/button_logout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
    <Button
    	android:id="@+id/button_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

XML파일에 2개의 textview와 2개의 button이 존재한다.
이 4개의 component를 activity에서 사용하기 위해 썼던 두 가지 (findViewById, viewBinding) 방식을 비교해보자.

1) FindViewById

override fun onCreate(savedInstanceState: Bundle?){
    super.onCreate(savedInstanceState)
    
    setContentView(R.layout.activity_main)
    
    val textId = findViewById<TextView>(R.id.textview_id)
    val textPassword = findViewById<TextView>(R.id.textview_password)
    val buttonLogout = findViewById<Button>(R.id.button_logout)
    val buttonLogin = findViewById<Button>(R.id.button_login)
}

textId.text = "ID"
textPassword = "PassWord"
buttonLogout.setOnClickListener{}
buttonLogin.setOnClickListener{}

Activity에서 XML의 컴포넌트를 findViewById를 통해 접근 할 시 사용할 모든 컴포넌트에 대해 각각 변수를 선언 후 사용해야 한다.

2) ViewBinding

private lateinit var binding : ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?){
    super.onCreate(savedInstanceState)
    
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
}

binding.textId.text = "ID"
binding.textPassword = "PassWord"
binding.buttonLogout.setOnClickListener{}
binding.buttonLogin.setOnClickListener{}

viewBinding 사용을 위한 설정

app의 build.gradle

buildFeatures {
	viewBinding = true
}

ActivityMainBinding은 viewBinding 사용 설정을 해주면 모든 XML 파일에 대해서 자동으로 생성되는 파일이다. 명명 규칙은 XML의 파일에서 를 없애고 다음에 오는 첫 글자를 대문자로 바꿔 준 후에 마지막에 Binding이 붙는다.

이 ActivityMainBinding의 root를 setContentView로 연결시켜주기만 하면 된다.

이후에 activity에서 xml의 모든 컴포넌트를 binding변수를 통해 binding.id 와 같은 방식으로 접근이 가능해진다.

정리

  1. 코드 길이
  • FindViewById
    필요한 컴포넌트에 대해 모두 선언을 해줘야한다. 필요한 컴포넌트가 50개라면 50개 전부 코드를 추가 해줘야 할 것이다.
  • ViewBinding
    모든 컴포넌트에 대해 선언을 해줄 필요가 없게 된다. 필요한 선언은 binding될 변수 뿐이다.
  1. 위험성
  • FindViewById
    필요한 컴포넌트에 대해 모두 선언을 해줘야하므로 이 과정에서 type을 잘못 선언하거나 존재하지 않는 id를 선언하거나 중복된 id를 잘못 선언할 수 있는 여러 위험성을 가지고 있다.
  • ViewBinding
    binding.id를 통해서 접근을 하므로 binding만 성공적으로 되었다면 문제가 없다.

결론!
FindeViewById 대신 ViewBinding 을 사용하자!!

profile
Android Developer

0개의 댓글