본문 바로가기
Android Q&A/Android One a day

[안드로이드 면접] - 8 :

by 후추부 2023. 1. 31.

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