안녕하세요~ 차니에요!
오늘은 Swift 기본 프로토콜에 대해 알아보도록하겠습니다.
1. 기본 프로토콜의 종류
1-1. Equatable
값이 같은지 비교할 수 있는 포로토콜 타입입니다!
한마디로 Equatable을 채택했다는 것은 ==, != 등의 비교 연산을 할 수 있다는건데 예시로 String의 구현부를 살펴봅시다.
1-2. Comparable
Equatable을 보고왔으니 이제 쉽죠?
비교 연산자를 사용해서 값을 비교할 수 있는 타입입니다.
해당 프로토콜은 비교 연산뿐 아니라 동등 비교(==)도 함께 사용하기 때문에 Equatable을 함께 필수로 채택해주어야 합니다!!
1-3. 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의 < 오퍼레이터만 구현하면 그 외의 비교 연산을 할 수 있던 것입니다.
이상으로 포스팅을 마치도록 할게요.
궁금한 점이나 틀린 점은 댓글로 남겨주세요!!