안녕하세요 오늘은 ViewBinding 사용법을 알아보고자 합니다.
ViewBinding은 기존의 findViewById의 문제점들이 개선이 되었고, 속도가 빠르고, 사용이 간편하다는 장점이 있습니다.
사용 전 차이점을 살펴보자면
// findViewById
val textView = findViewById<TextView>(R.id.TextView)
textView.text = "Hello JDroid!"
// ViewBinding
binding.textView.text = "HelloJDroid!"
findViewById의 경우에는 모든 뷰들을 연결시켜 변수를 선언해주어야 하지만 ViewBinding의 경우에는 연결되어있는 뷰들을 바로 사용할 수 있기 때문에 아주 간단하게 사용할 수 있습니다.
근데 사용도 간편한데 왜 ViewBinding이 더 빠를까?
findViewById -> 모든 뷰들의 Id에 접근하여 확인을 합니다. 즉 내가 사용하고자 하는 레이아웃뿐만이 아니라 다른 레이아웃들에도 접근을 하여 Id를 체크한다는 것입니다.
ViewBinding -> 내가 사용하고자 하는 레이아웃만 연결이 되기 때문에 내가 만들어 놓은 layout이 많을수록 차이는 더 커지게 될 것입니다.
NullPointerException 안전
findViewById는 잘못된 Id를 사용할 경우 NullPointerException이 발생합니다. 하지만 ViewBinding의 경우에는 Id를 잘 못 적게 되면 바로 Error가 나타나 걱정이 없습니다.
CastException 안전
findViewById는 View를 Cast 해주어야 합니다. 위 코드에서 보면 findViewById <TextView>로 View의 타입을 TextView로 적어주었죠 하지만 저 뷰가 만약에 TextView가 아니라면? 바로 Exception이 발생하게 됩니다. 반면 ViewBinding은 자동으로 Cast가 되어있기 때문에 Exception이 발생할 일이 없습니다.
이제 사용해보겠습니다!
먼저 프로젝트를 연 후
Gradle Scripts -> build.gradle(Module: )로 들어가 줍니다.
android {
...
buildFeatures {
viewBinding true
}
}
이렇게 삽입해 줍니다. 그리고 상단에 보면 알림창이 뜰 겁니다.
Sync Now를 클릭하여 줍니다.
Sync까지 완료되면 이제 ViewBinding을 사용할 수 있습니다.
MainActivity으로 들어가 보겠습니다.
java -> package name -> main -> activity -> MainActivity.kt
class MainActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val textView = findViewById<TextView>(R.id.textView)
textView.text = "Hello JDroid!"
}
}
기존의 이 코드에서
class MainActivity: AppCompatActivity() {
private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
binding.textView.text = "Hello JDroid!"
}
}
이렇게 변경하면 됩니다!
그리고 binding을 by lazy 대신 lateinit을 사용할 수 있습니다.
class MainActivity: AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val textView = findViewById<TextView>(R.id.textView)
}
}
두 코드의 차이점을 말씀드리겠습니다
먼저 by lazy는 변수가 처음 사용될 때 자동으로 초기화합니다.
즉 setContentView(binding.root) 이때 초기화되는 것입니다.
lateinit은 나중에 내가 직접 초기화하겠다고 하는 것입니다.
그래서 setContentView(binding.root)를 하기 전에 제가 직접 변수를 초기화해준 것입니다.
저는 개인적으로 조금 더 편리한 by lazy를 선호하는 편입니다.
그리고 두 가지 다 주의할 점이 있습니다.
by lazy의 경우에는 초기화할 수 없을 때 사용을 하게 되면 Exception이 발생합니다.
그리고 lateinit은 초기화를 하지 않고 사용하였을 때 Exception이 발생합니다. 때문에 Exception이 발생하지 않도록 주의해서 사용하시길 바랍니다!
안드로이드에 관련한 궁금한 사항을 댓글이나 방명록에 작성해 주시면 답변드리겠습니다~!
'Android > Others' 카테고리의 다른 글
[Android Studio] 안드로이드 스튜디오 Logcat(로그캣) 색상 설정 (0) | 2022.06.01 |
---|---|
[Google Fonts] 구글 폰트, 구글 아이콘 무료로 다운로드 받기 - 아이콘 (0) | 2022.05.19 |
[Google Fonts] 구글 폰트, 구글 아이콘 무료로 다운로드 받기 - 폰트 (0) | 2022.05.19 |
[Android Studio] 안드로이드 스튜디오 프로젝트 생성하기 (0) | 2022.05.18 |