어플리케이션, 앱 (Application)/안드로이드 (Android)

findViewById()를 버리고 ViewBinding을 쓰자

sobal 2025. 3. 17. 23:25

오늘은 viewbinding에 대해 정리해보고자 한다. 물론 jetpack compose를 메인으로 쓰면 쓸 일은 거의 없지만 하이브리드로 xml을 쓰는 경우도 있으니 간단하게 알아 놓는 것 정도는 괜찮다고 생각한다.


View Binding은 안드로이드 개발에서 레이아웃 XML 파일에 정의된 뷰들을 보다 안전하고 간편하게 코드로 참조할 수 있도록 도와주는 기능이다. 기존의 findViewById() 방식보다 코드가 간결해지고, 컴파일 시점에 타입 안정성을 보장받을 수 있어 런타임 에러를 줄이는 데 큰 도움이 된다.

1. View Binding의 개념

  • 자동 생성된 바인딩 클래스:
    각 XML 레이아웃 파일마다 해당 레이아웃의 모든 뷰에 대한 참조를 멤버 변수로 포함하는 바인딩 클래스가 자동으로 생성된다. 예를 들어, activity_main.xml 파일이 있다면 ActivityMainBinding 클래스가 생성되어, 레이아웃 내의 뷰들을 직접 접근할 수 있다.
  • 타입 안전성:
    각 뷰의 타입이 미리 정의되어 있기 때문에 findViewById()를 사용하면서 발생할 수 있는 형 변환 오류를 방지할 수 있다.

 

2. View Binding 활성화 방법

View Binding을 사용하는 법은 매우 간단하다. 모듈의 build.gradle 파일에 아래와 같이 설정을 추가하면 된다.

 

이렇게 하면 빌드 시 각 레이아웃 파일에 대응하는 바인딩 클래스가 자동으로 생성된다.

 

3. View Binding 사용 예

사용 예시도 간단하다. 

ActivityMainBinding.inflate(layoutInflater)를 사용하여 레이아웃을 인플레이트하고 binding.root를 setContentView()에 전달하여 화면에 표시하면 된다.

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding  // 자동 생성된 바인딩 클래스 사용

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

        // 예: TextView에 텍스트 설정
        binding.textView.text = "Hello, View Binding!"
    }
}

 

Fragment에서는 뷰의 생명 주기에 맞춰 바인딩 객체를 해제해 주어야 메모리 누수를 방지할 수 있다.

Fragment의 뷰가 소멸될 때 _binding을 null로 만들어 메모리 누수를 예방하자.

class ExampleFragment : Fragment() {
    private var _binding: FragmentExampleBinding? = null
    private val binding get() = _binding!!  // non-null 접근

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        _binding = FragmentExampleBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null  // 뷰가 소멸될 때 바인딩 객체 해제
    }
}