📚 PHP 초급 - 3주차 - 04 Null 병합 연산자 (??): 변수 존재 여부 간결하게 확인하기

2025. 6. 27. 02:54프로그램/PHP 초급

📚 PHP 초급 - 3주차 - 04 Null 병합 연산자 (??): 변수 존재 여부 간결하게 확인하기

📚 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
 
<?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
 
<?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
 
<?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
 
<?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
 
<?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 코드를 작성하시길 바랍니다.