2025. 6. 27. 02:54ㆍ프로그램/PHP 초급
📚 PHP 초급 - 3주차 - 04 Null 병합 연산자 (??): 변수 존재 여부 간결하게 확인하기

PHP에서 #변수 에 값이 설정되어 있는지, 그리고 그 값이 #NULL 이 아닌지 확인하는 것은 매우 흔한 작업입니다. 전통적으로 isset() 함수와 #삼항_연산자 를 조합해서 이 작업을 수행했지만, PHP 7부터는 훨씬 더 간결하고 직관적인 **#Null_병합_연산자 (??)**가 도입되었습니다. 이번 포스팅에서는 #Null_병합_연산자 의 사용법과 장점, 그리고 기존 방식과의 차이점에 대해 자세히 알아보겠습니다.
1. #Null_병합_연산자 (??) 란?

#Null_병합_연산자 (??)는 왼쪽 피연산자가 존재하고 #NULL 이 아니라면 왼쪽 피연산자의 값을 반환하고, 그렇지 않으면 오른쪽 피연산자의 값을 반환합니다. 이는 #변수 에 #기본값 을 #할당 하거나, 특정 값이 존재하지 않을 때 대체 값을 제공할 때 매우 유용합니다.
기본 형태:
$result = $variable ?? "기본값";
위 코드는 다음과 같은 #삼항_연산자 표현과 동일하게 작동합니다:
$result = isset($variable) ? $variable : "기본값";
주목할 점은 isset() 함수가 #변수 의 존재 여부와 #NULL 이 아닌지 여부를 모두 확인한다는 것입니다. #Null_병합_연산자 역시 이와 동일한 방식으로 작동하며, 훨씬 더 간결한 문법을 제공합니다.
2. #Null_병합_연산자 사용 예시

다양한 상황에서 #Null_병합_연산자 를 어떻게 활용할 수 있는지 살펴보겠습니다.
예시 1: GET 또는 POST 요청 값 처리
사용자 입력 값(예: URL 쿼리 파라미터)이 넘어오지 않을 경우 #오류 가 발생하는 것을 방지하고 #기본값 을 설정할 때 유용합니다.
<?php
// URL: example.com?name=Alice
$username = $_GET['name'] ?? 'Guest';
echo "사용자 이름: " . $username . "<br>"; // 출력: 사용자 이름: Alice
// URL: example.com
$city = $_GET['city'] ?? 'Seoul';
echo "도시: " . $city . "<br>"; // 출력: 도시: Seoul (GET['city']가 없으므로)
?>
예시 2: 정의되지 않은 #변수 처리
#변수 가 아직 #정의 되지 않았거나 #NULL 로 #할당 되었을 때 #기본값 을 제공합니다.
<?php
$userAge = null; // null로 할당된 변수
$age = $userAge ?? 30;
echo "나이 (Null 할당): " . $age . "<br>"; // 출력: 나이 (Null 할당): 30
// $userName은 정의되지 않음
$name = $userName ?? 'Unknown';
echo "이름 (정의되지 않음): " . $name . "<br>"; // 출력: 이름 (정의되지 않음): Unknown
$email = "test@example.com";
$userEmail = $email ?? 'no_email@example.com';
echo "이메일 (값 존재): " . $userEmail . "<br>"; // 출력: 이메일 (값 존재): test@example.com
?>
3. #Null_병합_연산자 의 장점

- #간결한_코드: isset()과 #삼항_연산자 를 결합한 형태보다 훨씬 짧고 읽기 쉬운 코드를 작성할 수 있습니다.
- 기존: isset($var) ? $var : 'default';
- 변경: $var ?? 'default';
- #가독성_향상: 코드의 의도가 명확해져 가독성이 향상됩니다. "이 값이 있으면 그걸 쓰고, 없으면 뒤의 기본값을 써라"는 의미가 직관적으로 전달됩니다.
- #반복_회피: isset()과 #삼항_연산자 를 사용할 때는 #변수 이름을 두 번 반복해야 했지만, #Null_병합_연산자 는 한 번만 사용하면 됩니다.
4. #Null_병합_연산자 와 다른 #연산자 의 차이점
a) #삼항_연산자 (?:)와의 비교
#Null_병합_연산자 는 특정 조건(isset && non-null)에 대한 #삼항_연산자 의 특화된 형태입니다.
- $a ?? $b는 $a가 isset()에 의해 true를 반환하지 않으면 $b를 사용합니다.
- $a ? $b : $c는 $a가 true로 평가되면 $b를, false로 평가되면 $c를 사용합니다.
이 차이는 $a가 0, "" (빈 #문자열), false일 때 중요합니다.
<?php
$value1 = 0;
$result1_ternary = $value1 ? '값이 있음' : '값이 없음';
$result1_null_coalescing = $value1 ?? '값이 없음';
echo "값 0 (삼항): " . $result1_ternary . "<br>"; // 출력: 값 0 (삼항): 값이 없음 (0은 false로 평가)
echo "값 0 (Null 병합): " . $result1_null_coalescing . "<br>"; // 출력: 값 0 (Null 병합): 0 (0은 isset에서 true)
$value2 = "";
$result2_ternary = $value2 ? '값이 있음' : '값이 없음';
$result2_null_coalescing = $value2 ?? '값이 없음';
echo "값 \"\" (삼항): " . $result2_ternary . "<br>"; // 출력: 값 "" (삼항): 값이 없음 (""는 false로 평가)
echo "값 \"\" (Null 병합): " . $result2_null_coalescing . "<br>"; // 출력: 값 "" (Null 병합): (빈 문자열) (""는 isset에서 true)
?>
isset()은 #변수 가 #정의 되어 있고 #NULL 이 아닌 경우에만 true를 반환합니다. 0이나 "" (빈 #문자열)은 #Null_병합_연산자 에서 유효한 값으로 간주되어 반환됩니다. 반면 #삼항_연산자 의 조건부에서는 0이나 ""가 false로 평가될 수 있습니다.
b) #Null_병합_할당_연산자 (??=) (PHP 7.4 이상)

