우주선 연산자 (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 )
)

우주선 연산자는 코드의 안정성을 높여주며, 콜백 함수 내에서의 반복적인 비교 로직을 단순화하여 연산 실행 성능을 최적화하는 데 큰 기여를 합니다.

서브목차