본문 바로가기

연산과 연산자 우선순위

1. 연산자 우선순위

연산자 우선순위는 여러 연산자가 하나의 표현식(expression) 내에 있을 때 어떤 연산자가 먼저 계산되는지를 결정합니다.

연산자 우선순위가 헷갈릴 때는 괄호()를 사용하여 명시적으로 연산 순서를 지정하세요. 코드의 가독성과 정확성이 향상됩니다.

연산자의 우선순위는 수학에서의 연산 순서와 유사합니다. 예를 들면, 곱셈과 나눗셈은 덧셈이나 뺄셈보다 우선적으로 수행됩니다.

아래 표에서 순위가 가장 높은 것이 먼저, 순위가 가장 낮은 것이 나중에 연산됩니다.

순위연산자 기호설명
1(값…), {값…}, [값…], {키:값…}튜플, 셋, 리스트, 딕셔너리 생성
2x[인덱스], x[인덱스:인덱스], x(인수…), x.속성리스트와 튜플 인덱싱, 슬라이싱, 함수 호출, 속성 참조
3await xawait 표현식
4**거듭제곱
5+, -, ~부호, 비트 NOT
6*, /, //, %, @곱하기, 나누기, 내림 나눗셈, 나머지, 행렬 곱셈(numpy 등에서 활용)
7+, -더하기, 빼기
8<<, >>쉬프트 연산
9&비트연산 AND
10^비트연산 XOR
11|비트연산 OR
12in, not in, is, is not, <, <=, >, >=, ==, !=멤버 연산자, 식별 연산자, 비교 연산자
13not논리 부정
14and논리 AND
15or논리 OR
16if else조건부 표현식
17lambda람다 표현식
18:=할당 표현식

이러한 우선순위를 이해하면 코드의 가독성을 높이고 복잡한 수식도 쉽게 분석하고 평가할 수 있습니다.

아래와 같은 경우가 헷갈리는 케이스이니 우선순위가 잘 생각나지 않는다면 프로그래밍을 할 때 괄호()를 이용하여 묶어 에러를 방지하세요.

-2 ** 2 # 출력: -4, -(2 ** 2)
True * True and True + False # 출력: 1 , ((True * True) and (True + False))
# 복합 할당 연산자가 가장 나중입니다!
a = 10
a *= 10 + 100
a # 출력: 1100

여기서 우선순위와 평가 순서를 구분할 필요가 있습니다. 우선순위는 식을 어떻게 묶을지를 정할 뿐, 묶인 조각을 어떤 순서로 실제 계산할지까지 정하지는 않습니다.

0+1*0 and 1/0

위 식은 우선순위에 따라 (0+1*0) and (1/0)으로 묶입니다. 여기까지가 우선순위의 역할입니다. 이제 실행 단계에서 파이썬은 왼쪽 조각부터 계산하는데, 그 값이 0이라 결과가 이미 확정되므로 오른쪽 조각을 아예 건드리지 않습니다. 그래서 1/0이 식 안에 버젓이 있는데도 ZeroDivisionError가 나지 않습니다.

and와 or가 가진 이 성질을 단락 평가라고 하며, 논리연산 장에서 자세히 다뤘습니다. 우선순위가 무시된 것이 아니라, 묶인 조각 중 일부가 실행되지 않았을 뿐이라는 점을 기억해주세요.

연산과 연산자 우선순위 - 견고한 파이썬 | 위니버시티