본문 바로가기

iOS/학습정리

프로그래밍 방법론) 객체지향프로그래밍(OOP) - (2)

객체 비교

객체간의 비교 - 기본

==

기본적으로 객체를 비교할 때 값이 아닌 레퍼런스를 비교합니다. 따라서 a와 b는 같은 값을 가지고 있지만 서로 다른 것으로 나타납니다. a와 c는 같은 값을 참조하고 있으므로 같다고 간주합니다.

class Car : NSObject {

    var horsePower : Int
    var plate : String

    init(power: Int, id: String) {
        horsePower = power
        plate = id
    }

}
let a = Car(power: 200, id: "AX993JE")
let b = Car(power: 200, id: "AX993JE")
let c = a
print(a == b) // <----- false
print(c == a) // <----- true!

===

식별 연산자(identity operator)라 불리는 ===는 객체간 비교에서 == 처럼 레퍼런스를 비교합니다. ==와의 차이점은 식별연산자는 객체간의 비교만 가능하다는 것입니다. 만일 Int, String과 같은 literal변수를 비교하려고 하면 에러가 발생합니다.

class Car : NSObject {

    var horsePower : Int
    var plate : String

    init(power: Int, id: String) {
        horsePower = power
        plate = id
    }

}
let a = Car(power: 200, id: "AX993JE")
let b = Car(power: 200, id: "AX993JE")
let c = a
print(a === b) // <----- false
print(c === a) // <----- true!

let aa: Int = 9
let bb: Int = 9
print(aa == bb) // <---- true!
print(aa === bb) // <---- false

객체간 비교 - Equatable

Equatable Protocol을 이용하여 자신만의 비교 함수를 작성할 수 있습니다. 객체를 비교하는 연산자로는 == 만 사용할 수 있습니다. 다음과 같이 == 함수를 작성하여 객체 내의 값을 비교할 수 있습니다.

import UIKit
class Car : Equatable {

    var horsePower : Int
    var plate : String

    init(power: Int, id: String) {
        horsePower = power
        plate = id
    }

    static func == (lhs: Car, rhs: Car) -> Bool {
        return lhs.plate == rhs.plate
    }
}
let a = Car(power: 200, id: "AX993JE")
let b = Car(power: 147, id: "AX993JE")
print(a == b)    // <---- true