devlog of ShinJe Kim

[TIL] 2019-12-19 (목)

|

Today I Learned

  • 안드로이드에서 스타일을 만들때에는 마진까지는 적용하지 않는 것이 좋은 것 같다. 동일한 마진을 매번 적용하는 것이 비효율적인 것 같아 타이틀의 스타일에 마진을 넣었었다. 한참 시간이 지난 이후 레이아웃을 수정하려 하는데 마진이 생각대로 적용되지 않아 스타일을 들어가보니 마진이 적용되어 있었다. 레이아웃은 언제든지 수정될 수 있기 때문에 마진값은 항상 변화할 여지가 있고, 스타일을 적용함으로써 얻는 이점보다는 해당 요소에 바로 바로 적용하는 것의 이점이 더 큰 것 같다.

  • 기존의 LinearLayout과 비교하여 RecyclerView의 이점이 무엇인지 찾아보았다. StackOverflow에 잘 설명된 글이 있었다.
  • 그런데 이 글에는 가장 큰 이점이 빠져있는 것 같다. 바로, 리사이클러뷰는 이름 그대로 뷰 객체를 재활용한다는 것이다. 만약 내가 100개의 항목이 있는 리스트를 만든다고 가정하자. 리사이클러뷰가 아닌 기존의 레이아웃들을 활용하면 100개의 뷰(View) 객체가 생성된다. 하지만 리사이클러뷰를 사용하면 한 화면에 보이는 개수만큼의 뷰가 생성되고, 스크롤을 하며 뷰가 화면을 벗어날 때 해당 뷰들을 버리지 않고 재활용한다. 만약 한 화면에 10개의 리스트 항목이 보인다고 가정하면 총 10개의 객체만 생성되어 이 뷰들이 계속 재활용되는 것이다.
  • 아래는 해당 원문을 번역한 것이다.

    장점

    1. 뷰홀더 패턴(ViewHolder Pattern)

      리스트뷰에서는 뷰홀더 패턴이 권고사항일뿐 강제되지는 않았습니다. 반면 리사이클러뷰에서는 RecyclerView.ViewHolder 클래스를 사용하는 것이 의무사항입니다. 이는 리스트뷰와 리사이클러뷰의 가장 큰 차이점 중 하나입니다. 이러한 특징은 리사이클러뷰를 사용하는 것을 조금 더 복잡하게 만들지만, 기존의 리스트뷰에서 겪은 문제점들은 효과적으로 해결해줍니다.

    2. 레이아웃매니저(LayoutManager)

      리사이클러뷰의 큰 이점 중 하나입니다. 기존의 리스트뷰에서는 수직(vertical)의 리스트뷰만 가능했고, 수평(horizontal)의 리스트뷰를 만드는 공식적인 방법이 없었습니다. 하지만 리사이클러뷰를 사용함으로 인해, 아래의 레이아웃을 만들 수 있습니다.

      i) LinearLayoutManager - 수직/수평 리스트를 모두 지원합니다.

      ii) StaggeredLayoutManager - 핀터레스트같이 엇갈린 모양의 레이아웃을 지원합니다.

      iii) GridLayoutManager - 갤러리 앱과 같이 그리드 형태의 레이아웃을 지원합니다.

      가장 좋은 점은 이 모든 레이아웃을 원하는대로 동적으로 만들 수 있다는 것입니다.

    3. 아이템 애니메이터(Item Animator)

      리스트뷰는 좋은 애니메이션에 대한 지원이 부족하지만, 리사이클러뷰는 완전히 새로운 차원을 열어주었습니다. RecyclerView.ItemAnimator 클래스를 사용함으로써, 뷰에 애니메이션을 적용하는 것이 훨씬 쉽고 직관적이게 되었습니다.

    4. 아이템 데코레이션(Item Decoration)

      리스트뷰에서는 테두리(border)나 구분선(divider)과 같이 아이템들을 동적으로 데코레이팅하는 것이 어려웠습니다. 더 나아가 리사이클러뷰의 RecyclerView.ItemDecorator 클래스는 개발자로 하여금 다양한 부분을 제어할 수 있도록 해줍니다. 하지만 시간이 조금 걸리고 복잡하기는 합니다.

    5. 아이템 터치 리스너(OnItemTouchListener)

      리스트뷰의 AdapterView.OnItemClickListener 인터페이스 덕분에 리스트뷰에서 아이템 클릭을 가져오는 것은 간단했습니다. 나아가 리사이클러뷰의 RecyclerView.OnItemTouchListener는 개발자가 더 강력하고 많은 제어를 할 수 있도록 해줍니다. 하지만 이는 조금 복잡한 일이기는 합니다.

    단점

    1. 리스트뷰보다 조금 더 복잡합니다.

    2. 초보자가 리사이클러뷰를 완전히 이해하는 데에는 시간이 많이 걸릴 수도 있습니다.
    3. 코딩이 불필요하게 어려워질 수도 있습니다.
    4. 리스트뷰를 작업할 때보다 더 많은 시간을 들여야 할 것입니다.

Comments