연산자 우선순위란?
연산자 우선순위(operator precedence)는 하나의 표현식 안에 여러 연산자가 함께 사용될 때, 어떤 연산이 먼저 수행되는지를 결정하는 규칙입니다. 우선순위를 정확히 이해하면 복잡한 수식도 헷갈리지 않고 읽을 수 있습니다.
다음 표는 Python의 모든 연산자를 우선순위가 높은 것부터 낮은 것 순으로 정리한 것입니다.
| 번호 | 연산자 | 설명 |
|---|---|---|
| 1 | ** | 지수 연산(거듭제곱) |
| 2 | ~ + - | 비트 보수(complement), 단항 플러스/마이너스 (마지막 두 연산자의 메소드 이름은 각각 +@, -@) |
| 3 | * / % // | 곱셈, 나눗셈, 나머지(modulo), 버림 나눗셈(floor division) |
| 4 | + - | 덧셈과 뺄셈 |
| 5 | >> << | 오른쪽 비트 시프트, 왼쪽 비트 시프트 |
| 6 | & | 비트 AND |
| 7 | ^ | | 배타적 OR(XOR), 일반 OR |
| 8 | <= < > >= | 비교 연산자 |
| 9 | <> == != | 동등(equality) 연산자 ※ 참고: <>는 Python 3에서 제거되었습니다. |
| 10 | = %= /= //= -= += *= **= | 대입(할당) 연산자 |
| 11 | is is not | 식별(identity) 연산자 |
| 12 | in not in | 멤버십(membership) 연산자 |
| 13 | not or and | 논리 연산자 |
즉, 표의 맨 위에 있는 연산자일수록 우선순위가 높고, 맨 아래에 있을수록 우선순위가 낮습니다.
우선순위가 계산에 미치는 영향
간단한 예를 살펴보겠습니다.
x = 7 + 3 * 2
이 코드에서 x에는 20이 아니라 13이 대입됩니다. 그 이유는 곱셈(*)이 덧셈(+)보다 우선순위가 높아 3 × 2가 먼저 계산된 후 7이 더해지기 때문입니다.
예제 코드
#!/usr/bin/python3
a = 20
b = 10
c = 15
d = 5
e = 0
e = (a + b) * c / d # (30 * 15) / 5
print("(a + b) * c / d 의 값 :", e)
e = ((a + b) * c) / d # (30 * 15) / 5
print("((a + b) * c) / d 의 값 :", e)
e = (a + b) * (c / d) # (30) * (15 / 5)
print("(a + b) * (c / d) 의 값 :", e)
e = a + (b * c) / d # 20 + (150 / 5)
print("a + (b * c) / d 의 값 :", e)
실행 결과
위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
(a + b) * c / d 의 값 : 90.0 ((a + b) * c) / d 의 값 : 90.0 (a + b) * (c / d) 의 값 : 90.0 a + (b * c) / d 의 값 : 50.0
결과 해석
앞의 세 식은 괄호의 위치만 다를 뿐 최종 결과가 모두 90으로 동일합니다. 반면 마지막 식은 곱셈(b * c)이 먼저 처리된 후 나눗셈(/ d)과 덧셈(+ )이 순차적으로 계산되면서 전체 결과가 50이 됩니다.
팁: 괄호로 계산 순서를 명확히 하세요
복잡한 수식에서는 연산자 우선순위에만 의존하기보다 괄호 ()를 적극적으로 활용하는 것이 좋습니다. 괄호는 우선순위보다 항상 먼저 적용되므로, 코드의 의도를 명확히 전달하고 실수를 줄이는 데 큰 도움이 됩니다.