개발자가 관심 있는 코드에 집중할 수 있도록 권장사항 준수, 상용구 코드 축소, 모든 Android 버전 및 기기에서 일관되게 작동하는 코드 작성을 돕는 라이브러리 모음
Room, LiveData, ViewModel
val btn1 : Button = findViewById(R.id.btn1)
btn1.text = "abcd"
🙅하지만 버튼을 여러 개 만들 때 번거로움
val btn1 : Button = findViewById(R.id.btn1)
val btn2 : Button = findViewById(R.id.btn2)
val btn3 : Button = findViewById(R.id.btn3)
btn1.text = "abcd"
btn2.text = "abcd"
btn3.text = "abcd"
gradle 파일에 아래 코드
id 'kotlin-android-extensions'
MainActivity 파일에서 만든 btn1 widget을 SecondActivity에서 호출하면 null object reference 에러가 난다.
일단 동작하니깐 개발자는 아무 문제 없다고 여기고, 코드 리뷰에서도 발견하기 어렵다.
이미 잘 돌아가니 손도 안대고 있다가, 나중에 전혀 다른 곳에서 이슈가 터질 수 있다. 이 화면은 그대로 써야 하는데 공통으로 사용하던 레이아웃 이름을 변경하거나, 그 레이아웃의 widget id 이름을 변경했다거나 한다면 문제가 생길 수 있다. 나와 아무런 관련 없는 코드가 오류가 날 수 있다.
해당 레이아웃에서만 사용하는 widget만 추천하는 것이 아니라 모든 레이아웃의 widget이 추천됨
이런 경우에는 런타임 오류가 발생
import와 include를 사용하게 되는 경우 발생할 수 있음
이 경우에는 정상 동작을 함
RecyclerView에서 사용할 때 이슈가 남
‘kotlin-android-extensions’이 좋은 플러그인은 아니다.
findViewById의 반복적인 작업을 제거하려고 만들어졌고, 내부적인 캐시를 통해 재사용성을 높였을 뿐이다.
내부적인 캐싱을 통해 재사용성을 높였지만 RecyclerView의 ViewHolder에서는 캐싱을 해주지 않는다.
ViewHolder는 재사용성을 높이려고 만들어졌는데, 정작 ViewHolder에서 Kotlin-android-extensions을 사용한다면 캐싱을 해주지 않는다.
[참고]
https://thdev.tech/android/2020/10/07/Remove-kotlinx-synthetic/
https://junyoung-developer.tistory.com/27
buildFeatures {
viewBinding = true
}
private lateinit var binding : ActivityMainBinding
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
ViewBinding이랑 다른 점?
이름처럼 데이터를 연결해주는 역할을 함. 데이터와 같이 결합해서 사용할 수 있음
DataBinding + LiveData
DataBinding은 레이아웃 파일을 맨위에서부터 맨 밑까지 <layout>으로 감싸줘야 함
-- 1-4부터 다시 듣자!