[ Swift ] Hashable 타입이란?

김보람's avatar
Nov 04, 2025
[ Swift ] Hashable 타입이란?

Hashable“이 값이 고유하게 식별될 수 있다”는 것을 Swift에게 보장하는 프로토콜이다.
조금 더 정확히 말하면, 값의 동일성(identity)을 빠르고 안정적으로 비교하기 위한 규약이다.


1. Hashable의 정체

protocol Hashable {
    func hash(into hasher: inout Hasher)
}
  • 객체의 내용을 해시값(hash value) 으로 변환하는 규칙을 정의

  • Swift는 이 해시값을 이용해

    • 동일한 값인지 판단

    • 컬렉션 내부에서 빠르게 탐색

즉,

Hashable = “이 값은 다른 값들과 구분될 수 있다”는 계약


2. 왜 Hashable이 필요한가

Swift에는 Hashable을 전제로 동작하는 구조들이 있다.

대표적인 사용처

  • Set

  • Dictionary의 key

  • UICollectionViewDiffableDataSource

  • NSDiffableDataSourceSnapshot

이 구조들은 순서(index)가 아니라 값 자체로 항목을 관리한다.


3. Diffable Data Source에서 Hashable의 의미

typealias Item = AppleFramework

Diffable Data Source에서 Item이 Hashable이라는 것은 다음을 의미한다.

“이 아이템이 이전 스냅샷의 어떤 아이템과 같은지 판단할 수 있다”

왜 중요한가?

Diffable은 내부적으로 다음 질문을 계속 던진다.

  • 이 아이템은 기존에 있던 것인가?

  • 값만 바뀐 것인가?

  • 새로 추가된 것인가?

  • 삭제된 것인가?

이 판단의 기준이 바로 Hashable이다.


4. Hashable을 잘못 정의하면 생기는 문제

예시 1: 모든 프로퍼티를 해시에 포함한 경우

struct AppleFramework: Hashable {
    let name: String
    let description: String
}

이 경우,

  • description만 바뀌어도

  • “완전히 다른 아이템”으로 인식됨

→ 셀 삭제 + 재생성 발생


5. 재생성을 막기 위함 이라고 이해해도 되는가

정확히는 ‘재생성이 발생하지 않도록 identity를 보장하기 위해서라고 이해하고 넘어가자

- Hashable을 잘 정의했을 때

hash / ==  → 고유 ID 기준

Diffable은 이렇게 판단한다.

  • “아, 같은 아이템이네

  • “내용만 바뀌었구나”

셀 유지
→ configuration만 다시 호출

즉,

  • 뷰 계층 유지

  • 스크롤 위치 유지

  • 상태 유지 (선택, 애니메이션 등)

- Hashable을 잘못 정의했을 때

hash / == → 모든 프로퍼티 기준

Diffable 판단:

  • “완전히 다른 아이템이다”

  • “기존 건 삭제하고 새로 추가해야겠다”

→ 셀 재생성 발생

Share article

RN 삽질 일지