Python에서 하나의 수식에 여러 개의 연산자가 함께 사용되면, 어떤 연산을 먼저 수행할지를 결정하는 규칙이 필요합니다. 이를 연산자 우선순위(operator precedence)라고 하며, 수학에서 곱셈을 덧셈보다 먼저 계산하듯이 각 연산자에는 미리 정해진 계산 순서가 있습니다.
Python 연산자 우선순위 표 (높은 순 → 낮은 순)
다음 표는 Python의 연산자들을 우선순위가 가장 높은 것부터 가장 낮은 것 순으로 정리한 것입니다.
| 연산자 | 설명 |
|---|---|
** | 거듭제곱(지수 연산) |
~ + - | 비트 보수(complement), 단항 플러스와 마이너스(뒤의 두 연산자의 메서드 이름은 +@와 -@) |
* / % // | 곱셈, 나눗셈, 나머지(modulo), 버림 나눗셈(floor division) |
+ - | 덧셈과 뺄셈 |
>> << | 오른쪽 시프트와 왼쪽 비트 시프트 |
& | 비트 AND |
^ | | 배타적 OR(XOR)와 일반 OR |
<= < > >= | 비교 연산자 |
<> == != | 동등(equality) 연산자 (※ <>는 Python 3에서 제거됨) |
= %= /= //= -= += *= **= | 대입(할당) 연산자 |
is is not | 식별(identity) 연산자 |
in not in | 멤버십(membership) 연산자 |
not, and, or | 논리 연산자 (세부 순서: not > and > or) |
우선순위 단계별 핵심 정리
1. 거듭제곱 연산자(**)
**는 산술 연산자 중에서 가장 높은 우선순위를 가집니다. 특히 거듭제곱은 오른쪽에서 왼쪽으로 결합되므로, 2 ** 3 ** 2는 2 ** (3 ** 2), 즉 2 ** 9 = 512로 계산됩니다.
2. 단항 연산자(~, +, -)
~는 비트를 반전시키는 보수 연산자이며, 단항 +와 -는 양수·음수 부호를 나타냅니다. 이들은 곱셈·나눗셈보다 먼저 평가되므로 -3 * 2는 (-3) * 2로 해석됩니다.
3. 산술 연산자(*, /, %, //, +, -)
곱셈, 나눗셈, 나머지, 버림 나눗셈이 덧셈과 뺄셈보다 높은 우선순위를 가집니다. 예를 들어 10 + 2 * 3은 곱셈이 먼저 계산되어 결과가 16이 됩니다.
4. 비트 시프트 및 비트 연산자(>>, <<, &, ^, |)
시프트 연산자(<<, >>)가 &(AND)보다 우선하고, &는 ^(XOR)보다, ^는 |(OR)보다 우선합니다.
5. 비교 연산자와 동등 연산자
비교 연산자(<, <=, >, >=)와 동등 연산자(==, !=)는 산술 연산보다는 늦게, 논리 연산보다는 먼저 평가됩니다. 참고로 <>는 Python 2 전용 연산자로 Python 3에서는 제거되었으므로 !=를 사용해야 합니다.
6. 대입, 식별, 멤버십 연산자
대입 연산자(=, +=, *= 등), 식별 연산자(is, is not), 멤버십 연산자(in, not in)는 비교 연산자보다 낮은 우선순위를 가집니다.
7. 논리 연산자(not, and, or)
논리 연산자는 모든 연산자 중에서 우선순위가 가장 낮습니다. 세 연산자 내부에서는 not이 가장 높고, 그다음이 and, 마지막이 or입니다. 예를 들어 A and B or C and D는 (A and B) or (C and D)로 해석됩니다.
괄호()를 활용해 우선순위를 명확하게 만들기
복잡한 수식에서는 괄호를 사용해 계산 순서를 명확히 하는 것이 좋습니다. 괄호는 어떤 연산자보다도 높은 우선순위를 가지며, 실수를 방지하고 코드 가독성을 크게 높여 줍니다.
10 + 2 * 3→ 결과는 16 (곱셈이 먼저 계산됨)(10 + 2) * 3→ 결과는 36 (괄호 안의 덧셈이 먼저 계산됨)
연산자 우선순위가 헷갈릴 때는 항상 괄호를 붙이는 습관을 들이면, 의도하지 않은 버그 없이 깔끔하고 안전한 코드를 작성할 수 있습니다.