본문 바로가기
Android Kotlin

Android SDK SparseArray 알아보기

by 히예네 2024. 7. 7.
728x90
반응형

kotlin 공식 문서에서 제공하는 collection overview이다. (잘 아는 List , Set , Map...) 

https://kotlinlang.org/docs/collections-overview.html

그리고 kotlin 공식문서에 sparseArray를 검색하면 정보가 나오지 않는다. 🤔 

왜냐하면 kotlin에서 제공하는 collection이 아니고, Android SDK이다. 

 

SparseArray가 무엇인가?

공식문서 해석해보기 ! 

SparseArray maps integers to Objects and, unlike a normal array of Objects, its indices can contain gaps. SparseArray is intended to be more memory-efficient than a HashMap, because it avoids auto-boxing keys and its data structure doesn't rely on an extra entry object for each mapping.

 

SparseArray는 정수 키 값으로 객체와 매핑하고 (key를 이진검색해서 찾아야하기때문에), 그냥 array와 다르게 인덱스 중간 중간 빈 값도 가능하다. SparseArray는 auto-boxing을 하지 않기때문에 HashMape보다 메모리 효율적이다. 

 

Note that this container keeps its mappings in an array data structure, using a binary search to find keys. The implementation is not intended to be appropriate for data structures that may contain large numbers of items. It is generally slower than a HashMap because lookups require a binary search, and adds and removes require inserting and deleting entries in the array. For containers holding up to hundreds of items, the performance difference is less than 50%.

 

SparseArray는 Array 구조로 데이터를 매핑, key를 이분 검색(검색 범위를 좁히는 행위)을 이용해서 찾는다. 그래서 item를 많이 포함하는 data 구조에는 적합하지 않을수있다. 이런 이분 검색과 add and delete하는 작업으로 인해 HashMap보다는 느릴수있다. (수백개의 아이템을 담는 컨테이너라면, 퍼포먼스 성능 차이는 50% 미만)

 

To help with performance, the container includes an optimization when removing keys: instead of compacting its array immediately, it leaves the removed entry marked as deleted. The entry can then be re-used for the same key or compacted later in a single garbage collection of all removed entries. This garbage collection must be performed whenever the array needs to be grown, or when the map size or entry values are retrieved.

 

퍼포먼스 향상을 위해, key 제거 시, 최적화 기능을 제공한다. 즉시 배열의 크기를 줄이는 대신, 그 인덱스 항목을 제거한 것으로 표시한다. 이 인덱스를 재사용하면 다시 채워진다. 나중에 삭제된 항목들은 일괄적으로 처리하는 "garbage collection"를 수행한다. 

 

It is possible to iterate over the items in this container using keyAt(int) and valueAt(int). Iterating over the keys using keyAt(int) with ascending values of the index returns the keys in ascending order. In the case of valueAt(int), the values corresponding to the keys are returned in ascending order.

 

SparseArray는 오름차순으로 정렬되어있다. 인덱스를 증가시키면서 반복하면 key에 해당하는 매핑값을 얻을 수 있다. 

 

 

속도 vs 메모리를 생각해서 collecion을 잘 선택해야한다. 

 

int를 key값으로 사용하다면 sparseArray를 사용하는것이 메모리 면에서 좀 더 효율적일 것이다. (1000개이상의 수 많은 항목을 다루는게 아니라면... 이런건 거의 없다. ) 

 

728x90
반응형