GGURUPiOS

[Swift] Hashable 이란? Equatable을 준수해야 하는 이유 본문

Swift/문법 파헤치기

[Swift] Hashable 이란? Equatable을 준수해야 하는 이유

꾸럽 2023. 12. 4. 16:42

안녕하세요 

이번시간에는 Hashable에 대해 알아보도록 하겠습니다.

 


Hashable??

 

Hashable은 프로토콜 입니다.

해시 값을 생성할 수 있는 타입을 정의하는 데 사용됩니다.

Set, Dictionary와 같이 해시 기반의 자료 구조에서 요소들을 비교하고 식별하기 위해 활용됨

 

그렇다면 해시값(HashValue) 이라는것은 뭘까요?

주어진 데이터나 객체를 고정된 크기의 숫자로 매핑하는 것을 의미함

해시 함수를 통해 수행되며, 해시 함수는 입력으로 임의의 데이터를 받아서 고정된 길이의 비트열을 생성

-> 디지털 지문 처럼 동작함

 

Hashable은 Equatable을 상속 받은 프로토콜입니다.

따라서 Hashable을 준수하기 위해서는 Equatable 또한 준수해야 합니다

 

Hashable타입 준수

 

기본 타입들의 Hashable

  • String, Int, Bool, Float 같은 기본 유형들은 기본적으로 Hashable 프로토콜을 준수
  • 연관된 값이 없는 열거형, 엘리먼트가 Hashable을 준수하는 배열의 경우 자동으로 Hashable 준수
  • Hashable을 준수하는 프로퍼티들을 가진 구조체, Hashable을 준수하는 연관 값이 있는 열거형의 경우,
    Hashable을 채택하면 자동으로 hash(into:)의 구현을 제공함 (자동으로 Hashable을 준수한다는게 아님)

 

커스텀 타입의 Hashable

1. == 연산자 함수를 제공

2. hash(into:) 메서드 구현

(swift4 이전에는 hashValue를 직접 구현해 해시값을 제공했지만, Swift4 부터는 hash(into:) 메서드 구현을 권장)

 

예제를 통해 알아보자. 

위의 구조 (첫번째 사진) 에서 Food가 Hashable하지 않기 때문에 Person에 == 연산자 함수를 구현해도 오류가 남

 

hash(into:) 메서드를 직접 구현해도 되지만, 그보다는 Food도 Hashable을 채택해서 hash(into:)를
자동으로 구현하게 하는것이 편하고 낫지 않을까?라는 생각.

 

사실 '=='연산자의 경우에도 자동구현이 된다.

Hashable과 마찬가지로, 구조체 내부 프로퍼티들이 모두 Equatable하다면 자동으로 '=='연산자를 구현해준다.

따라서 Person에서도 == 연산자를 구현할 필요없이(Food가 Equatable을 채택했기에) 아래와 같이 쓸 수 있다.

 

한마디

Hashable을 채택할 때 Equatable을 구현해야 하는 이유?

프로토콜 상속에 의해 Hashable이 Equatable을 상속 받았기에.

 


출처

https://medium.com/@pruthvi187/hashable-in-swift-a500cb1a3439

 

Hashable in Swift

What’s hashable in Swift:

medium.com