findViewById
를 반복적으로 호출하게 될 경우 성능 저하가 발생한다고 한다. 왜 성능 저하가 발생하는지 어떻게 동작하는지 알아보자.
View
를 얻어 올때 사용되는 findViewById
의 내부코드를 살펴보자.
View
클래스의 코드이다. 이어서 findViewTraversal
을 살펴보자.
View
에 지정된 mID
와 매개변수가 같으면 return 하고 일치하지 않으면 null
을 return 한다. View
클래스의 findViewById
를 반복적으로 호출하게 될 경우 크게 성능 저하가 발생하지 않을 것으로 예상된다.
이번에는 ConstraintLayout
, LinearLayout
과 같이 ViewGroup
을 상속받은 Layout
을 살펴보자. 일반적으로 Layout
의 자식 View
를 가져올 때 findViewById
를 사용할 것이다.
ViewGroup
의 findViewTraversal
를 살펴보자.
Layout
에 포함되어 있는 자식(mChildren
)과 카운트(mChildrenCount
)를 멤버변수로 가지고 있다. 그 카운트만큼 반복문을 통해 해당하는 자식 View
를 찾고 존재할 경우 return 없을 경우 null
을 return 하고 있다.
여기서 성능 저하가 발생하는 이유를 알 수 있었다. Layout
이 깊을수록 자식 ViewGroup
이 많을수록 이중, 삼중 반복문이 돌게 되고 반복적인 호출이 일어났을 때 비용 손실이 발생하게 된다.
어느 상황에 findViewById
의 반복적인 호출이 비효율적인지 알아보았다. 또한 코드를 통해 확인해보니 findViewById
를 사용할 경우 null safety하지 않다. 이제는 ViewBinding이나 Databinding 을 사용하자!