Android SparseArray

heetaeheo·2022년 6월 28일
0
post-thumbnail

SparseArray

공식문서에서 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란?

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

SparseArray 장점

성능향상을 위해 특정 Key-Value 매핑 데이터 제거 시에 실제로 제거하여 배열 컴팩팅을 진행하는 것이 아닌 Deleted 상태로 표시만 해둡니다. 만약 해당 Value를 가리키는 Key에 또 다른 데이터가 추가된다면 다시 채워집니다. 이러한 최적화 덕에 삭제 연산 효율이 높아집니다.

SparseArray 단점

인덱스 사이에 공간이 존재하는 만큼 크기가 커지기 때문에 동작이 느립니다. 또한 Android에서만 사용이 가능합니다.

코드 예시

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)
}

SparseArray 사용 주의점

배열 구조로 Key -> Value 매핑 정보를 저장하고, 해당 배열을 이분 탐색하여 키를 찾게됩니다. 이러한 특성 때문에 매우 많은 수의 아이템을 저장하는 상황에서는 그리 적합하지 않습니다.

적절히 적은 데이터를 매핑할 때는 유용하게 사용될 매핑 배열인거 같습니다.

0개의 댓글