안녕하세요? 닉네임간편입니다.
앱을 개발하면서 화면에 아이템을 나열하여 보여야 할 때가 많은데요, 그럴 때 유용하게 사용하는 것이 바로 리스트뷰(ListView)와 리싸이클러뷰(RecyclerView)입니다.
둘의 기능이 유사하다 보니 한 요소만 사용하거나 혹은 두 요소를 혼동해서 사용하는 경우도 있었는데요, 이번 시간에는 이 둘의 차이점에 대해서 자세히 다루어보겠습니다.
1. 책임(Responsibility)
여기서 '책임'이라는 말은 어떤 기능을 구현함에 있어서 주요한 역할을 한다는 것을 의미합니다.
리스트뷰는 해당 클래스 내부에서 자체적으로 많은 것들을 설정할 수 있습니다. 따라서 리스트뷰는 해당 클래스가 모든 '책임'을 갖고 있다고 볼 수 있습니다.
반대로 리싸이클러뷰는 해당 클래스 자체에서 많은 것들을 설정하기보다는 여러 기능들을 제공해주는 클래스들이 있으며, 이로 인해 '책임'이 분산됩니다. 예를 들어 애니메이션은 ItemAnimator에게, 꾸미는 것은 ItemDecorator에, 정렬 방식은 LayoutManager에 책임을 분산시키는 것이 있습니다.
이 경우 리스트뷰는 내부에서 이 모든 것들을 한 번에 설정해줄 수 있다는 편리함이 있지만, 만일 필요한 코드가 많을 경우 하나의 리스트뷰 객체가 굉장히 헤비 해질 수 있습니다.
반면 리싸이클러뷰는 초기에는 LayoutManager 등 설정해줄 것들이 많지만, 설정해줄 것이 많아질수록 관리가 더 편리하고 커스텀이 용이해집니다.
2. 데이터 갱신(Notify)
리싸이클러뷰는 어댑터의 데이터 집합에서 데이터가 변경되었을 경우 notifyDataSetChanged() 메서드를 통해 이를 갱신할 수 있습니다. 그러나 이 메서드는 모든 데이터 집합에 대해서 갱신하기 때문에 비용이 많이 드는데, 이때 notifyItemInserted(), notifyItemRemoved(), notifyItemChanged() 메서드 등을 사용하여 특정 아이템의 변화만 반영할 수 있습니다. 이를 통해 메모리 측면에서 비용을 줄일 수 있습니다. 또한 추후에 설명드릴 DiffUtil을 사용해서 데이터 갱신을 더 효율적으로 사용할 수도 있습니다.
그러나 리스트뷰는 오직 notifyDataSetChanged() 메서드만 호출할 수 있다는 단점이 있습니다.
3. 장식(Decoration)
리스트뷰는 동적으로 아이템에 경계선을 추가하거나 구분선을 추가하는 등 아이템을 동적으로 꾸미는 것이 쉽지 않습니다.
그러나 리싸이클러뷰는 ItemDecorator 클래스를 제공하며, 이를 통해 어댑터의 데이터 집합에 있는 특정 아이템을 '꾸밀' 수 있습니다. 특히 아이템 간 구분선을 그리거나 특정 아이템에 highlights를 할 때 유용하게 사용할 수 있습니다. 그러나 리싸이클러뷰에서 ItemDecorator를 사용하는 것은 다소 복잡하고 시간이 더 소요되긴 합니다.
4. 애니메이션(Animation)
리스트뷰는 아이템 삽입, 삭제에 대한 애니메이션을 제공하지 않습니다.
반면 리싸이클러뷰는 ItemAnimator를 제공하고 있으며, 이를 통해 아이템의 상태가 변화할 때(삽입, 삭제, 이동) 발생하는 애니메이션을 정의할 수 있습니다.
5. 레이아웃 매니저(LayoutManager)
리스트뷰는 오직 수직 방향으로만 스크롤이 가능합니다.
그러나 리싸이클러뷰는 LayoutManger를 통해서 수직, 수평 방향 모두 스크롤이 가능합니다. 또한 GridLayoutManager를 통해 2차원 그리드로 요소들을 정렬할 수 있으며, StaggeredGridLayoutManager를 사용해 모든 행의 높이와 모든 열의 너비를 다르게 조정할 수도 있습니다.
LayoutManager가 특히 유용한 이유는, 이를 다이나믹하게 원하는 대로 설정할 수 있기 때문입니다. 리스트뷰는 생성과 동시에 수직 방향으로만 스크롤이 되고 아이템이 정렬되도록 제한이 있습니다. 그러나 리싸이클러뷰는 개발자의 의도에 따라 자유롭게 정렬 방식을 설정할 수 있습니다.
6. 뷰홀더(ViewHolder) 패턴 강제
ViewHolder 패턴은 화면에 표시할 아이템들을 모두 만들어놓는 것이 아니라, 화면에 표시될 만큼 아이템을 만든 후 이것을 뷰홀더 객체에 넣고 화면에 표시합니다. 그리고 스크롤 시 뷰홀더 객체를 재사용해서 화면에 표시되어야 하는 아이템만 변경한 후 다시 화면에 표시합니다. 이를 통해서 메모리를 더 효과적으로 사용할 수 있고, 사용자는 더 '부드럽게' 스크롤할 수 있습니다.
리싸이클러뷰에선 ViewHolder 패턴을 강제하기 때문에, 화면에 표시해야 할 아이템이 많을수록 더 좋은 수행능력을 보일 수 있습니다.
리스트뷰에서는 ViewHolder 패턴 사용을 권장하고는 있지만 강제하지는 않습니다. 그러나 데이터가 많은 경우 ViewHolder을 사용하지 않으면 메모리 측면에서 비용이 심하기 때문에 ViewHolder 패턴을 강제하는 것이 낫다고 생각합니다.
7. 구글이 RecyclerView를 밀어주는 이유
구글은 RecyclerView가 ListView에 비해 더 현대적이고, 유연하고, 더 효과적이라고 하면서 RecyclerView 사용을 권장하고 있습니다.
앞서 리스트뷰와 리싸이클러뷰의 차이점 및 사실상 리싸이클러뷰의 장점을 조사해보니 확실히 리싸이클러뷰를 권장하는 이유를 알 것 같습니다.
리싸이클러뷰는 뷰를 생성하는 것과 바인딩하는 것, 정렬 방식, 데코레이션 등 내부적으로 모든 책임을 지지 않고 각각 분리되어 있습니다. 즉, 초반에는 코드가 좀 많을 수 있지만 각각 따로 관리하기 때문에 보다 수월하게 관리할 수 있습니다. 또한 그렇기에 커스텀하기도 더 수월합니다.
그러나 리스트뷰는 처음에 모든 것을 내부에서 다 설정할 수 있고 초기에 코드량이 적다는 이점은 있지만, 추가적인 설정이 필요해지면 그만큼 헤비해집니다.
또한 리싸이클러뷰는 각각의 책임이 분리되어있고 이를 자유롭게 설정할 수 있기 때문에 다양한 기능을 동적으로 조작할 수 있고 메모리를 더 효율적으로 사용할 수 있습니다.
8. 마무리
이번 시간에는 리스트뷰와 리싸이클러뷰의 차이점에 대해서 알아보았습니다.
확실히 리싸이클러뷰가 더 나중에 나온 기능이다 보니 좀 더 이점이 많은 것 같은 느낌이 있네요 ㅎㅎ
저도 리싸이클러뷰를 주로 사용하는데요, 그래도 이런 차이점들을 비교해보면서 각각의 요소가 필요한 곳에 더 잘 배치할 수 있을 것 같습니다.
그럼 긴 글 읽어주셔서 감사합니다.
'Android > 공부' 카테고리의 다른 글
툴바(Toolbar) 내부 텍스트뷰(TextView) 문자열 가운데로 배치하는 법 (0) | 2021.12.26 |
---|---|
SharedPreferences 개념 및 사용법 (0) | 2021.12.19 |
안드로이드 화면 전환 애니메이션(+ 화면에 보이는지 여부에 따라 애니메이션 다르게 설정) (0) | 2021.12.09 |
에디트텍스트(EditText) 관련 짜투리 지식 2 (한 줄로 입력받기, 엔터키 이벤트, 키보드 사라지게 만들기) (0) | 2021.12.08 |
AnimationDrawable 사용해서 애니메이션 만들기 (0) | 2021.12.07 |