Comparable

이원희·2021년 3월 11일
0

 🐧 Swift

목록 보기
28/32
post-thumbnail

오늘은 Comparable에 대해서 알아보자.
Swift로 Merge Sort를 구현하다 Comparable을 봐서 정리한다

Comparable

오늘도 공식 문서를 봐보자.
오호.. Comparable도 프로토콜이다.

관계 연산자인 <, <=, >=, >를 사용하여 비교할 수 있는 타입이다.

Comparable 프로토콜은 숫자 및 문자열과 같이 고유한 순서가 있는 타입에 사용된다.
표준 라이브러리의 많은 타입이 이미 Comparable 프로토콜을 준수하고 있다.
custom type에서 관계 연산자를 사용해 인스턴스를 비교하기 위해서는 Comparable 프로토콜을 준수하면 된다.

let currentTemp = 73

if currentTemp >= 90 {
    print("It's a scorcher!")
} else if currentTemp < 65 {
    print("Might need a sweater today.")
} else {
    print("Seems like picnic weather!")
}

일반적으로 관계 연산자는 위와 같이 사용된다.

일부 sequence와 collection 작업에서 특별한 버전을 사용할 수 있다.
예를 들어, 배열의 요소들이 Comparable을 준수하고 있는 경우 아래와 같이 관계 연산자와 같은 요소들을 사용하지 않고 sort() 메서드를 호출해 배열 요소를 오름차순으로 정렬할 수 있다.

var measurements = [1.1, 1.5, 2.9, 1.2, 1.5, 1.3, 1.2]
measurements.sort()
print(measurements)

Comparable 준수

Comparable을 준수하는 타입은 <, == 연산자를 구현해야 한다.
두 값 a 및 b에 대해 다음 중 하나가 정확하게 참이어야 한다.

  • a == b
  • a < b
  • b < a

custom 타입에서 Comparable을 준수하려면 <, == 연산자를 static 메서드로 정의해야 한다.
== 연산자는 Comparable이 Equatable 프로토콜을 상속 받으므로 구현해 줘야 하는 요구 사항이다.
관계 연산자의 기본 구현은 표준 라이브러리에서 제공하므로 추가 코드 없이 타입의 인스턴스와 함께 !=, >, <=, >=를 사용할 수 있다.

흐음... Comparable 프로토콜을 준수해야 관계 연산자를 사용할 수 있는데 <, == 이거 두개만 구현해 주면 된다니?!
Comparable Swift 코드를 확인해보자!

(주석때메 넘 길다...)
오! Comparable이 Equatable을 상속 받고 있네!
오키오키 그래서 ==을 구현해줘야 하는구나!

Comparable 프로토콜을 보면 <, <=, >=, >에 대해서 구현하라고 하네?!
오... 근데 extension으로 Comparable 프로토콜을 확장하고 있네...
확장된 기능을 확인해보니... 이미 >, <=, >=에 대해서는 구현이 되어 있구나..!

아하! <, <=, >=, >에 대해서 구현해야하는건 맞지만 extension을 통해 <를 기준으로 다른 연산자들은 이미 구현이 되어 있구나!

struct Date {
    let year: Int
    let month: Int
    let day: Int
}

Date struct로 Comparable 프로토콜을 준수해보자.

extension Date: Comparable {
    static func < (lhs: Date, rhs: Date) -> Bool {
        if lhs.year != rhs.year {
            return lhs.year < rhs.year
        } else if lhs.month != rhs.month {
            return lhs.month < rhs.month
        } else {
            return lhs.day < rhs.day
        }
    }
    static func == (lhs: Date, rhs: Date) -> Bool {
        return lhs.year == rhs.year && 
        lhs.month == rhs.month && 
        lhs.day == rhs.day
    }
}

<, ==을 구현해줌으로써 프로토콜을 준수할 수 있게 되었다.


마무리

어제 Hashable과 Equatable에 대해서 정리했는데 오늘은 Comparable에 대해서 정리했다.
오늘도 Swift의 작명 센스에 좀 놀라고 오늘도 재밌었닼ㅋㅋㅋ
그럼 이만👋

0개의 댓글