== 와 ===의 차이점

hoBahk·2021년 11월 4일
0

`==` VS `===`

오늘은 ==비교와 ===비교의 차이점에 대해서 보도록하겠습니다.

일단 결론부터 말씀을 드리면,

== : 값 비교
=== : 참조하고 있는 인스턴스가 같은지 비교

입니다.

==는 값타입에 사용하는 비교이고 ===는 참조타입에 사용하는 비교입니다.

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_공식문서

profile
호박에 줄 그어서 수박 되는 성장 드라마

0개의 댓글