코린이 탈출기
chapter 6.8 - 리스트뷰의 재사용성에 대한 이해 본문
앞의 chapter 6의 내용은 리스트뷰를 직접 사용하는 것을 위주로 다루었습니다.
이번에는 코드 작성을 하는 것이 아닌 리스트뷰의 이론에 대해 자세하게 다루어보겠습니다.
안드로이드 앱은 램이라는 핸드폰의 메모리를 저장하는 곳이 있습니다.
앱을 실행할 때 한 화면에 너무 많은 수의 View들을 배치하면 램이 부족하여 앱이 죽게 됩니다.
즉, 핸드폰 메모리의 용량 초과로 앱이 강제로 종료됩니다.
이 에러를 OOM(Out Of Memory) 발생했다고 표현합니다.
상황에 따라서는 굉장히 많은 수의 목록을 View로 표현하는 경우도 있는데, 예를 들면 인스타그램이나 페이스북 등의 뉴스피드 형식의 앱들이 있습니다.
앱을 보면 거의 무제한으로 데이터가 쌓이고 심지어 제일 처음으로(맨 위로) 돌아가더라도 정보는 그대로 있는데 앱은 죽지 않습니다.
이런 앱들은 그 많은 데이터들을 어떻게 해서 메모리의 부족을 피하는 것인지 즉, OOM 발생을 피하는 것인지에 대한 의문이 생길 것입니다.
그 해답은 리스트뷰가 어떻게 동작되는 것인지를 알아보면 해결될것입니다.
약간의 힌트로는 제목에서 사용하는 재사용성이라는 단어와 리스트뷰를 처음 다루었던 chapter 6.1에서 ListView 대신 RecycleView로 대체된다고 설명해드린 것입니다.
ListView가 발전된 것이 RecycleView라고 생각하시면 됩니다.
실제 리스트뷰에 표현하고 싶은 UI가 100개더라도 화면에 담을수 있는 UI의 숫자만큼만 만들어서 재사용합니다.
즉, 화면에 벗어난 UI는 다음 빈 공간에 다시 끌고 와서 사용한다는 뜻입니다.
마치 저글링을 하듯이 빈 공간에는 이제 사용할 필요가 없는 것을 다시 가져와 채운다는 느낌이죠.

위의 그림으로 설명해보겠습니다. 학생이름과 나이를 표현한 한 칸은 getView라는 것이 한 번 실행이 되는 것입니다.
제일 위에 있는 position은 0으로 시작합니다.
실제 화면에는 8개의 View만 담을 수 있습니다.
하지만 100개의 View를 담고 싶을 경우에 100개의 View를 만든다면 OOM이 발생합니다.
하지만 리스트뷰를 사용하면 100개의 View를 실제로는 화면에 채울 8개의 View만 사용합니다.
위 그림처럼 8개 외의 다른 정보를 보고 싶어서 아래로 스크롤을 내리면 화면에서 벗어난(파란색 네모 칸이 화면이라고 보시면 됩니다.) View들이 다시 내려와 빈 공간을 채우는 것입니다.
이처럼 재활용을 하는 것이 코드에도 반영이 되어있습니다.
한 칸의 목록을 만드는 것을 inflate라고 합니다.
즉, 한 칸을 만들 때 마다 inflate가 한 번씩 사용된다는 의미입니다.
하지만 inflate는 UI를 추가하는 것이어서 실행하는데 많은 비용과 메모리가 소모됩니다.
만약 너무 많은 수의 View를 배치한다면 inflate를 너무 많이 실행해야합니다.
inflate를 많이 실행한다는 것은 메모리를 많이 소모한다는 것이고 결국 OOM이 발생하게 됩니다.
그래서 OOM 발생을 막기 위해서는 inflate 실행 횟수를 최소화하여하 한다는 것이므로 모든 줄에 대해 xml을 새로 inflate하지 않고 필요한 최소한의 횟수만 실행되게 코딩을 하여야 합니다.
즉, 화면에 목록을 표시하기 위해 필요한 최소의 개수만 이용여 목록에 표시할 만큼의 아이템만 그리고 스크롤을 이동할 때에는 기존에 그려둔 아이템을 비어있는 해당 자리로 이동시켜 "재사용"한다는 의미입니다.
이런 방법으로 리스트뷰에는 구현이 되어있습니다.
앞에서 코딩한 것에도 반영이 되어있습니다.
이전 발행 글을 참고하셔도 되고 아래의 사진으로 가져온 것을 참고하셔도 됩니다.

inflate라는 기능은 getView 함수 내에 코딩을 하였습니다.
27번 줄에서 tempRow는 convertView의 변수로 null인 상태일 때에만 inflate가 실행되도록 코드를 작성하였습니다.
다르게 말하면 상황에 따라 실행을 하는 것으로 되어있습니다.
여기서 convertView란 돌려막기할만한 재료가 있는 것인지에 대한 내용이 담겨있습니다.
즉, 빈칸을 채울만한 재료가 있는지에 대한 내용이 담겨있습니다.
코드를 다시 해석해보면 convertView를 tempRow라는 변수로 저장하였습니다.
만약 tempRow가 null이면 즉, 돌려 막기 할 재료가 있는지를 물었을 때 없다는 의미의 null이 뜨면 그때 inflate 해서 새로운 한 칸의 목록을 만든다는 의미입니다.
만약 tempRow가 null이 아니라면 inflate를 안한다는 의미이기도 합니다.
즉, 돌려 막기 할 재료가 있다면 inflate를 하지 않고(새로운 한 칸을 목록으로 만들지 않고) 재사용한다는 뜻입니다.
chapter6은 리스트뷰에 대해 다루었는데 다음 chapter7은 코틀린 언어로 객체지향에 대해 다룰 예정입니다.
'인터넷 강의 > 클래스101 - 비전공자들을 위한 나만의 안드로이드 앱 만들기' 카테고리의 다른 글
| chapter 7.2 - 코틀린 문법 + 객체지향개념 (1) - 생성자 이용하기 (0) | 2021.05.14 |
|---|---|
| chapter 7.1 - 코틀린 문법 - 함수 (0) | 2021.05.13 |
| chapter 6.7 - 리스트뷰의 부가 기능 (2) - 내용물 변경 사항 반영하기 (0) | 2021.05.11 |
| chapter 6.6 - 리스트뷰의 부가 기능 (1) - 이벤트 처리 - setOnItemClickListener (0) | 2021.05.11 |
| chapter 6.5 - 리스트뷰 만들기 (4) - 실제 데이터 리스트뷰에 반영하기 - getView 함수 수정 (0) | 2021.05.11 |