ViewBinding / DataBinding
배운 내용 정리를 위해서 기록한다.
우선 Kotlin / Java 기반 프로젝트들은
1. XML
2. Source File
로 나뉘어져서 구성되게 되는데, 문제는 이 나눠진 뷰와 소스들을 합쳐주기 위해
binding 작업이라는게 필요하다는 것이다.
기본적으로는
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var txt = findViewById<TextView>(R.id.txt)
var btn = findViewById<Button>(R.id.btn)
btn.setOnClickListener {
//click 이벤트
}
}
요런식으로 Id값을 찾는 메소드인 findViewById로 찾게 되지만, 뷰바인딩과 데이터바인딩을 사용하면
위 메소드를 사용하지 않아도 가능하다.
우선 이를 사용하기 위해서
build.gradle에 viewBinding/혹은 dataBinding을 선언해줘야한다
buildFeatures
{
viewBinding = true
}
혹은
buildFeatures
{
dataBinding = true
}
요런식으로!
선언까지 끝냈다면 두 코드의 차이점을 살펴보자.
뷰바인딩을 사용하면, 기존의 메소드와 달리
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding = ActivityMainBinding.inflate(layoutInflator)
setContentView(binding.root)
btn.setOnClickListener {
//click이벤트 추가
}
}
이런식으로! 바인딩만 끝내주면 모든 id값을 키워드대로 찾아갈 수 있다
반면에 데이터바인딩을 사용하면
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
binding = DataBindingUtil.setContentView(this, R.layout_main)
binding.counter = this
binding.txt.text = number.toString()
btn.setOnClickListener {
//click이벤트 추가!
}
}
이런식으로의 변경이 가능하다.
+ (뷰바인딩과 데이터바인딩 모두 단독으로보단, 뷰모델 / 라이브데이터와 같이 쓰는 경우가 많다.)
코드적으로 차이를 대충 확인했으니 명확히 기능적 차이를 짚어보자.
우선 findViewById를 사용할때와 이 둘의 장점은
- id로 찾는것보다 null안정성이 높다는것
이 있겠다. id로 찾다보면 종종 오타가 나서 null오류가 뜰 때가 있는데, 이 둘은 그것을 효과적으로 방지해준다.
다음으로, viewBinding만의 차이점은
1. 가볍고 단순한 처리에 적합하다 => 일단 쉽고, 컴파일 속도가 데이터바인딩보다는 빠르다
이 있겠다.
그럼 dataBinding은?
1. 양방향 바인딩을 지원한다(뷰바인딩은 안함)
2. 동적 UI 처리(표현식 사용 등)에 적합하다
3. <layout> 태그를 사용해 뷰를 만든다
둘 중에 뭐가 더 낫다. 이렇게 단정짓기보단 때에 따라서 알아서 잘 사용하면 될 것 같다! 개인적으로는 뷰바인딩이 쉬워서 좋지만, 시스템이 유동적이고 복잡해질수록 데이터바인딩이 필요해지는 순간이 올 것 같다.
끝.