SparseArray는 정수(int)를 객체(Object)에 매핑하는 안드로이드에 최적화된 자료구조입니다. 일반적인 배열과 달리 인덱스가 연속적일 필요가 없어 중간에 값이 비어 있는(gap) 형태도 허용합니다.
이 클래스는 HashMap<Integer, Object>를 사용하는 것보다 메모리를 더 효율적으로 쓰도록 설계되었습니다.
🍋🟩 SparseArray의 주요 특징
- 메모리 효율성
키-값 매핑을 위해 HashTable을 사용하는 HashMap과 달리 SparseArray는 오토박싱(int → Integer 변환)이 필요 없습니다. 각 엔트리를 별도의 객체로 포장하지 않고, 내부 배열에 직접 저장하기 때문에 훨씬 적은 메모리를 소비합니다. - 성능
매우 큰 데이터 셋의 경우 HashMap만큼 빠르지는 않지만, SparseArray는 메모리 최적화 덕분에 중간 크기의 데이터 셋에서 더 나은 성능을 제공합니다. - Null 키 값 사용 불가
SparseArray는 키 값으로 기본 정수를 사용하므로 키 값에 Null 사용을 허용하지 않습니다. - 삭제 최적화
SparseArray는 항목을 삭제할 때 즉시 배열을 정리하지 않습니다. 삭제된 항목은 "삭제됨" 표시만 남기고 자리를 유지하며, 같은 키가 다시 들어올 경우 그 자리를 재활용하게 됩니다. 이후 배열이 커져야 하거나, 크기/값 조회가 필요한 경우 한 번에 가비지 컬렉션(compaction)으로 배열을 정리하게 됩니다.
🍋🟩 동작 방식
내부적으로 배열에 데이터를 저장하며, 키를 찾을 때는 이진 탐색(binary search)을 사용합니다. 데이터가 많거나 자주 삽입/삭제가 일어나는 경우에는 적합하지 않습니다.
- 조회(lookup):
HashMap보다 느림 (이진 탐색 필요) - 추가/삭제: 배열에 삽입/삭제 작업이 필요하므로 비용이 큼
다만, 수백 개 정도의 항목까지는 성능 차이가 50% 미만이라 HashMap 대신 SparseArray을 사용해도 괜찮습니다.
🍋🟩 SparseArray의 사용
SparseArray의 사용법은 간단하며, HashMap과 유사한 형태로 사용할 수 있습니다.
import android.util.SparseArray
val sparseArray = SparseArray<String>()
// 값 추가
sparseArray.put(1, "One")
sparseArray.put(2, "Two")
// 요소 접근
val value = sparseArray[1] // "One"
// 요소 제거
sparseArray.remove(2)
// 요소 순회
for (i in 0 until sparseArray.size()) {
// 주어진 인덱스 위치의 키를 반환(인덱스를 오름차순으로 증가시키면 키도 오름차순으로 반환됨)
val key = sparseArray.keyAt(i)
// 해당 인덱스 키에 연결된 값을 반환(키 순서에 따라 값도 정렬된 순서로 반환됨)
val value = sparseArray.valueAt(i)
println("Key: $key, Value: $value")
}
🍋🟩 SparseArray의 한계
SparseArray는 메모리 효율적이나 모든 사용 사례에 항상 적합한 것은 아닙니다. 위에서 한번 언급했듯이 SparseArray의 요소 접근은 키 조회를 위해 이진 탐색(binary search)을 사용하기 때문에 매우 큰 데이터 셋의 경우 HasgMap보다 느립니다. 또한, 키가 정수로만 제한되어 다른 유형의 키가 필요한 사용 사례에는 적합하지 않습니다.
🔗 참고
- Manifest Interview Android
- https://developer.android.com/reference/android/util/SparseArray
반응형
'Android' 카테고리의 다른 글
| [Android] 안드로이드의 Looper, Handler, HandlerThread 이해하기 (0) | 2025.09.17 |
|---|---|
| [Android] 런타임 권한(runtime permissions) 처리 (1) | 2025.09.14 |
| [Android] ActivityManager란? (0) | 2025.09.13 |
| [Android] 화면 회전과 같은 구성 변경이 발생할 때 Activity에 생기는 변화 (0) | 2025.08.31 |
| getJSONArray vs OptJSONArray (0) | 2023.06.18 |