안드로이드 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
'Android' 카테고리의 다른 글
| [Android] Unresolved reference: BR.isTextLongEnough 에러 해결 (1) | 2024.11.16 |
|---|---|
| [Android] DataBinding 동작 원리 파헤치기 (0) | 2024.11.10 |
| [Android] 안드로이드 ViewBinding 완벽 가이드: 개념, 도입 배경, 사용법, 동작 방식 및 컴파일 위치 (9) | 2024.11.09 |
| [Android] findViewById 동작 원리 파헤치기 (1) | 2024.11.09 |
| [Android] 안드로이드에서 findViewById 완벽 가이드: 사용법, 동적 뷰 조작, 문제점과 해결 방법 (0) | 2024.11.09 |