[Swift] 기본 프로토콜 (Equatable, Comparable, CustomStringConvertible)

안녕하세요~ 차니에요!

 

오늘은 Swift 기본 프로토콜에 대해 알아보도록하겠습니다.

 

1. 기본 프로토콜의 종류

1-1. Equatable

Apple Documnets - Equatable

값이 같은지 비교할 수 있는 포로토콜 타입입니다!

한마디로 Equatable을 채택했다는 것은 ==, != 등의 비교 연산을 할 수 있다는건데 예시로 String의 구현부를 살펴봅시다.

 

Equatable을 채택하고 있는 모습

1-2. Comparable

Apple Documnets - Comparable

Equatable을 보고왔으니 이제 쉽죠?

비교 연산자를 사용해서 값을 비교할 수 있는 타입입니다.

해당 프로토콜은 비교 연산뿐 아니라 동등 비교(==)도 함께 사용하기 때문에 Equatable을 함께 필수로 채택해주어야 합니다!!

 

Comparable을 채택하고 있는 모습

 

1-3. CustomStringConvertible

Apple Documnets - CustomStringConvertible

마지막으로 CustomStringConvertible 프로토콜입니다.

사용자 정의된 텍스트 표현이 있는 타입입니다.

해당 프로토콜은 예제로 확인해보겠습니다.

 

2. 구현해보자

class SampleEquatable {
    var num: Int
    
    init(_ num: Int) {
        self.num = num
    }
}

샘플 클래스를 하나 생성하였습니다.

 

각각의 인스턴스의 값을 비교하려고 하는데 에러가 발생합니다.

SampleEqautable 클래스는 Equatable, Comparable을 채택하지 않았기 때문인데요.

이번에는 Equatable, Comparable, CustomStringConvertible 3가지 프로토콜 모두 채택하여 구현해보겠습니다!

 

class SampleEquatable: Equatable, Comparable, CustomStringConvertible {
    
    var num: Int
    
    var description: String {
        return "value = \(self.num)"
    }
    
    init(_ num: Int) {
        self.num = num
    }
    
    static func == (lhs: SampleEquatable, rhs: SampleEquatable) -> Bool {
        return lhs.num == rhs.num
    }
    
    static func < (lhs: SampleEquatable, rhs: SampleEquatable) -> Bool {
        return lhs.num < lhs.num
    }
}

각각의 프로토콜을 콤마로 구분하여 채택해주고 해당 프로토콜의 메서드(==, <, description)를 오버로드합니다.

 

이렇게 우리가 원하는 결과를 도출할 수 있습니다.

그런데 한 가지 의문점이 드는게 비교 연산은 ==, < 두 가지 밖에 구현을 안했는데 그 외에 !=, >, <=, >= 등은 구현을 안해도 되는걸까? 답은 안해도 된다! 입니다.

왜냐하면.. Equatable의 == 함수를 오버로드 했으니 그 안에 있는 != 는 별도의 오버로드 없이 사용할 수 있습니다. 

같은 맥락으로 Comparable의 < 오퍼레이터만 구현하면 그 외의 비교 연산을 할 수 있던 것입니다. 

 

마지막으로 CustomStringConvertible의 description 출력 결과입니다.

이상으로 포스팅을 마치도록 할게요.

궁금한 점이나 틀린 점은 댓글로 남겨주세요!!