오늘은 ==
비교와 ===
비교의 차이점에 대해서 보도록하겠습니다.
일단 결론부터 말씀을 드리면,
==
: 값 비교
===
: 참조하고 있는 인스턴스가 같은지 비교
입니다.
==
는 값타입에 사용하는 비교이고 ===
는 참조타입에 사용하는 비교입니다.
class Car {
let name: String
let color: String
init(name: String, color: String) {
self.name = name
self.color = color
}
}
let car1 = Car(name: "SONATA", color: "WHITE")
let car2 = Car(name: "SONATA", color: "RED")
let car3 = car1
print(car1 === car2) //false
print(car1 === car3) //true
클래스 간에는 기본적으로 ==
비교를 할 수 없습니다. ==
는 값타입의 비교이기 때문에 할 수 없고 ===
의 비교만 기본적으로 가능합니다.
==
비교를 사용하려면 Equatable
프로토콜을 채택하여 ==
메서드를 정의 해주어야 합니다.
class Car: Equatable {
let name: String
let color: String
init(name: String, color: String) {
self.name = name
self.color = color
}
static func == (lhs: Car, rhs: Car) -> Bool {
return lhs.name == rhs.name
}
}
let car1 = Car(name: "SONATA", color: "WHITE")
let car2 = Car(name: "SONATA", color: "RED")
let car3 = car1
print(car1 == car2) //true
print(car1 == car3) //true
이런식으로 Equatable
프로토콜을 채택하여 어떤 값을 비교할 것인지 정의 해주면 ==
비교를 사용할 수 있습니다.
==
비교는 내가 정의한 대로 비교하게 되는데 기본적으로 사용할 수 있는 ===
비교는 어떤 것을 비교할까요
===
는 아래와 같이 구현되어 있습니다.
public func === (lhs: AnyObject?, rhs: AnyObject?) -> Bool {
switch (lhs, rhs) {
case let (l?, r?):
return ObjectIdentifier(l) == ObjectIdentifier(r)
case (nil, nil):
return true
default:
return false
}
}
클래스의 인스턴스의 ObjectIdentifier
를 비교 하는 것으로 보이네요.!
ObjectIdentifier
는 무엇일까요?
ObjectIdentifier
는 클래스의 인스턴스의 고유한 식별자 입니다.
objectidentifier_공식문서