[Swift] Comparable Protocol에 대해서

작성일 :

Comparable Protocol 이란 ?


Swift에서 Comparable은 두 개의 값 또는 객체를 비교할 때 사용되는 프로토콜이다. 이 프로토콜은 두 개의 값이 순서가 있을 때, 그리고 이를 비교할 수 있을 때 구현된다. 이를 통해 Swift에서 Comparable을 구현하면 범위 연산자, 정렬 메서드, 검색 알고리즘 등에서 사용될 수 있어 더욱 강력한 프로그래밍을 할 수 있다.

Comparable을 구현하는 방법은 매우 간단하다. Comparable 프로토콜을 채택하면서 비교 가능한 타입인 경우, 이를 비교할 수 있는 "<" 연산자와 "==" 연산자를 구현해주면 된다. "<" 연산자는 두 개의 값의 순서를 비교하며, "==" 연산자는 두 개의 값이 같은지를 비교한다.

예를 들어, Int 타입은 이미 Comparable 프로토콜을 구현하고 있기 때문에, 아래와 같이 사용할 수 있다.

swift
let a = 1
let b = 2

if a < b {
    print("a is less than b")
} else if a == b {
    print("a is equal to b")
} else {
    print("a is greater than b")
}

위 코드에서 Int 타입은 이미 Comparable 프로토콜을 구현하고 있으므로, "<" 연산자와 "==" 연산자를 사용하여 a와 b의 값을 비교할 수 있다. 만약 a가 b보다 작으면 "a is less than b"를 출력하고, a와 b가 같으면 "a is equal to b"를 출력하며, a가 b보다 크면 "a is greater than b"를 출력한다.

그러나, 만약 우리가 직접 구현한 타입이 Comparable 프로토콜을 따르지 않는다면 어떻게 해야 할까? 아래는 Person이라는 구조체를 예시로 살펴보자.

swift
struct Person {
    var name: String
    var age: Int
}

Person 타입은 Comparable 프로토콜을 구현하지 않았기 때문에, "<" 연산자와 "==" 연산자를 직접 구현해주어야 한다. 아래는 Person 타입을 Comparable 프로토콜에 따라 구현한 코드이다.

swift
extension Person: Comparable {
    static func < (lhs: Person, rhs: Person) -> Bool {
        return lhs.age < rhs.age
    }

    static func == (lhs: Person, rhs: Person) -> Bool {
        return lhs.name == rhs.name && lhs.age == rhs.age
    }
}

이렇게 구현된 Person 타입은 Comparable 프로토콜을 준수하므로, 다음과 같이 사용할 수 있다.

swift
let john = Person(name: "John", age: 25)
let jane = Person(name: "Jane", age: 30)

if john < jane {
    print("John is younger than Jane")
} else if john == jane {
    print("John is the same age as Jane")
} else {
    print("John is older than Jane")
}

위 코드에서는 "<" 연산자와 "==" 연산자를 사용하여 john과 jane의 값을 비교한다. 만약 john이 jane보다 어리면 "John is younger than Jane"을 출력하고, john과 jane이 같은 나이이면 "John is the same age as Jane"을 출력하며, john이 jane보다 많이 나이가 들면 "John is older than Jane"을 출력한다.

Comparable은 Swift에서 매우 중요한 프로토콜 중 하나이며, 많은 기본 타입이 이미 이 프로토콜을 구현하고 있다. 따라서 Swift에서는 기본 타입뿐만 아니라 우리가 직접 구현한 타입에 대해서도 쉽게 비교할 수 있게 된다. 이를 통해 범위 연산자, 정렬 메서드, 검색 알고리즘 등에서 간단하고 빠르게 값을 비교할 수 있어, Swift에서 더욱 강력한 프로그래밍을 할 수 있게 되었다.

Comparable은 Protocol을 준수하는 타입


Swift의 많은 기본 타입은 이미 Comparable 프로토콜을 구현하고 있다. 이러한 타입들은 숫자와 문자열 등 데이터를 비교해야 할 때 매우 유용하게 사용할 수 있다. 아래는 Swift에서 기본으로 제공하는 Comparable을 준수하는 타입의 몇 가지 예시이다.

  • Int, UInt, Double, Float, CGFloat
  • String, Character
  • Bool
  • Date, DateComponents
  • URL

위와 같은 타입들은 Comparable 프로토콜을 구현하므로, 해당 타입의 값들을 간단하게 비교할 수 있다. 예를 들어 Int 타입에서는 "<", "<=", ">=", ">"와 같은 비교 연산자를 사용하여 값을 비교할 수 있다.

참고 자료


저작권 등 문제가 되는 부분이 있다면 삭제하겠습니다.