Nuke Olaf - Log Store

[Android] 안드로이드 - SparseArray 란 무엇인가 본문

Android

[Android] 안드로이드 - SparseArray 란 무엇인가

NukeOlaf 2019. 12. 16. 16:43

1. Sparse 의 뜻

영영사전에서 말하는 sparse 의 뜻이란 다음과 같다

 https://dictionary.cambridge.org/ko/%EC%82%AC%EC%A0%84/%EC%98%81%EC%96%B4/sparse

" small in numbers or amount, often spread over a large area "

" 적은 수 또는 양으로, 종종 넓은 지역에 퍼짐 "

 

네이버 영어사전에서는 다음과 같이 말한다.

https://endic.naver.com/enkrEntry.nhn?sLn=kr&entryId=9f4820defe6e4276bfed533d8ed97cd3

(흔히 넓은 지역에 분포된 정도가) 드문, (밀도가) 희박한

Array 란 길이가 제한되어 있는 자료형의 집합을 의미한다고 배웠다. 그렇다면 SparseArray 란 밀도가 희박한 배열이라는 뜻이라고 생각할 수 있을 것 같다.

 

2. IT 사전에서 말하는 SparseArray 란 

SparseArray 는 Android 에서 사용하는 데이터 저장 방식이기 때문에 안드로이드 개발자 문서에서 관련 내용을 찾아볼 수 있었다.

https://developer.android.com/reference/android/util/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는 정수를 객체에 매핑하며 일반적인 객체 배열과 달리 색인에는 간격이 있을 수 있습니다. SparseArray는 자동 박싱 키를 피하고 데이터 구조가 각 매핑에 대해 추가 입력 개체에 의존하지 않기 때문에 HashMap보다 메모리 효율성이 뛰어납니다. "

 해당 문서의 설명으로 미루어 보아 SparseArray 란, 넓은 지역에 퍼져있는, 밀도가 희박한 이라는 뜻처럼 데이터의 인덱스 사이에 공간을 만들 수 있는 배열이라고 해석할 수 있겠다.

 

3. 그래서 SparseArray 가 무엇인가?, SparseArray 를 왜 쓰는가?

SparseArray 란 Android 어플리케이션의 성능 향상을 위해 만들어진 데이터 구조라고 볼 수 있다. SparseArray 를 사용하는 것이 ArrayMap, HashMap 을 사용하는 것보다 메모리 효율성에서 더 뛰어나다고 한다.

SparseArray 의 키 값은 항상 primitive 타입이다. 그래서 키 값으로 primitive 타입을 사용하는 경우, HashMap 대신에 SparseArray 를 사용하여 메모리 낭비를 줄일 수 있다. 또한, SparseArray 는 Auto-Boxing 문제(https://android.jlelse.eu/autoboxing-a-little-thing-can-cause-big-problems-for-android-app-performance-1fb6cb1e48dd)를 제거하도록 설계되었기 때문에 ArrayMap, HashMap 보다 상대적으로 메모리를 적게 소모할 수 있다고 한다.

Continuous allocation and de-allocation of memory along with garbage collection will cause lag in Android application and it reduces the application performance. Other than this ArrayMap & SparseArray avoid memory problem by using 2 small arrays rather than one big one.

HashMap 대신 SparseArray 를 사용할 때의 장점:

· More memory efficient by using primitives (원시형 타입을 사용함으로써 메모리 효율성 증가)

· No auto-boxing (Auto-boxing 문제의 해결)

· Allocation-free

단점:

· For large collections, it is slower (인덱스 사이에 공간이 존재하는 만큼, 크기가 커지기 때문에 느리다)

· It only available for Android (안드로이드에서만 사용할 수 있다)

In general if inserts or deletes are fairly infrequent, and the number of items is < 1000 then ArrayMap / SparseArray classes are really good replacement classes.

 

4. SparseArray 를 어떻게 쓰는가?

1
2
3
4
5
6
7
8
9
10
11
12
private val DEFAULT_ORIENTATIONS = SparseIntArray().apply {
        append(Surface.ROTATION_0, 90)
        append(Surface.ROTATION_90, 0)
        append(Surface.ROTATION_180, 270)
        append(Surface.ROTATION_270, 180)
    }
    private val INVERSE_ORIENTATIONS = SparseIntArray().apply {
        append(Surface.ROTATION_0, 270)
        append(Surface.ROTATION_90, 180)
        append(Surface.ROTATION_180, 90)
        append(Surface.ROTATION_270, 0)
    }
 

 

참고한 사이트 >>

https://developer.android.com/reference/android/util/SparseArray

https://android.jlelse.eu/app-optimization-with-arraymap-sparsearray-in-android-c0b7de22541a

https://developer88.tistory.com/91

https://log.hanjava.net/post/30231660090/map-hashmap-%EA%B7%B8%EB%A6%AC%EA%B3%A0-sparsearray

Comments