개요
PHP에서는 객체 변수를 비교할 때 두 가지 연산자를 사용할 수 있습니다. 먼저 ==(동등 연산자)는 두 객체 변수를 단순 비교하는 데 사용되며, 두 객체가 같은 클래스에 속하고 대응되는 속성(property)들의 값이 모두 동일하면 true를 반환합니다.
반면 ===(일치 연산자)는 두 객체 변수가 정확히 같은 클래스의 동일한 인스턴스(instance)를 참조하는 경우에만, 즉 그 경우에 한해서만 true를 반환합니다.
이번 글에서는 아래 두 개의 클래스를 사용하여 이 연산자들이 객체를 어떻게 비교하는지 살펴보겠습니다.
예제용 클래스 정의
<?php
class test1 {
private $x;
private $y;
function __construct($arg1, $arg2) {
$this->x = $arg1;
$this->y = $arg2;
}
}
class test2 {
private $x;
private $y;
function __construct($arg1, $arg2) {
$this->x = $arg1;
$this->y = $arg2;
}
}
?>케이스 1: 같은 클래스의 서로 다른 두 객체
같은 클래스로부터 생성했지만 각각 독립적으로 만들어진 두 객체를 비교해 보겠습니다.
$a = new test1(10, 20); $b = new test1(10, 20); echo "같은 클래스의 두 객체\n"; echo "== 연산자 사용 : "; var_dump($a == $b); echo "=== 연산자 사용 : "; var_dump($a === $b);
실행 결과
같은 클래스의 두 객체 == 연산자 사용 : bool(true) === 연산자 사용 : bool(false)
두 객체는 같은 클래스이고 속성 값도 동일하므로 == 비교에서는 true가 나옵니다. 하지만 서로 다른 인스턴스이기 때문에 === 비교에서는 false가 반환됩니다.
케이스 2: 같은 객체를 참조하는 두 변수
이번에는 하나의 객체를 다른 변수에 할당하여, 두 변수가 동일한 인스턴스를 가리키도록 만든 후 비교해 보겠습니다.
$a = new test1(10, 20); $c = $a; echo "같은 객체를 참조하는 두 변수\n"; echo "== 연산자 사용 : "; var_dump($a == $c); echo "=== 연산자 사용 : "; var_dump($a === $c);
실행 결과
같은 객체를 참조하는 두 변수 == 연산자 사용 : bool(true) === 연산자 사용 : bool(true)
변수 $c는 $a와 같은 객체 인스턴스를 참조하므로, ==와 === 모두 true를 반환합니다.
케이스 3: 서로 다른 클래스의 두 객체
속성 구조와 생성자가 완전히 동일하더라도 클래스 자체가 다르면 어떻게 되는지 확인해 보겠습니다.
$a = new test1(10, 20); $d = new test2(10, 20); echo "다른 클래스의 두 객체\n"; echo "== 연산자 사용 : "; var_dump($a == $d); echo "=== 연산자 사용 : "; var_dump($a === $d);
실행 결과
다른 클래스의 두 객체 == 연산자 사용 : bool(false) === 연산자 사용 : bool(false)
test1과 test2는 내부 구조가 같아 보여도 서로 다른 클래스이므로, 두 연산자 모두 false를 반환합니다.
정리
- == 연산자: 두 객체가 같은 클래스의 인스턴스이고, 모든 속성 값이 동일하면
true - === 연산자: 두 변수가 같은 클래스의 동일한 인스턴스를 참조할 때만
true - 클래스가 다르면 속성 값이 같더라도 두 연산자 모두
false
객체의 값만 비교할지, 객체의 정체성(identity)까지 비교할지에 따라 적절한 연산자를 선택하는 것이 중요합니다.