본문 바로가기

개발 노트/Kotlin

리스트뷰 vs 리사이클러뷰

현재 시중에 나온 앱은 거의 다 리스트뷰를 사용한다고 할수있다

그럼 리스트뷰란 무엇일까?

위의 그림에서 빨간색으로 표시한 부분이 리스트뷰에 해당한다고 볼수있다

그리고 파란색으로 표시한 부분은 데이터가 담기는 곳으로, 아이템뷰 또는 뷰객체라고 불린다 

맨왼쪽 사진처럼 꼭 수직형태가 아니더라도 수평형태, 격자형태에 해당하는 것도 모두 리스트뷰를 활용한 예시이다 

 

 

그런데 안드로이드 플랫폼 초기에는 리스트뷰라는 객체를 사용했지만, 아이템 재사용, 중복 관련 문제때문에 이를 개선한 리사이클러뷰라는 객체를 사용하게 되었다

리스트뷰와 다르게 리사이클러뷰는 이름에서 알수있듯이 재활용이 가능한 뷰이다.

만약에 100개를 훌쩍 넘는 전체 데이터가 있다고 가정해보자. 그러나 정작 실제로 화면에 보여지는 아이템들은 10개정도밖에 되지 않는데, 리스트뷰는 매번 사용자가 스크롤을 할때마다 맨 위에 위치한 뷰객체가 삭제되고 아래부분에서 새로 나타날 아이템뷰 객체를 새로 생성한다. 그래서 스크롤을 하는 과정을 몇번 반복하다보면 수백개,수천개의 아이템뷰 객체들이 새로 생성되고 삭제되는 과정들이 반복되게 될것이다.

그런데 아이템뷰 객체에 데이터가 담기는 틀(사진,제목,가수이름 )은 똑같고 단지 여기 담기는 데이터만 바뀌는것이기 때문에, 리스트뷰처럼 뷰객체를 계속 새로 생성하고 삭제하는 것은 굉장히 낭비가 심해진다

예를들어보면, 급식판에 음식을 담고 설거지를 해서 다시 재사용해야되는데, 급식판에 음식을 담아서 먹고 다먹고나면 바로 버리는 것과 비슷한것이다.

 

따라서 리사이클러뷰는 이를 해결하기위해서 사용자가 위로 스크롤한다고 가정했을때, 원래 리스트뷰라면 맨위에 존재해서 사라질 뷰객체를 삭제하지 않고 아래쪽에서 새로 나타날 위치로 이동시켜서 보여준다 

즉, 아이템(뷰객체)를 재사용하는것이다. 이때 중요한거는 뷰객체인 아이템을 재사용하는것이지, 뷰객체가 담고있는 데이터는 새로 갱신되는것이다!  급식판을 재사용해야되는것이지 음식을 재사용하면 안된다!

그래서 리사이클러뷰는 뷰객체를 계속 생성하고 삭제하는 작업을 하지 않으므로, 리사이클러뷰는 리스트뷰보다 훨씬 효율적이라고 할수있다. 따라서 리사이클러뷰는 화면에 보여질 몇개정도의 뷰객체만 만들고, 실제 데이터가 백개든 천개든...원래 만들어놓은 객체만 계속 재사용하는 것이다!

 

 

이제 리사이클러뷰가 어떤 구조로 동작되고 처리되는지에 대해 보도록하겠다

 

왼쪽에 데이터 리스트리사이클러뷰에 들어갈 데이터 목록을 말한다. 리사이클러뷰 아이템 객체들에 담긴 데이터들이  저기있는 데이터 리스트에서 가져와서 바인딩된다고 생각하면 된다

그러면 데이터들이 담긴 틀인 아이템뷰의 객체들을 만들어줄(바인딩해줄) 무언가가 필요한데, 이 역할을 Adapter가 한다

저 가운데에 있는 Adapter가 중간다리 역할처럼 리사이클러뷰의 아이템뷰 객체를 생성하고, 만들어진 아이템뷰 객체들의 데이터 리스트에 있는 데이터들을 가져와서 바인딩을 시켜주는 역할을 한다.

즉, 아이템뷰의 객체를 실질적으로 생성하고 데이터와 연결시켜주는 작업을 Adapter에서 해준다고 생각해주면된다.

 

그리고 아래에 있는 Layout Manager아이템들을 배치할수있는 형태를 결정해주는 역할을 한다

아이템들을 수직,수평,격자 형태의 결정을 이 Layout Manager가 결정해준다고 생각하면 된다

 

맨 마지막 그림을 보면, 아이템뷰들이 ViewHolder라는것에 담겨있다고 되어있는데,

리사이클러뷰는 맨처음에 몇개의 아이템뷰들을 생성하고 이것들을 계속 재사용한다고 했었는데, 생성된 아이템뷰들을 재활용하려면 생성된 아이템뷰 객체들을 계속 꽉 잡고있어야지만 재활용을 할수있다. 따라서 아이템뷰 객체들이 한번 사용되고 날아가지 않도록 ViewHolder라는 객체에 담아준다.  ViewHolder란 말그대로 View객체들을 담고있는 그릇이라고 생각해주면 된다. 그래서 ViewHolder에 담겨있는 아이템뷰들이 재활용되고, 이 아이템뷰들의 데이터가 바인딩 되는것이다.

 

결국 리스트뷰와 리사이클러뷰의 차이는 뷰홀더의 유무 차이라고 볼수있다

리스트뷰는 아이템뷰 객체들을 계속 잡아주는 것이 없어서 그냥 날아가게 되는 것이고,

리사이클러뷰는 아이템뷰 객체들을 꽉 잡아주는 VIewHolder가 있기 때문에 다시 재활용해서 더 효율적으로 사용할 수 있게 되는 것이다.