
1. PHP 연산자의 기초 정의
**연산자(Operator)**란 산술 계산이나 논리 비교 등 특정한 작업을 수행하기 위해 사용되는 기호를 말합니다. 이때 연산의 대상이 되는 데이터나 변수를 **피연산자(Operand)**라고 부릅니다.
연산자는 필요한 피연산자의 개수에 따라 '항'이라는 개념으로 구분됩니다. PHP에서 가장 흔하게 접하는 산술 연산자처럼 두 개의 피연산자가 필요한 경우를 이항 연산자라고 합니다. 연산자는 단순한 계산을 넘어, 데이터를 어떻게 변형하고 프로그램의 분기점을 어떻게 설정할지 결정하는 엔진 역할을 수행합니다.
2. 가장 기본이 되는 산술 연산자 (Arithmetic Operators)
산술 연산자는 수치 데이터를 다루는 기본입니다. PHP 5.6에서 추가된 거듭제곱 연산자를 포함하여 주요 연산자를 정리하면 다음과 같습니다.
연산자설명결합 방향
|
+
|
왼쪽 피연산자에 오른쪽 피연산자를 더함
|
왼쪽 → 오른쪽
|
|
-
|
왼쪽 피연산자에서 오른쪽 피연산자를 뺌
|
왼쪽 → 오른쪽
|
|
*
|
왼쪽 피연산자에 오른쪽 피연산자를 곱함
|
왼쪽 → 오른쪽
|
|
/
|
왼쪽 피연산자를 오른쪽 피연산자로 나눔
|
왼쪽 → 오른쪽
|
|
%
|
나눈 후의 나머지 값을 반환
|
왼쪽 → 오른쪽
|
|
**
|
왼쪽 피연산자를 오른쪽 피연산자만큼 거듭제곱 (PHP 5.6+)
|
오른쪽 → 왼쪽
|
증감 연산자의 정밀 분석: 전위 vs 후위
++와 -- 연산자는 코드를 간결하게 만들지만, 실행 순서를 정확히 이해하지 못하면 치명적인 논리 버그를 초래합니다.
• 후위(Postfix) 연산: 1. 현재의 변수 값을 먼저 사용(할당)한 뒤, 2. 변수의 값을 1 증가/감소시킵니다.
• 전위(Prefix) 연산: 1. 변수의 값을 먼저 1 증가/감소시킨 뒤, 2. 바뀐 값을 사용(할당)합니다.
<?php
$a = 5;
$b = $a++; // 후위 연산: $b에 5가 먼저 할당된 후, $a는 6이 됨
echo "후위 결과 - b: $b, a: $a\n"; // b: 5, a: 6
$x = 5;
$y = ++$x; // 전위 연산: $x가 6이 된 후, $y에 6이 할당됨
echo "전위 결과 - y: $y, x: $x\n"; // y: 6, x: 6
?>
시니어의 조언: 복잡한 수식 내에서 증감 연산자를 섞어 쓰는 것은 가독성을 해치고 예상치 못한 부작용(Side-effect)을 낳을 수 있으므로, 가급적 단독 문장으로 분리하여 사용하는 것을 권장합니다.
3. 문자열과 대입 연산의 조화
PHP는 문자열 결합을 위해 마침표(.) 연산자를 사용합니다. 이는 다른 언어와의 차별점이며, 복합 대입 연산자와 결합했을 때 매우 효율적입니다.
• 문자열 결합: $full = "Hello" . " " . "World";
• 복합 대입 연산자: +=, -=, *=, /= 등과 함께 문자열 결합 대입 연산자인 .=은 긴 HTML 구문이나 메시지를 누적할 때 유용합니다.
<?php
$html = "<ul>";
$html .= "<li>항목 1</li>"; // $html = $html . "<li>항목 1</li>"과 동일
$html .= "</ul>";
echo $html;
?>
4. 논리적 판단을 위한 비교 및 논리 연산자
느슨한 비교(==) vs 엄격한 비교(===)
PHP의 'Type Juggling'은 편리하지만 보안상 위험을 내포합니다. 느슨한 비교는 값의 타입을 자동으로 변환하여 비교하므로, 예상치 못한 true를 반환할 수 있습니다.
<?php
// PHP 8.0 이전: 0 == "string" 은 true 였으나, PHP 8.0+ 부터는 false를 반환합니다.
// 하지만 0 == "0" 은 여전히 true 입니다.
var_dump(0 == "0"); // bool(true) - 느슨한 비교 (값 위주)
var_dump(0 === "0"); // bool(false) - 엄격한 비교 (값 + 타입)
?>
보안 인사이트: 인증 로직이나 해시 비교 시에는 반드시 ===를 사용하십시오. 느슨한 비교는 'Magic Hash' 취약점 등을 유발하여 인증 우회의 원인이 될 수 있습니다.
비트 연산자와 데이터 단위
비트 연산자는 데이터를 비트(bit) 단위로 조작합니다. 이때 1은 true, 0은 false로 치환되어 연산이 수행됩니다.
• & (AND), | (OR), ^ (XOR), ~ (NOT), << (Left Shift), >> (Right Shift)
비트 연산을 이해하기 위해서는 컴퓨터의 정보 저장 단위에 대한 이해가 필수적입니다.
단위용량 및 관계
|
Bit
|
0 또는 1 (최소 단위)
|
|
Byte
|
8 Bits (정보의 기본 단위)
|
|
1 KB
|
1024 Bytes
|
|
1 MB
|
1024 KB
|
|
1 GB
|
1024 MB
|
|
1 TB
|
1024 GB
|
5. 모던 PHP의 강력한 연산 기능 (PHP 7 & 8)
삼항 연산자(?:) vs Null 병합 연산자(??)
두 연산자는 기본값을 설정할 때 자주 쓰이지만, Falsy 값을 처리하는 기준이 다릅니다. PHP에서 Falsy 값이란 0, false, ""(빈 문자열), null, [](빈 배열)을 의미합니다.
연산자동작 방식미정의 변수 처리
|
?? (Null 병합)
|
null일 때만 오른쪽 값 반환
|
에러 없이 실행 (안전)
|
|
?: (삼항 축약)
|
모든 Falsy 값일 때 오른쪽 값 반환
|
Notice/Warning 발생 가능
|
<?php
$input = "";
echo $input ?? "Default"; // "" 출력 (null이 아니므로)
echo $input ?: "Default"; // "Default" 출력 (""는 Falsy이므로)
?>
Match 표현식 (PHP 8.0+)
match는 기존 switch 문의 단점을 보완한 현대적인 표현식입니다. **엄격한 비교(===)**를 수행하며 결과를 직접 반환합니다.
<?php
$status = 200;
$result = match ($status) {
200, 201 => "Success", // 여러 조건 쉼표로 처리
400, 404 => "Client Error",
default => "Unknown Status",
};
echo $result;
?>
6. 연산자 우선순위와 안전한 코드 작성법
연산자 우선순위 요약
복잡한 수식은 아래의 우선순위에 따라 계산됩니다. 괄호 () > 증감 ++ > 산술 * / + - > 비교 == > > 논리 && || > 대입 =
실무 조언 및 보안 주의사항
1. 가독성: 우선순위를 암기하기보다 괄호()를 사용하여 의도를 명확히 표현하십시오.
2. 백틱(`) 연산자: 쉘 명령 실행 시 사용됩니다. 이는 shell_exec()와 동일하게 동작하며, 외부 입력값이 포함될 경우 커맨드 인젝션(Command Injection) 취약점이 발생하므로 실무에서는 사용을 지양해야 합니다.
3. Heredoc vs Nowdoc:
◦ Heredoc (<<<LABEL): 문자열 내 변수를 해석(parsing)합니다.
◦ Nowdoc (<<<'LABEL'): 작은따옴표로 감싼 것과 같으며, 변수를 해석하지 않고 문자열 그대로 출력합니다. 복잡한 HTML이나 설정값 출력 시 이스케이프 지옥에서 벗어나게 해줍니다.
<?php
$name = "PHP";
// Heredoc: 변수 출력 가능
echo <<<HEREDOC
Hello $name
HEREDOC;
// Nowdoc: 변수 해석 안 함
echo <<<'NOWDOC'
Hello $name
NOWDOC; // 출력 결과: Hello $name
?>
7. 결론: 효율적인 PHP 개발을 위한 제언
지금까지 PHP의 기본 연산자부터 8.x 버전의 최신 기능까지 살펴보았습니다. 연산자는 단순히 계산을 위한 도구가 아니라, 성능과 보안, 가독성을 결정짓는 코드의 뼈대입니다. 특히 **엄격한 비교(===)**를 생활화하고, 상황에 맞는 Null 병합 연산자를 활용하는 습관을 들이십시오.
'Backend > Php' 카테고리의 다른 글
| 조건문 if...else: 상황에 따라 다르게 동작하는 스마트한 코드 만들기 (0) | 2026.02.17 |
|---|---|
| 데이터 꾸러미, PHP 배열(Array) 기초: 인덱스 배열과 연관 배열 (0) | 2026.02.17 |
| 문자열의 마술: PHP에서 큰따옴표와 작은따옴표의 결정적 차이 (0) | 2026.02.16 |
| 절대 변하지 않는 값, PHP 상수의 선언과 활용 (define vs const) (0) | 2026.02.16 |
| 달러($) 기호의 비밀: PHP 변수 선언 규칙과 데이터 타입 완벽 정리 (0) | 2026.02.16 |
