Equatable / Comparable / Hashable

Jee.e (황지희)·2022년 3월 30일
0

우리가 만든 타입끼리 비교를 하고싶은데, 안된다는 오류가 뜬다.

왜 Int / String 등 기본 타입은 비교가 가능한데, 내가 만든 타입은 안돼?

기본 타입은 아래에 나올 프로토콜들이 이미 채택되어있어 컴파일러가 자동으로 구현해주기 때문이야!
적절한 프로토콜을 채택하렴



Equatable

  • 동일성(Equality)을 비교(==)할 수 있도록 하는 프로토콜이다.
  • Comparable, Hashable의 기반 프로토콜이다.
  • 구조체의 경우, 모든 저장 프로퍼티가 Equatable 을 채택해야하며
  • 열거형의 경우, 모든 연관 값들이 Equatable 을 채택해야 한다.
    (연관 값이 없는 경우, 컴파일러가 자동으로 채택해줌)

☑️ 예시 코드

extension Test: Equatable {
    static func == (lhs: Test, rhs: Test) -> Bool {
    }
}



Comparable

  • 값의 대/소를 비교할 수 있는 프로토콜이다.
  • 부등호 (> , >=, <, <=) 로 비교 연산이 가능해지며, sequence나 collection등에서 정렬 등의 추가 기능을 사용할 수 있게 된다.
  • Comparable 프로토콜은 Equatable 을 상속받기 때문에, 클래스에서는 반드시 Equatable 도 구현을 해줘야 한다.
    (구현 안하면, 에러 문구가 뜸)

☑️ 예시 코드

// 구조체, 열거형의 경우
extension Test: Comparable {
    static func < (lhs: Test, rhs: Test) -> Bool {
    }
}

// 클래스의 경우
extension Test: Comparable {
    static func == (lhs: Test, rhs: Test) -> Bool {
    }
    
    static func < (lhs: Test, rhs: Test) -> Bool {
    }
}



Hashable

  • 임의의 길이를 갖는 데이터(key)를 고정된 길이의 데이터(value)로 매핑하는 Hashing 기능을 구현하는 프로토콜이다. (정수 Hash 값 제공)
  • 만든 타입을 Set이나, Dictionary Key 값으로 사용하고 싶을 때 구현

✅ Hash란 ?

  • 해시 함수에 의해 얻어지는 값이다.(해시 값, 해시 코드 라고도 함)
  • 매우 빠른 데이터 검색을 위한 컴퓨터 소프트웨어에서 사용하며, 중복 값도 검색할 수 있다.
    (해시 값 변환 후, index와 매칭해 빠르게 찾음)

✅ Hashable은 Equatable을 왜 상속해야 하는가?

  • Swift의 set, dictionary 의 Key는 반드시 Hash 가 가능한 타입이어야 한다.

  • 또, combine 파라미터로 전달하는 프로퍼티는 반드시 Hashable을 준수하고 있어야 한다.

  • 고유한 값이여야 한다는 뜻
    때문에, 고유한 값(hashValue) 인지 식별해줄 수 있는 Equatable 를 상속해야 한다.




참고문서
1. https://jcsoohwancho.github.io/2019-10-27-Equatable,-Comparable,-Hashable/
2. https://babbab2.tistory.com/148
3. https://babbab2.tistory.com/150?category=828998
4. https://babbab2.tistory.com/149?category=828998

profile
교훈없는 경험은 없다고 생각하는 2년차 iOS 개발자입니다.

0개의 댓글