Hashable이 무엇이고, Equatable을 왜 상속해야 하는지 설명하시오.

이하연·2021년 9월 16일
1

[Swift] 스위프트

목록 보기
16/27

Hashable

정의

Hashable은 "정수 hash 값을 제공하는 타입"으로 정의된 프로토콜입니다.

hash란, 해시 함수에 의해 얻어지는 값으로 해시값, 해시코드, 해시 체크섬으로도 불립니다.

해시 함수 - 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수

hashValue - 어떠한 데이터를 Hash 함수에 넣게 되면 반환해주는 값

HashTable에서 hash값을 찾기 위해선 key가 필요하고 이 key는 식별할 수 있도록 unique 해야 합니다.

구현

Hashable 만들어 주기 위해선 2가지가 필요합니다.

  1. Equatable에 있는 == 함수 구현

  2. HashValue를 만들기

    Hasher는 hashValue를 생성해주는 해시함수가 있는 struct로, combine 메서드를 가지고 있습니다. 이 메소드를 사용하여 식별할 수 있는 Identifire를 hasher에게 넘겨주면 됩니다.

언제 사용?

  • Hashable 프로토콜을 준수하는 모든 유형은 set, dictionary key로 사용
  • Hashable을 준수하고 있는 타입: String, Integer, floating-point, Boolean
  • Optional과 Array, Range들은 argument들이 동일하게 구현될 때 자동으로 Hashable이 됨
  • custom 타입에도 Hashable을 준수하도록 할 수 있다.
  • associated value 없이 enum을 정의하면 자동으로 Hashable을 준수한다.
  • hash(into:) 메서드를 구현한다면 다른 custom 타입도 Hashable을 준수할 수 있다.
  • 저장 property들이 모두 Hashable한 구조체, 모두 Hashable한 enum 타입을 가진 enum 이라면
    컴파일러가 hash(into:) 메서드를 자동으로 제공한다.

Hashable은 Equatable protocol을 상속받고 있습니다. 이에 대해서 간략하게 설명하겠습니다.


Equatable

정의

Equatable은 값이 동일한 지 어떤지를 비교 할 수 있는 타입인 프로토콜입니다.

이 프로토콜을 준수하는 타입은 == 혹은 != 사용하여 동등성을 비교할 수 있습니다.

왜 Hashable은 Equatable을 상속해야할까?

hashValue는 고유값이어야 하므로 고유값인지 식별해 줄 수 있는 "==" 함수가 필요합니다.

그 함수는 Equatable 프로토콜 안에 들어있습니다.

따라서 Hashable이 Equatable을 상속해야 합니다.

다시 정리

해시값은 각각 타입의 인스턴스를 식별하는 값으로 유일성을 가지고 있어야 합니다. 해시 값이 유일한 값인지를 비교해야하기 때문에 Equatable 프로토콜을 상속 받아 값을 비교할 수 있도록 하고 있습니다. Set, Dictionary의 key는 중복을 허용하지 않아야 함으로 Equatable을 상속하고 있는 Hashable을 준수해야합니다.

기본 데이터 타입도 Equatable 따릅니다.

Swift 표준 라이브러리 대부분의 "기본 데이터 타입 Int, String, Double 등" Hashable 타입을 상속받음

→ 따라서 Equatable를 따름 → 우리는 기본 데이터 타입에서 자연스럽게 == 을 사용가능

0개의 댓글