우주선 연산자 (Spaceship Operator)
기존의 비교 연산자는 두 개의 값을 비교하여 참(true)과 거짓(false)의 논리 결과만을 반환했습니다.
PHP 7.0부터는 두 개의 값이 큰지, 작은지, 또는 같은지를 단 하나의 연산자로 한 번에 비교하여 세 가지 상태의 결과값을 반환하는 우주선 연산자(Spaceship Operator, <=>)를 새롭게 지원합니다.
연산 기호가 <=> 형태로 표시되는데, 그 모양이 마치 은하계를 비행하는 우주선과 닮았다고 하여 우주선 연산자라는 재미있는 명칭이 붙게 되었습니다.
1. 기존 방식과의 비교 (PHP 5)
PHP 7 이전 버전에서 우주선 연산과 같이 두 값을 비교하여 작음(-1), 같음(0), 큼(1)을 판별하려면 다음과 같이 다중 조건문을 작성하여 처리해야 했습니다.
function _SpaceshipComparison($a, $b) {
if ($a == $b) {
return 0; // 두 값이 같으면 0
} elseif ($a < $b) {
return -1; // 좌항이 작으면 -1
} else {
return 1; // 좌항이 크면 1
}
}
이 방식은 단순히 두 값의 대소 관계를 판별하기 위해 3중 분기 조건문을 거쳐야 하므로 코드의 줄 수가 늘어나고 연산 오버헤드가 발생했습니다.
우주선 연산자 <=>를 사용하면 이 복잡한 동작을 단 한 줄의 식으로 해결할 수 있습니다.
|문법|
$result = $a <=> $b;
반환되는 결과값은 다음과 같습니다:
$a가$b보다 작으면-1반환$a와$b가 같으면0반환$a가$b보다 크면1반환
2. 데이터 형식별 비교 동작
우주선 연산자는 정수뿐만 아니라 실수(Float), 문자열(String), 심지어 배열(Array) 데이터 타입 간의 크기 비교도 완벽하게 지원합니다.
예제 파일 spaceship-01.php
<?php
// 1. 정수 비교
echo "정수 비교:<br>";
echo "1 <=> 1 결과: " . (1 <=> 1) . "<br>"; // 0 (같음)
echo "1 <=> 2 결과: " . (1 <=> 2) . "<br>"; // -1 (좌항이 작음)
echo "2 <=> 1 결과: " . (2 <=> 1) . "<br>"; // 1 (좌항이 큼)
// 2. 실수 비교
echo "<br>실수 비교:<br>";
echo "1.5 <=> 1.5 결과: " . (1.5 <=> 1.5) . "<br>"; // 0
echo "1.5 <=> 2.5 결과: " . (1.5 <=> 2.5) . "<br>"; // -1
echo "2.5 <=> 1.5 결과: " . (2.5 <=> 1.5) . "<br>"; // 1
// 3. 문자열 비교 (알파벳 아스키 코드 순서 기준)
echo "<br>문자열 비교:<br>";
echo "'a' <=> 'a' 결과: " . ("a" <=> "a") . "<br>"; // 0
echo "'a' <=> 'b' 결과: " . ("a" <=> "b") . "<br>"; // -1
echo "'b' <=> 'a' 결과: " . ("b" <=> "a") . "<br>"; // 1
?>
실행 결과
정수 비교:
1 <=> 1 결과: 0
1 <=> 2 결과: -1
2 <=> 1 결과: 1
실수 비교:
1.5 <=> 1.5 결과: 0
1.5 <=> 2.5 결과: -1
2.5 <=> 1.5 결과: 1
문자열 비교:
'a' <=> 'a' 결과: 0
'a' <=> 'b' 결과: -1
'b' <=> 'a' 결과: 1
3. 배열 정렬(usort)에서의 실무 활용
우주선 연산자가 실무에서 가장 빛을 발하는 순간은 바로 배열을 정렬할 때 사용자 정의 비교 함수(usort)를 선언하는 상황입니다. 기존 방식보다 정렬 코드가 매우 아름답고 직관적으로 간소화됩니다.
예제 파일 spaceship-02.php
<?php
$users = [
['name' => '김철수', 'age' => 25],
['name' => '이영희', 'age' => 20],
['name' => '박민수', 'age' => 30],
];
// 나이(age) 기준으로 오름차순 정렬을 수행합니다.
// $a['age']가 $b['age']보다 작으면 -1을 리턴하여 $a가 앞으로 정렬됩니다.
usort($users, function($a, $b) {
return $a['age'] <=> $b['age'];
});
// 정렬된 결과를 보기 쉽게 화면에 출력합니다.
print_r($users);
?>
실행 결과
Array
(
[0] => Array ( [name] => 이영희 [age] => 20 )
[1] => Array ( [name] => 김철수 [age] => 25 )
[2] => Array ( [name] => 박민수 [age] => 30 )
)
우주선 연산자는 코드의 안정성을 높여주며, 콜백 함수 내에서의 반복적인 비교 로직을 단순화하여 연산 실행 성능을 최적화하는 데 큰 기여를 합니다.