[Android] findViewById 는 어떻게 동작할까?

Hanbin·2021년 8월 24일
0

Android

목록 보기
1/6
post-thumbnail

🤔 왜일까?

findViewById를 반복적으로 호출하게 될 경우 성능 저하가 발생한다고 한다. 왜 성능 저하가 발생하는지 어떻게 동작하는지 알아보자.

🔍 찾아보자

View를 얻어 올때 사용되는 findViewById의 내부코드를 살펴보자.

findViewById (View.java)


View 클래스의 코드이다. 이어서 findViewTraversal을 살펴보자.

findViewTraversal (View.java)


View에 지정된 mID와 매개변수가 같으면 return 하고 일치하지 않으면 null을 return 한다. View 클래스의 findViewById를 반복적으로 호출하게 될 경우 크게 성능 저하가 발생하지 않을 것으로 예상된다.

이번에는 ConstraintLayout, LinearLayout과 같이 ViewGroup을 상속받은 Layout을 살펴보자. 일반적으로 Layout의 자식 View를 가져올 때 findViewById를 사용할 것이다.

ViewGroupfindViewTraversal를 살펴보자.

findViewTraversal (ViewGroup.java)

Layout에 포함되어 있는 자식(mChildren)과 카운트(mChildrenCount)를 멤버변수로 가지고 있다. 그 카운트만큼 반복문을 통해 해당하는 자식 View를 찾고 존재할 경우 return 없을 경우 null을 return 하고 있다.

여기서 성능 저하가 발생하는 이유를 알 수 있었다. Layout이 깊을수록 자식 ViewGroup이 많을수록 이중, 삼중 반복문이 돌게 되고 반복적인 호출이 일어났을 때 비용 손실이 발생하게 된다.

🙏 마치며

어느 상황에 findViewById의 반복적인 호출이 비효율적인지 알아보았다. 또한 코드를 통해 확인해보니 findViewById를 사용할 경우 null safety하지 않다. 이제는 ViewBinding이나 Databinding 을 사용하자!

0개의 댓글