PHP 7.4부터는 #Null_병합_할당_연산자 (??=)가 추가되어, #변수 가 #NULL 이거나 #정의 되지 않았을 때만 #기본값 을 #할당 하도록 합니다.
기본 형태:
$variable ??= "기본값";
이는 다음과 같은 코드와 동일합니다:
if (!isset($variable)) { $variable = "기본값"; }
예시:
<?php
$data = [];
// $data['key1']은 정의되지 않았으므로 'default_value'로 할당
$data['key1'] ??= 'default_value';
echo "Key1: " . $data['key1'] . "<br>"; // 출력: Key1: default_value
$data['key2'] = 'existing_value';
// $data['key2']는 이미 정의되어 있으므로 변경되지 않음
$data['key2'] ??= 'new_default';
echo "Key2: " . $data['key2'] . "<br>"; // 출력: Key2: existing_value
?>
5. 중첩 #Null_병합_연산자
#Null_병합_연산자 는 여러 개를 연쇄적으로 사용할 수 있습니다. 이는 여러 개의 대체 값 중에서 처음으로 #NULL 이 아닌 값을 찾을 때 유용합니다.
$result = $val1 ?? $val2 ?? $val3 ?? "최종_기본값";
이 코드는 $val1이 #NULL 이 아니면 $val1을, 아니면 $val2가 #NULL 이 아니면 $val2를, 아니면 $val3이 #NULL 이 아니면 $val3을, 모든 것이 #NULL 이면 "최종_기본값"을 반환합니다.
<?php
$user_input = null;
$config_value = null;
$default_setting = "Default from config";
$final_value = $user_input ?? $config_value ?? $default_setting ?? "Hardcoded fallback";
echo "최종 값: " . $final_value . "<br>"; // 출력: 최종 값: Default from config
?>
결론
#Null_병합_연산자 (??)는 PHP 7부터 도입된 매우 유용한 기능으로, #변수 의 존재 여부 및 #NULL 여부를 확인하여 #기본값 을 간결하게 #할당 하는 데 탁월합니다. isset()과 #삼항_연산자 를 조합하는 기존 방식에 비해 코드의 #간결성 과 #가독성 을 크게 향상시킵니다. PHP 7.4부터 추가된 #Null_병합_할당_연산자 (??=)는 이 기능을 #할당 에 특화시켜 더욱 편리하게 사용할 수 있습니다. 이러한 #연산자 들을 적절히 활용하여 더욱 효율적이고 깔끔한 PHP 코드를 작성하시길 바랍니다.
'프로그램 > PHP 초급' 카테고리의 다른 글
| 📚 PHP 초급 - 4주차 - 02 switch 문 (0) | 2025.06.28 |
|---|---|
| 📚 PHP 초급 - 4주차 - 01 if, else if, else 문: 코드의 흐름을 제어하는 조건문 (0) | 2025.06.27 |
| 📚 PHP 초급 - 3주차 - 03 오류 제어 연산자 (@): 오류 메시지 숨기기 (0) | 2025.06.27 |
| 📚 PHP 초급 - 3주차 - 02 조건 연산자 (삼항 연산자 ?:): 간결하게 조건 처리하기 (0) | 2025.06.27 |
| 📚 PHP 초급 - 3주차 - 01 산술, 할당, 비교, 논리, 증감 연산자: 값들을 조작하고 판단하기 (1) | 2025.06.27 |