소개
연산자 우선순위(operator precedence)는 하나의 표현식 안에서 여러 연산자가 어떤 순서로 실행되는지를 결정하는 규칙입니다. 예를 들어 2+6/3이라는 식에서는 나눗셈 6/3이 먼저 계산되고, 그다음에 덧셈 2+2가 수행됩니다. 이는 나눗셈 연산자 /가 덧셈 연산자 +보다 더 높은 우선순위를 갖기 때문입니다.
만약 특정 연산자를 다른 연산자보다 먼저 실행되도록 강제하고 싶다면 괄호(parentheses)를 사용해야 합니다. 예를 들어 (2+6)/3처럼 작성하면 덧셈이 먼저 수행된 후 나눗셈이 실행됩니다.
우선순위가 같은 경우: 결합 방향(Associativity)
일부 연산자들은 서로 같은 수준의 우선순위를 가질 수 있습니다. 이 경우에는 결합 방향(associativity), 즉 왼쪽에서 오른쪽으로 평가하는지(left) 아니면 오른쪽에서 왼쪽으로 평가하는지(right)에 따라 연산 순서가 결정됩니다.
예를 들어 산술 연산자는 대부분 왼쪽 결합이므로 5-3-2는 (5-3)-2 = 0으로 계산됩니다. 반면 거듭제곱 연산자 **는 오른쪽 결합이므로 2**3**2는 2**(3**2) = 512로 평가됩니다.
또한 같은 우선순위 수준을 가지면서도 비결합(non-associative)으로 지정된 연산자들은 서로 인접해서 사용할 수 없습니다. 이런 경우 코드에 혼란을 줄 수 있으므로 괄호를 사용해 의도를 명확히 하는 것이 좋습니다.
PHP 연산자 우선순위 표
아래 표는 PHP의 주요 연산자들을 우선순위가 높은 순서부터 낮은 순서대로 정리한 것입니다. 위쪽에 있을수록 먼저 실행됩니다.
| 연산자 | 용도 |
| clone new | 객체 복제(clone) 및 인스턴스 생성(new) |
| ** | 거듭제곱(exponentiation) |
| ++ -- | 증가/감소(increment/decrement) |
| ~ (int) (float) (string) (array) (object) (bool) | 형 변환(casting) |
| instanceof | 타입 검사(types) |
| ! | 논리 NOT |
| * / | 곱셈/나눗셈 |
| % | 나머지(modulo) |
| + - . | 산술 연산 및 문자열 연결 |
| << >> | 비트 시프트(bitwise shift) |
| < <= > >= | 비교(comparison) |
| == != === !== <> <=> | 비교(comparison) |
| & | 비트 AND / 참조(reference) |
| ^ | 비트 XOR |
| | | 비트 OR |
| && | 논리 AND |
| || | 논리 OR |
| ?? | null 병합(null coalescing) |
| ? : | 삼항 연산자(ternary) |
| = += -= *= **= /= .= %= &= |= ^= <<= >>= ??= | 대입 연산자(assignment) |
| yield from | yield from |
| yield | yield |
| and | 논리 AND |
| xor | 논리 배타적 OR |
| or | 논리 OR |
주의할 점
특히 and, or, xor 같은 단어 형태의 논리 연산자는 &&, ||보다 우선순위가 훨씬 낮고, 대입 연산자(=)보다도 낮습니다. 따라서 $result = true and false;와 같은 코드는 의도와 달리 $result에 true가 대입되는 결과를 낳을 수 있습니다. 실무에서는 가능한 한 기호 형태의 논리 연산자(&&, ||)를 사용하고, 복잡한 표현식에는 괄호를 활용해 우선순위를 명확하게 드러내는 것이 바람직합니다.