연산과 연산자 우선순위
연산자 우선순위는 여러 연산자가 하나의 표현식(expression) 내에 있을 때 어떤 연산자가 먼저 계산되는지를 결정합니다.
연산자의 우선순위는 수학에서의 연산 순서와 유사합니다. 예를 들면, 곱셈과 나눗셈은 덧셈이나 뺄셈보다 우선적으로 수행됩니다.
아래 표에서 순위가 가장 높은 것이 먼저, 순위가 가장 낮은 것이 나중에 연산됩니다.
순위 | 연산자 기호 | 설명 |
---|---|---|
1 | (값…), {값…}, [값…], {키:값…} | 튜플, 셋, 리스트, 딕셔너리 생성 |
2 | x[인덱스], x[인덱스:인덱스], x(인수…), x.속성 | 리스트와 튜플 인덱싱, 슬라이싱, 함수 호출, 속성 참조 |
3 | await x | await 표현식 |
4 | ** | 거듭제곱 |
5 | +, -, ~ | 부호, 비트 NOT |
6 | *, /, //, %, @ | 곱하기, 나누기, 내림 나눗셈, 나머지, 행렬 곱셈(numpy 등에서 활용) |
7 | +, - | 더하기, 빼기 |
8 | <<, >> | 쉬프트 연산 |
9 | & | 비트연산 AND |
10 | ^ | 비트연산 OR |
11 | in, not in, is, is not, <, ≤, >, ≥, ==, != | 멤버 연산자, 식별 연산자, 비교 연산자 |
12 | not | 논리 부정 |
13 | and | 논리 AND |
14 | or | 논리 OR |
15 | if else | 조건부 표현식 |
16 | lambda | 람다 표현식 |
17 | := | 할당 표현식 |
이러한 우선순위를 이해하면 코드의 가독성을 높이고 복잡한 수식도 쉽게 분석하고 평가할 수 있습니다.
아래와 같은 경우가 헷갈리는 케이스이니 우선순위가 잘 생각나지 않는다면 프로그래밍을 할 때 괄호()
를 이용하여 묶어 에러를 방지하세요.
다만 모든 연산자가 우선순위에 따라 연산되는 것은 아닙니다. 예를 들어, and나 or 연산의 경우 우선순위 보다 왼쪽에서 오른쪽으로 계산됩니다.
위 코드의 경우 우선순위로 따른다면 나누기 연산을 먼저 했어야 합니다. 하지만 and 연산자는 왼쪽에서 오른쪽으로 계산되기 때문에 앞의 결과가 0이므로 뒤의 나누기 연산은 수행되지 않습니다. 참고로 1/0
은 ZeroDivisionError
가 발생합니다. 만약 연산자 우선순위대로 연산이 되었다면 ZeroDivisionError
가 발생해야 합니다.