Equatable와 Hashable 프로토콜

2025. 2. 1. 22:14iOS

SwiftUI와 같은 선언형 UI 프레임워크에서는 데이터의 변화에 따라 뷰를 자동으로 업데이트하는 기능이 핵심입니다.

 

  1. Equatable
  • Equatable 프로토콜은 두 인스턴가 동일한지 여부를 판단할 수 있도록 해줍니다.
  • 프로토콜을 채택하면, == 연산자를 통해 객체 또는 값의 동일성을 비교할 수 있습니다.
  • Swift 컴파일러는 모든 맴버가 이미 Equatable을 채택한 구조체의 경우, 자동으로 == 연산자를 합성해줍니다.
  • 상태변화 감지 -> SwiftUI는 뷰의 변경 사항을 감지할 때, 이전 값과 새로운 값을 비교하는데, 만약 해당 값이 Equatable을 채택하고 있다면, 두 값을 비교하여 실제로 변경되었을 때만 뷰를 업데이트하도록 최적화할 수 있습니다.
  • 불필요한 렌더링 방지: onChanged같은 핸들러나 애니메이션 처리시에 값의 변화가 실제로 달라졌는지를 비교해 불필요한 뷰 업데이트를 줄일 수 있습니다.

  1. 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은 데이터 모델의 고유성을 보장하여, ForEachList에서 요소를 식별하고 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