1. recyclerView 와 listView 차이는?
listView 는 recyclerView 에 유연성 있는 view를 만들기 위해선 recyclerview 에 비해서 뷰 커스텀 작업에 대한 유연성이 떨어지는 단점이 있다. 또한, listView 는 view 를 그릴 때마다 findViewById() 를 호출하기 때문에 성능 저하 문제가 발생한다.
이 점을 ViewHolder 패턴으로 해결할 수 있지만, recyclerview 는 이 부분을 강제하지만, listview 는 강제하지 않아 일일이 ViewHolder 생성코드를 직접 작업해줘야 하고 자칫 깜빡하는 경우가 빈번히 발생한다. 고로 이 부분이 상대적으로 단점이 된다.
💡유연성 있는 view 란?
item layout 을 다양하게 적용이 가능하다. 세로만 지원한 listview 는 가로/세로/지그재그 모두 지원이 가능하며, 아이템 애니메이션 또한 가능하다.
2. listView 가 recyclerView 보다 성능이 안 좋을까?
결과적으로 그렇다. recyclerview 가 성능도 좋고, 메모리에 부담이 덜 간다.
일반적으로 뷰를 매 번 인플레이팅하는 작업은 매우 무거운 작업이기 때문에 매끄러운 스크롤을 보장하지 못한다.
그래서 listView 에는 ConvertView 가 존재한다.
실제 화면에 그려지는 아이템을 ConvertView 라는 배열로 관리하는데, 화면에 보여지는 만큼 ConvertView 를 생성하고 스크롤 시 View 를 재활용하기 때문에 메모리 낭비를 하지 않는다.
view 재활용으로 인한 메모리 낭비를 개선하는 점은 있지만, 정작 데이터 셋팅할 때 매번 findViewById() 를 통해 다시 뷰-데이터 재연결을 해야한다. 이 과정에서도 findViewById() 가 고비용일 우려가 있기 때문에 비용이 크게 발생하게 된다.
💡ConvertView 동작은?
ConvetView 가 null 이 아닌 경우에는 기존의 View 를 재사용하기 때문에 새롭게 View 를 inflate 할 필요 없이 데이터만 바꾸는 작업을 진행하면 된다. 반대로 ConverView 가 null 일 경우는 layout 을 inflate 하도록 구현되는데, 이 때 아이템 값을 set 하기 위해서 findViewById() 가 호출된다.
3. ViewHolder 패턴이란?
각 뷰의 객체를 ViewHolder 에 보관함으로 써 뷰의 내용을 업데이트하기 위한 findViewById() 메소드 호출을 줄여 효과적으로 퍼포먼스를 개선할 수 있는 패턴이다.
ViewHolder 패턴을 사용하면, 한 번 생성하여 저장했던 뷰는 다시 findViewById() 를 통해 뷰를 불러올 필요가 사라지게 된다.
고로 성능저하 이슈를 개선할 수 있다.
💡findViewById() 가 왜 고비용일까?
사실 일반 view 에 대한 findViewById 는 비용이 클 이유는 없다. 그 이유는 간단하다 자기 자신의 ID 만 확인하기 때문이다.
하지만, 뷰에 데이터 매칭을 하기 위해선 여러 개의 자식 뷰를 포함하고 있는 레이아웃이나 ViewGroup 내 자식 view가 많을수록 자신과 하위 자식뷰까지 모두 확인하는 과정이 필요하다. 이 과정은 트리 DFS 탐색과도 같다.
이렇게 매번 자식뷰를 모두 확인해서 가져오는 과정은 어쩔 수 없이 비용이 크게 발생한다.
4. Adapter 란?
하나의 Object(객체)로서 보여지는 View 와 그 View 에 올릴 데이터를 연결하는 일종의 Bridge 다.
데이터의 원본을 받아 관리하고, Adapter View 가 출력할 수 있는 형태로 데이터를 제공하는 중간 객체 역할을 한다.
리사이클러뷰 어댑터는 onCreateViewHolder, onBindViewHolder, getItemCount 함수가 존재한다.
getItemCount -> onCreateViewHolder -> onBindViewHolder 순으로 함수가 호출된다.
onCreateViewHolder : 뷰홀더를 생성하는 메소드
onBindViewHolder : 계속적인 뷰홀더를 생성하는 게 아닌, 제한적으로 생성해내며 이후에는 해당 메서드를 통해 생성된 뷰홀더를 계속 재활용하여 데이터를 바인딩함.
💡Adpater View 란?
Adapter 가 data 를 가공해서 제공하는 객체라면, Adapter View 는 데이터를 출력하는 역할이다.
많은 정보를 효율적으로 처리하기 위해 View 에 데이터를 제공하지 않고, Adapter 라는 객체를 이용하기에 정해진 이름이다.
예시를 들면 RecylcerView 는 Adapter 를 필요로한다.
해당 Adapter 는 리스트를 화면에 표시하기 위해 아이템 단위로 View 를 생성하여 RecyclerView 에 바인딩 시키는 작업을 한다.
5. Android Inflation 이란?
XML 레이아웃 파일에 비치된 리소스들이 setContentView() 나 LayoutInflator 객체를 통해 메모리 상에 실제로 객체화되어 애플리케이션에 보여지는 과정을 뜻한다.
setContentView() :
xml 레이아웃을 메모리 상에 객체화하는 역할
화면에 나타내는 뷰를 지정하는 역할
LayoutInflator 객체 :
setContentView 가 xml 파일의 모든 뷰를 객체화 시켜준다면, 해당 객체는 일부 뷰만 객체화를 시켜준다.
'Android Q&A > Android One a day' 카테고리의 다른 글
[안드로이드 면접] - 10 : (0) | 2023.02.02 |
---|---|
[안드로이드 면접] - 9 : (0) | 2023.02.01 |
[안드로이드 면접] - 7 : (0) | 2023.01.30 |
[안드로이드 면접] - 6 : (0) | 2023.01.29 |
[안드로이드 면접] - 5: (0) | 2023.01.28 |