Android

[Android] ViewBinding 동작 원리 파헤치기

yujinius 2024. 11. 9. 21:45
안드로이드 ViewBinding 동작 원리 파헤치기


이전 포스팅에서는 findViewById의 내부 동작 원리를 살펴보았다.

https://yujinius45.tistory.com/125

 

[Android] findViewById 동작 원리 파해치기

안드로이드 findViewById 동작 원리 파해치기https://velog.io/@ows3090/Android-findViewById-원리 [Android] findViewById 원리findViewById란? 안드로이드 개발에서 findViewById 메소드는 레이아웃에 있는 뷰를 리소스 id를

yujinius45.tistory.com

 

또한, findViewById에 대해서 정리를 진행했다.

https://yujinius45.tistory.com/124

 

[Android] 안드로이드에서 findViewById 완벽 가이드: 사용법, 동적 뷰 조작, 문제점과 해결 방법

안드로이드에서 findViewById 완벽 가이드: 사용법, 동적 뷰 조작, 문제점과 해결 방법목차findViewById 개요findViewById 기본 사용법: MainActivity에서 뷰에 접근하기동적 뷰 삽입 및 삭제 실습Layout Inspector

yujinius45.tistory.com


이번에는 그 발전된 형태인 ViewBinding의 구현과 동작 원리를 확인해보고자 한다.

package com.yujin45.androidstudy

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.yujin45.androidstudy.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    // ViewBinding 객체 선언
    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ViewBinding 초기화 및 레이아웃 설정
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
}

위 코드를 보면 binding 객체가 ActivityMainBinding 타입으로 선언되어 XML 파일과 자동으로 연결되는 것을 확인할 수 있다.

 

ViewBinding 동작 원리

  • ViewBinding을 사용하려면 build.gradle.kts 파일에서 다음과 같이 설정을 추가해야 한다.
// build.gradle.kts
android {
    ...
    viewBinding {
        enable = true
    }
    ...
}

  • ViewBinding은 모듈 단위로 설정되며, 이를 활성화하면 해당 모듈 내 모든 XML 레이아웃 파일에 대해 자동으로 바인딩 클래스가 생성된다.
  • 바인딩 클래스는 레이아웃의 모든 뷰에 대한 참조를 포함하고 있어, findViewById 없이 직접 접근이 가능하다.
  • 생성된 바인딩 클래스는 app > build > generated > ... > databinding 경로에서 확인할 수 있다.

 

❓ ViewBinding인데 왜 databinding 폴더에 binding class가 생성되는가?

참고: DataBinding과 ViewBinding의 관계

ViewBinding이 활성화되면 바인딩 클래스는 databinding 폴더에 생성된다. 이는 DataBinding보다 후에 등장했으나, Jetpack 라이브러리 내에 두 기능이 통합되어 있는 구조 때문이다.

 

  • XML 파일이 각 바인딩 클래스로 생성되고, 해당 레이아웃의 ID가 각 필드로 지정되어 있음을 알 수 있다.

  • 이와 같이 각 필드는 내부적으로 findChildViewById 메서드를 사용해 참조값을 설정한다.

[ViewBinding.java]

// ViewBinding.java
@Nullable
public static <T extends View> T findChildViewById(View rootView, @IdRes int id) {
    if (!(rootView instanceof ViewGroup)) {
        return null;
    }
    final ViewGroup rootViewGroup = (ViewGroup) rootView;
    final int childCount = rootViewGroup.getChildCount();
    for (int i = 0; i < childCount; i++) {
        final T view = rootViewGroup.getChildAt(i).findViewById(id);
        if (view != null) {
            return view;
        }
    }
    return null;
}

  • findChildViewById는 ViewGroup을 순회하며 자식 뷰의 ID와 일치하는 뷰를 찾아 반환하는 방식으로 작동한다. 이 과정에서 findViewById를 호출하는데, ViewBinding을 사용하면 이 과정을 컴파일 타임에 한 번만 수행하여 참조값을 설정해둔다.

 

❓ 기존에 이미 findViewById로 작성된 코드까지 Binding 클래스가 생성되어야 할까?

  • 기존에 findViewById를 사용해 작성된 프로젝트에서 ViewBinding으로 마이그레이션할 때, 모든 XML 파일에 대해 Binding 클래스가 자동 생성된다. 그러나 View Binding을 사용하지 않아도 되는 레이아웃 파일까지 굳이 Binding 클래스를 생성할 필요는 없다.

[tools:viewBindingIgnore="true"]

  • ViewBinding을 사용하지 않고 특정 레이아웃 파일에 대해서만 바인딩 클래스를 생성을 피하려면 XML의 root 뷰에 다음과 같은 속성을 추가해주면 된다.
<ConstraintLayout
    ...
    tools:viewBindingIgnore="true">
    ...
</ConstraintLayout>

탐구 결론

  • 즉, Binding 클래스가 만들어지면서 findViewById가 수행되어 참조값이 생기게 된다. 컴파일 시점에 1번 수행되는 것이다.
  • View Binding을 사용하지 않는 findViewById 방식은 매번 탐색을 거쳐야 하는 반면, View Binding은 이러한 탐색 과정을 Binding 컴파일 시에 1번 수행한다고 보면 된다. 이 순간에 null 값도 체크가 되기 때문에 null safety해진다.

ViewBinding의 정리

  • ViewBinding은 컴파일 타임에 한 번 참조값을 설정하므로, findViewById를 반복해서 호출하며 런타임 탐색을 거치지 않아도 된다. 이는 성능 최적화에 기여하며, findViewById에서 발생할 수 있는 null 오류도 방지할 수 있다.
  • 이러한 구조를 통해 ViewBinding이 findViewById보다 안전하고 효율적이라는 점을 다시 한번 확인하게 되었다.

ViewBinding을 직접 사용해보니, findViewById의 불편함을 효과적으로 해소할 수 있는 방법이라는 점을 더 깊이 이해하게 되었다.

 

 


다음으로 읽으면 좋은 글 추천

https://yujinius45.tistory.com/127

 

[Android] 안드로이드 ViewBinding 완벽 가이드: 개념, 도입 배경, 사용법, 동작 방식 및 컴파일 위치

안드로이드 ViewBinding 완벽 가이드: 개념, 도입 배경, 사용법, 동작 방식 및 컴파일 위치안드로이드 개발에서 findViewById 메서드는 XML 레이아웃에 정의된 뷰를 코드에서 참조하기 위해 오랫동안 사

yujinius45.tistory.com

 


학습 참고 링크

https://math-coding.tistory.com/253

 

[Android] ViewBinding이란?

View Binding? Activity, Fragment의 UI를 변경하기 위해서는 XML 파일을 인플레이션 후 각 View들을 findViewById를 통해 참조를 해야합니다. 간단한 UI일 경우에는 크게 상관없지만, 복잡한 UI일수록 보일러 플

math-coding.tistory.com