Tech Log

[Android] View Binding 본문

Android/Kotlin

[Android] View Binding

yuhee kim 2022. 4. 6. 18:32

개요 : UMC Android 2기에 참여하면서 안드로이드와 관련한 여러 실습을 듣게 되었다. 해당 실습을 진행하면서, Binding이라는 것에 대해 알게되었다. 자주 쓰일 것 같아, 자세히 개념 정리를 하고 싶어서 글을 작성하게 되었다.

 

정의 및 역할

View binding을 Android Developer 에서 보면 한국어로는 뷰 결합이라고 나온다. bind는 사전적 의미로 '묶다'라는 의미이다.

여기서 결합(묶는) 것은 레이아웃 파일(.xml)과 액티비티(혹은 프래그먼트)이다.

이렇게 결합(Bind)해버리면, findViewById와 같은 특정 뷰를 받아오는 메소드를 사용하지 않아도 된다. 즉, findViewById를 사용해서 일일이 뷰와 변수를 연결해주지 않아도 Binding으로 한 번에 다 연결해줄 수 있다.

그 이유는 레이아웃 파일(.xml)과 연결되는 Binding 클래스가 자동으로 설계되어 만들어져, 이 클래스의 멤버 변수 안에 레이아웃 파일(.xml) 내의 모든 ID를 참조하는 참조변수가 있기 때문이다.

 

사용 방법

View Binding은  Android Studio 3.6부터 사용가능하다.

1-1. build.gradle(app 모듈 수준의) 설정(안드로이드 스튜디오의 버전3.6 이상 4.0 미만일 경우)

android {
        ...
        viewBinding {
            enabled = true
        }
    }

1-2. build.gradle(app 모듈 수준의) 설정(안드로이드 스튜디오의 버전 4.0 이상일 경우)

android {
	...
        buildFeatures {
        viewBinding = true
    }
}

build.gradle(Module:app)에 위와 같은 코드 추가. View Binding은 외부 라이브러리가 아니라, 안드로이드 아키텍처의 구성요소 이기 때문에 app 모듈 수준의 build.gradle에 추가하는 것이다.

 

 

2-1. Binding 클래스를 Activity에서 사용

    private lateinit var binding: ActivityMainBinding

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

Binding클래스의 이름은 CamelCase로 표기되기 때문에 ActivityMainBinding이 된다(레이아웃 파일이 activity_main.xml일 경우)

생성된 binding 클래스에 포함된 정적 inflate() 메서드를 호출한다.

여기서 inflate()의 사전적 의미로는 '부풀리다'라는 의미를 갖고 있으며, 기능적으로 설명하면 xml에 표기된 레이아웃들을 메모리에 로딩된 후 객체화 시키는 과정이다.

즉, inflate()를 사용함으로써 binding 클래스의 인스턴스를 생성시키는 것이다.

마지막으로 onCreateView()메서드에서 root View(레이아웃 파일에서 가장 상위 View)를 반환하여 레이아웃 파일에 있는 View들을 모두 화면 상의 활성 View로 만든다.

 

2-2. Binding 클래스를 Fragment에서 사용

    private var _binding: ActivityMainBinding? = null

    private val binding get() = _binding!!

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

Fragment의 경우, onCreateView()에서 binding 인스턴스를 설정해야 한다.

나머지 과정은 Activity와 동일하게 진행된다.

binding 클래스에 포함된 inflate()를 호출하며, 최상위 View를 반환한다. 최상위 View를 반환하는 이유는 Activity 때와 동일하다.

 

 

3. View 참조

binding.imgView1.setOnClickListner{
		
        ...
        
}

위와 같이 binding.(레이아웃 내 id)로 View를 참조할 수 있다.

 

findViewById와의 차이

  • Null Safety: View Binding은 View의 직접 참조를 생성하므로 유효하지 않은 View ID로 인해 null 포인터 예외가 발생할 위험이 없다. 또한 레이아웃의 일부 구성에만 View가 있는 경우 결합 클래스에서 참조를 포함하는 필드가 @Nullable로 표시된다. findViewById 사용 시 Null Pointer Exception이 발생할 것을 컴파일 시간에 잡아낼 수 있다.
  • Type Safety: 각 Binding 클래스에 있는 필드의 type이 XML 파일에서 참조하는 View와 일치한다. 즉, 클래스 변환 예외가 발생할 위험이 없다. findViewById 사용 시 Class Cast Exception이 발생할 실수를 컴파일 시간에 잡아낼 수 있다.

 

Data Binding과의 차이

View Binding과 Data Binding이 모두 있길래, 두 개의 차이점이 궁금했다.

안드로이드 공식 문서에 따르면, View Binding와 Data Binding보다 단순한 사용 사례를 처리하기 위한 것이라 한다.

또한, View Binding과 Data Binding을 모두 사용하는 것이 좋다고 한다. 고급 기능이 필요한 레이아웃에는 Data Binding을, 고급 기능이 필요 없는 레이아웃에는 View Binding을 사용하는게 낫다고 한다.

따라서 View Binding과 Data Binding의 용례에는 차이가 있으며, View Binding을 Data Binding과 비교했을 때의 장단점은 아래와 같다.

장점 단점
더 빠른 컴파일: View Binding에는 주석 처리가 필요하지 않으므로 컴파일 시간이 더 짧다. View Binding은 레이아웃 변수 또는 레이아웃 표현식을 지원하지 않으므로 XML 레이아웃 파일에서 직접 동적 UI 콘텐츠를 선언하는 데 사용할 수 없다.
사용 편의성: View Binding에는 특별히 태그된 XML 레이아웃 파일이 필요하지 않으므로 앱에서 더 빨리 레이아웃 View를 설정할 수 있다.
모듈에서 View Binding을 사용 설정하면 모듈의 모든 레이아웃에 View Binding이 자동으로 적용된다.
View Binding은 양방향 Data Binding을 지원하지 않는다.
참조

'Android > Kotlin' 카테고리의 다른 글

[Kotlin] 코틀린 언어 특징  (0) 2022.06.27
[Android] Coroutine 개념  (0) 2022.05.11
[Android] 안드로이드 액티비티 생명주기  (0) 2022.03.02
Comments