[Android] SparseArray에 대하여

2025. 9. 14. 00:08·Android

SparseArray는 정수(int)를 객체(Object)에 매핑하는 안드로이드에 최적화된 자료구조입니다. 일반적인 배열과 달리 인덱스가 연속적일 필요가 없어 중간에 값이 비어 있는(gap) 형태도 허용합니다.

이 클래스는 HashMap<Integer, Object>를 사용하는 것보다 메모리를 더 효율적으로 쓰도록 설계되었습니다.

 

🍋‍🟩 SparseArray의 주요 특징

  1. 메모리 효율성
    키-값 매핑을 위해 HashTable을 사용하는 HashMap과 달리 SparseArray는 오토박싱(int → Integer 변환)이 필요 없습니다. 각 엔트리를 별도의 객체로 포장하지 않고, 내부 배열에 직접 저장하기 때문에 훨씬 적은 메모리를 소비합니다.
  2. 성능
    매우 큰 데이터 셋의 경우 HashMap만큼 빠르지는 않지만, SparseArray는 메모리 최적화 덕분에 중간 크기의 데이터 셋에서 더 나은 성능을 제공합니다.
  3. Null 키 값 사용 불가
    SparseArray는 키 값으로 기본 정수를 사용하므로 키 값에 Null 사용을 허용하지 않습니다.
  4. 삭제 최적화
    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
'Android' 카테고리의 다른 글
  • [Android] 안드로이드의 Looper, Handler, HandlerThread 이해하기
  • [Android] 런타임 권한(runtime permissions) 처리
  • [Android] ActivityManager란?
  • [Android] 화면 회전과 같은 구성 변경이 발생할 때 Activity에 생기는 변화
yenim
yenim
    반응형
  • yenim
    FOREST, FOR REST
    yenim
  • 전체
    오늘
    어제
    • 분류 전체보기 (235)
      • Android (9)
      • Baekjoon (142)
        • 구현 (3)
        • 브루트포스 (10)
        • BFS (12)
        • DFS (13)
        • 백트래킹 (3)
        • DP (26)
        • 최소 스패닝 트리 (1)
        • 이분 탐색 (10)
        • 그리디 알고리즘 (12)
        • 투포인터 (2)
        • 슬라이딩 윈도우 (2)
        • 다익스트라 (1)
        • 시뮬레이션 (6)
        • 분할 정복 (3)
        • 문자열 (9)
        • 정렬 (6)
        • 탐색 (2)
        • 수학 (20)
        • 링크드리스트 (1)
      • 프로그래머스 (15)
        • 구현 (4)
        • 브루트포스 (4)
        • DFS (1)
        • DP (1)
        • HEAP (1)
        • 문자열 (3)
        • 해시 (0)
        • 비트 (1)
      • CS (39)
        • 개발상식 (9)
        • 자료구조 (8)
        • 네트워크 (7)
        • 운영체제 (5)
        • 데이터베이스 (4)
        • 디자인패턴 (1)
        • 알고리즘 (5)
      • Programming Languages (3)
        • C & C++ (2)
        • Kotlin (1)
      • 취준 (7)
      • Git (2)
      • Google Online Challenge (4)
      • 에러 해결 (6)
      • WEB (0)
      • NOTE (3)
      • DIARY (3)
      • 알고리즘 (1)
  • 블로그 메뉴

    • 🏡 HOME
    • ✏️ TIL
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    그래프
    CS
    그리디 알고리즘
    문자열
    DP
    백준
    명품 자바프로그래밍
    깊이우선탐색
    너비우선탐색
    DFS
    브루트포스
    프로그래머스
    다이나믹 프로그래밍
    BFS
    코테
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
yenim
[Android] SparseArray에 대하여
상단으로

티스토리툴바