[ Swift ] Hashable 타입이란?
![[ Swift ] Hashable 타입이란?](https://image.inblog.dev?url=https%3A%2F%2Finblog.ai%2Fapi%2Fog-custom%3Ftitle%3D%25EB%25A7%25A4%25EC%259D%25BC%2B%25EC%259E%2591%25EC%258B%25AC%25EC%2582%25BC%25EC%259D%25BC%2B%25EC%258A%25A4%25EC%259C%2584%25ED%2594%2584%25ED%258A%25B8%26tag%3DTemplate%2B1%26description%3DHashable%26template%3D3%26backgroundImage%3Dhttps%253A%252F%252Fsource.inblog.dev%252Fog_image%252Fdefault.png%26bgStartColor%3D%2523ffffff%26bgEndColor%3D%2523ffffff%26textColor%3D%2523000000%26tagColor%3D%2523000000%26descriptionColor%3D%2523000000%26logoUrl%3Dhttps%253A%252F%252Fsource.inblog.dev%252Flogo%252F2025-12-16T12%253A03%253A47.222Z-d8d97220-fd9e-44d1-a12e-f346a8b6629e%26blogTitle%3DRN%2B%25EC%2582%25BD%25EC%25A7%2588%2B%25EC%259D%25BC%25EC%25A7%2580&w=3840&q=75)
Hashable은 “이 값이 고유하게 식별될 수 있다”는 것을 Swift에게 보장하는 프로토콜이다.
조금 더 정확히 말하면, 값의 동일성(identity)을 빠르고 안정적으로 비교하기 위한 규약이다.
1. Hashable의 정체
protocol Hashable {
func hash(into hasher: inout Hasher)
}
객체의 내용을 해시값(hash value) 으로 변환하는 규칙을 정의
Swift는 이 해시값을 이용해
동일한 값인지 판단
컬렉션 내부에서 빠르게 탐색
즉,
Hashable = “이 값은 다른 값들과 구분될 수 있다”는 계약
2. 왜 Hashable이 필요한가
Swift에는 Hashable을 전제로 동작하는 구조들이 있다.
대표적인 사용처
SetDictionary의 keyUICollectionViewDiffableDataSourceNSDiffableDataSourceSnapshot
이 구조들은 순서(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 판단:
“완전히 다른 아이템이다”
“기존 건 삭제하고 새로 추가해야겠다”
→ 셀 재생성 발생