[iOS] Equatable
클래스나 구조체를 비교하는 방법
우리가 만들어서 사용하는 클래스나 구조체는 단순 ‘==’ 로 같은 객체인지 비교가 불가능하다. 내부의 프로퍼티는 동일한지 확인이 가능하지만 객체 자체는 비교가 불가능! 그말은 클래스나 구조체는 내부적으로 객체 자체를 비교하는 방법이 구현이 되어있지 않다는 뜻이다(?)
그렇다면 어떤 상황에서 객체 자체를 비교해야하는 상황을 맞이한다면 어떻게 해야할까?
Equatable(protocol)
Swift에서 Equtable은 A type that can be compared for value equality라고 설명한다.
Equatable 프로토콜을 준수하는 타입은 ‘==’ 로 동등성 비교가 가능해진다. Int나 String같은 타입에서 동등성 비교가 가능했던 것은 Swift 표준 라이브러리의 대부분 기본 데이터타입은 Equatable를 따르기 때문이다. 즉, 아무 생각없이 너무나도 자연스럽게 값을 비교할때 ‘==’를 사용해왔던 모든 타입들이 내부적으로는 Equatable이라는 프로토콜을 준수하고 있었던 것이다.
String은 Struct
별다른 구현없이 동등성 비교가 가능한 타입들로는 String, Int, Double, Bool 등이 있는데 이 타입들은 모두 Struct로 구현되어있으면서 Equtable을 채택하고있기 때문에 바로 == 메소드를 통해 비교가 가능한 것이다.
사용법
struct
Struct나 Enum같은 타입은 Equatable 프로토콜을 채택하면 바로 동등성 비교가 가능하지만 Class의 경우에는 == 메소드를 프로토콜의 요구사항에 맞게 구현해야한다.
struct equtableStruct: Equatable {
var name: String
}
let a = equtableStruct(name: "pinocchio22")
let b = equtableStruct(name: "pinocchio22")
a == b // true
class
class equatableClass: Equatable {
var name: String
init(name: String) {
self.name = name
}
static func == (lhs: equatableClass, rhs: equatableClass) -> Bool {
return true
}
}
let a = equatableClass(name: "pinocchio22")
let b = equatableClass(name: "pinocchio22")
a == b // true
class는 ==를 직접 구현?
Struct나 Enum에서 Equatable을 채택할 경우에 Swift 컴파일러는 대부분의 경우 자동으로 == 메소드를 생성해 주지만 Class의 경우는 다르다.
클래스에서 Equatable 프로토콜을 채택하면 컴파일러는 자동으로 == 연산자 구현을 제공하지 않는데, Struct는 상속이 불가능하지만 Class는 상속이 가능하기 때문이다.
만약 슈퍼 클래스에서 Equatable을 채택하고 ==를 구현했다면 서브 클래스에서 이를 어떻게 처리해야할까? 서브 클래스는 슈퍼 클래스의 == 구현을 상속받게되기 때문에 서브 클래스에서 추가된 속성이나 변경된 동작을 고려해서 동등성 비교를 수행하려면 == 연산자를 오버라이드해서 자신의 동등성 비교 로직을 구현해야만 한다.
댓글남기기