View

ViewBinding

제롱구리 2024. 3. 18. 13:15
728x90

오늘 할 일!

금일 알아 볼 것은 ViewBinding 이닷!!
사실 금일 이 해당 포스를 쓰게 된 이유가 있다.
ViewBinding을 사용하는 방법에 대해서는 다른 블로그나 카페 등에 자세히 나와있다.
그런데 갑자기 왜 어떻게 layout에 있는 xml를 가져오는 궁금해졌다. 물론 알아야되는 부분이지만 글쓴이는 급급하게 안드로이드를 공부했고 독학을 하다보니 쓰는 방법 위주로 공부했었다. 그러다보니 어느 정도 개념은 알지만 정확히 어떤 부분이 이렇게 된다고 말할 정도는 아니다.ㅠㅠ 이부분에 대해서는 많이 반성한다.(그래서 열심히 노력중!)

혹시 쓰는 방법을 알고 싶다면 다른 글을 찾아보기 바란다 좋은 블로그 등이 많다.
이번 포스트는 내가 자신이 알고 싶은 내용을 포스트하려고 한다.

자 시작해보자


ViewBinding 요녀석 대체 무엇?

ViewBinding은 뷰와 상호 작용하는 코드를 쉽게 작성할 수 있게 해주는 기능으로 findViewById를 대체하기 위한 방법이다.

그렇다면 왜 사용할까?

바로 여러 장정이 있기 때문이다.

  1. findViewByid보다 속도가 상대적으로 빠르다.
  2. 정확한 view의 타입을 찾압 맵핑해준다.
  3. NullPointerException을 방지한다.

findViewByid보다 속도가 상대적으로 빠르다.

원래 findViewById의 경우는 모든 View의 Id를 R클래스에서 받아와서 사용했다. 이러다 보니 우리가 접근하고자 하는 레이아웃 뿐만 아니라 전체 레이아웃에서 가져온다. 하지만 viewBinding의 경우는 접근하고자 하는 레이아수 안에서만 선언한 Id 값을 참조하기 때문에 기존의 findViewById보다 빠른다는 것이다.

즉 레이아웃 전체에서 우리가 원하는 id값을 찾는 것보다 우리가 접근하고자 하는 레이아웃에서 id값을 찾기 때문에 빠른것이다.
이건은 간단히 비유하자면 무언가를 검색할 때 무작정 검색할지 카테고리 안에서 검색할지 정도로 보면 될거 같다.^^

정확한 view의 타입을 찾아 맵핑해준다.

findViewById의 경우는 코드상에서 View 타입을 <TextView>, <ImageView> 등이라고 따로 선언 해주어서야된다. 이럴 경우 오타가 발생하거나 다른 View 타입을 작성하게 되면 Exception이 발생하게 된다. 하지만 Viewbinding의 경우는 자동적으로 cast되어 Exception의 우려가 없다.


val text = findViewById<TextView>(R.id.textView)
val text = findViewById<ImageView>(R.id.textView) // Exception 발생하게 된다.

NullPointerException을 방지해준다.

findViewById로 참조를 할 경우 모든 View의 id 값에 접근은 가능하지만, 만약에 레이아웃에 존재하지 않은 잘못된 id값을 참조하게 될 경우 NullPointerException이 발생한다. 하지만 viewBinding의 경우 코드를 작성하는 때 잘못된 id값을 참조하게 되면 즉각 알려주기 때문에 NullPointerExceptiond이 발생할 위험이 없다.

이 부분에 대해서 이해가 안되는 부분이 있을것이다. 코드를 치는 과정에서 R.id.아이디값을 입력하면 똑같이 findViewByid도 id값이 없다면 오류를 뱉어준다. 하지만 잘 생각해야된다. 그건 어디까지나 같은 이름의 id값이 한개도 없을 때 이다.

이게 무슨 말이냐면 A레이아웃에서 tv_id 라는 값을 쓰고 B레이아웃에서도 tv_id값을 쓸 수 있다. 그렇기 때문에 두 레이아웃에 tv_id값이 없다면 findViewById는 에러를 뱉어 준다. 왜냐하면 전체 레이아웃에 존재하지 않기 때문이다.

그렇지만 A레이아웃에만 tv_id가 존재하고 B레이아웃에는 tv2_id 존재할 때 B Activity에서 tv_id를 호출하면 컴파일 과정에서 findViewById는 오류를 뱉지 않는다. 이런 경우가 있기 때문에 NullPointerException이 발생할 수 있다고 생각한다.^^


ViewBinding 어떤 식으로 되어 있는거냐 너는!! 도대체!

여기서 부터가 글쓴이가 글을 작성한 이유이다.
어떻게 되어 있는 건데 ViewBinding!!

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

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

보통 이렇게 누구나 다들 아는 ViewBinding의 기본적은 Activity 코드일 것이다.
이 중에서 우리가 주요하게 봐야되는 부분은 바로

binding = ActivityMainBinding.inflate(layoutInflater)

이 부분이라고 본다.
과연 저 inflate함수는 뭐고 그안에 있는 매개 변수 layoutInflater는 무엇이냐!!.
자 하나식 알아보자

일단 해당 위에 코드는 viewBindingd 객체를 초기화를 해주는것이다.(이건 알것이다.)

ActivityMainBinding 은 무엇일까?
이것은 라이브러리에서 제공하거나 개발자가 작성한 클래스도 아니다. 바로 <layout> 태그로 선언 된 xml을 위해 자동으로 만들어지는 클래스이다. 즉 ActivityMainBidning은 activity_main + Binding 이다.

그렇다면 inflate() 이 함수는 무엇일까
바로 xml에 있는 view를 객체화 해주는 역할을 하는 함수이다.

그러면 layoutInflater는 무엇인가?
바로 xml에 미리 정리해둔 틀을 실제 메모리에 올려주는 역할을 하는 것으로 즉 xml에 정의된 Resource를 View객체로 반환해주는 것이다.

간단히 정리를 하자면 안드로이드에서 main_activity인 xml 파일의 Resource을 객체화 해서 binding에 넣겠다는 것이다.

그렇다면 setContentView() 는 무엇인가?
setContentView() 첫 번째 인자로 넘겨주는 XML 레이아웃 리소스 ID에 해당하는 파일을 파싱 하여 뷰(View)를 생성하고 뷰(View)의 속성을 지정하고 뷰(View) 간의 상하관계에 맞춰 배치를 한다.

즉 매개변수로 들어온 View의 상하 관계등을 맞추어 Activity에서 사용할 수 있게 객체화시킨다는 것이다.



간단히 말하자면

binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

이 코드 자체가 해당 view를 객체화 시킨다는 것이다.



오늘은 간단히 ViewBinding에 대해서 뜯어 봤다. 물론 조금 어려운 부분도 있고 세세하지 못한 부분도 있겠지만 글쓴이는 해당 글을 포스팅하면서 조금 ViewBinding이 어떻게 돌아가는 확실해졌다.
다음에 기회가 되면 dataBiinding도 알아보겟당^^

'TIL > 스터디' 카테고리의 다른 글

ViewBinding(실제 에러 사례)  (0) 2024.03.20
안드로이드 단일 아키텍처  (0) 2024.03.19
RoomDB(2편)  (0) 2024.03.14
RoomDB  (0) 2024.03.14
코루틴-2(Coroutine)  (0) 2024.03.07
Share Link
reply
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30