PHP에서 조건에 따라 값을 선택할 때 자주 사용되는 두 가지 연산자가 있습니다. 바로 삼항 연산자(Ternary Operator)와 Null 병합 연산자(Null Coalescing Operator, ??)입니다. 두 연산자는 비슷해 보이지만 내부적으로 평가하는 방식과 용도에서 중요한 차이가 있습니다.
삼항 연산자 (Ternary Operator)
삼항 연산자는 길게 작성해야 하는 if-else 문을 한 줄로 간결하게 표현할 때 사용합니다. 조건의 참·거짓 여부에 따라 두 표현식 중 하나를 반환합니다.
문법
(condition) ? expression1 : expression2;
동일한 표현식
if(condition) {
return expression1;
}
else {
return expression2;
}
조건(condition)이 true이면 expression1의 결과를 반환하고, false이면 expression2의 결과를 반환합니다. 조건부와 표현식에는 void 값을 사용할 수 없습니다.
Null 병합 연산자 (Null Coalescing Operator)
Null 병합 연산자는 변수가 null일 경우 기본값을 제공하기 위해 사용됩니다. PHP 7부터 도입되었으며, isset()으로 값의 존재 여부를 확인하고 값을 가져오는 과정을 한 번에 처리할 수 있어 코드가 훨씬 간결해집니다.
문법
(variable) ?? expression;
동일한 표현식
if(isset(variable)) {
return variable;
}
else {
return expression;
}
변수가 null이면 expression의 결과를 반환하고, null이 아니라면 변수 값을 그대로 반환합니다. 특히 존재하지 않는 배열 키나 정의되지 않은 변수에 접근할 때도 오류(Notice/Warning)를 발생시키지 않으므로, 외부 입력값을 다룰 때 매우 유용합니다.
예제
<!DOCTYPE html>
<html>
<head>
<title>PHP Example</title>
</head>
<body>
<?php
// $_GET['user'] 값을 가져오고, username이 전달되지 않으면
// 'not passed'를 반환합니다.
$username = $_GET['username'] ?? 'not passed';
print($username);
print("<br/>");
// 삼항 연산자를 사용한 동일한 코드
$username = isset($_GET['username']) ? $_GET['username'] : 'not passed';
print($username);
print("<br/>");
?>
</body>
</html>
실행 결과
not passed not passed
위 예제에서 볼 수 있듯이, Null 병합 연산자는 isset() 검사를 포함한 삼항 연산자와 동일한 결과를 더 짧은 코드로 만들어 줍니다.
핵심 차이점 요약
삼항 연산자는 단순히 조건식을 평가하여 두 표현식 중 하나를 선택합니다. 반면 Null 병합 연산자는 isset() 검사가 내장되어 있어, 정의되지 않은 변수나 null 값에 대해서도 오류 없이 안전하게 기본값을 지정할 수 있습니다.
따라서 $_GET, $_POST처럼 값이 전달되지 않을 수 있는 외부 입력의 기본값 처리에는 Null 병합 연산자(??)를 사용하는 것이 더 간결하고 안전한 방법입니다.