Equatable와 Hashable 프로토콜
2025. 2. 1. 22:14ㆍiOS
SwiftUI와 같은 선언형 UI 프레임워크에서는 데이터의 변화
에 따라 뷰를 자동으로 업데이트하는 기능이 핵심입니다.
- Equatable
- Equatable 프로토콜은 두 인스턴가 동일한지 여부를 판단할 수 있도록 해줍니다.
- 프로토콜을 채택하면,
==
연산자를 통해 객체 또는 값의 동일성을 비교할 수 있습니다. - Swift 컴파일러는 모든 맴버가 이미 Equatable을 채택한 구조체의 경우, 자동으로
==
연산자를 합성해줍니다. - 상태변화 감지 -> SwiftUI는 뷰의 변경 사항을 감지할 때, 이전 값과 새로운 값을 비교하는데, 만약 해당 값이 Equatable을 채택하고 있다면, 두 값을 비교하여 실제로 변경되었을 때만 뷰를 업데이트하도록 최적화할 수 있습니다.
- 불필요한 렌더링 방지:
onChanged
같은 핸들러나 애니메이션 처리시에 값의 변화가 실제로 달라졌는지를 비교해 불필요한 뷰 업데이트를 줄일 수 있습니다.
- Hashable
- Hashable 프로토콜은 인스턴스를 해시 값으로 변환할 수 있도록 해줍니다.
- 이는 인스턴스를 집합(Set)이나 딕셔너리의 키로 사용할 수 있게 하며, 각
인스턴스의 고유성
을보장
하는 역할을 합니다. - 모든 Hashable 타입은 내부적으로 Equatable을 채택해야 하므로, 두 프로퍼티의 동일성도 판단할 수 있습니다.
- 컴퍼일러는 모든 멤버가 Hashable이면 자동으로 해시 함수를 합성합니다.
- SwiftUI의 ForEach나 List는 컬렉션의 각 요소를 고유하게 식별해야 합니다.
- 만약 데이터 모델이 Identifiable 프로토콜을 채택하지 않았다면, ForEach 에서 id:.self 혹은 특정 프로퍼티를 전달하여 각 요소를 식별해야합니다. 이때, 해당 타입은 반드시 Hashable이어야 합니다.
Equatable와 Hashable 차이점
- Equatable
- 목적: 두 인스턴스가 동일한지 여부를 비교합니다.
- 활용: 값의 변경 여부를 판단하거나,
onChanged
핸들러 등에서 이전과 새 값의 비교에 사용됩니다.
- Hashable
- 목적: 인스턴스를
해시 값
으로 변환하여, 집합(Set)이나 딕셔너리의 키로 사용하거나 고유성을 보장합니다. - 활용: ForEach의 식별자, 데이터의 diffing, 그리고 컬렉션 내 요소의 중복 여부 판단 등 사용됩니다.
- 목적: 인스턴스를
- Hashable 은 Equatable 을 포함한다.
- Hashable 프로토콜을 채택하기 위해서는 해당 타입이 Equatable이어야 합니다. 즉, 해시 값을 생성할 때도 동일성 비교가 필요합니다.
SwiftUI에서 Equatable과 Hashable 프로토콜의 채택은 효율적인비교, 데이터식별, 그리고 뷰 업데이트 최적화 등 여러 역할을 합니다.
Equatable은 값의 동일성 비교를 통해 상태 변화 감지와 불필요한 렌더링을 방지하는 데 기여합니다.
Hashable은 데이터 모델의 고유성을 보장하여, ForEach
나 List
에서 요소를 식별하고 diffing 알고리즘이 원활하게 작동하도록 돕습니다.
데이터 모델에 UUID
와 같은 고유 식별자를 사용하거나, onChanged
핸들러에서 값의 변화를 비교할 때, Equatable과 Hashable의 채택은 코드의 안정성과 효율성을 크게 높여줍니다.
'iOS' 카테고리의 다른 글
Completion(escaping) 와 Combine (0) | 2025.01.26 |
---|---|
비동기 테스트 (1) | 2024.07.08 |
컴파일 최적화 방법 (0) | 2024.05.05 |
Concurrency (await) (0) | 2024.04.16 |
스파게티코드 해결방안 고민하기 (3) | 2024.04.15 |