연산자와 표현식

프로그램을 구성하는 대부분의 문장(논리 회선)은 표현식(expression)을 포함할 것입니다. 표현식의 간단한 예는 2 + 3입니다. 표현식은 연산자와 피연산자로 나눌 수 있습니다.

연산자(operator)는 어떤 일을 수행하고 + 같은 기호나 특별한 키워드로 표현할 수 있는 기능입니다. 연산자는 연산을 수행할 데이터를 필요로 하며, 그러한 데이터를 피연산자(operand)라고 합니다. 앞의 예에서 23이 피연산자입니다.

연산자

이번에는 연산자를 소개하고 연산자의 사용법을 간략하게 살펴보겠습니다.

참고로 예제에 포함된 표현식은 인터프리터를 통해 곧바로 평가할 수 있습니다. 예를 들어, 2 + 3이라는 표현식을 테스트하려면 인터랙티브 파이썬 인터프리터 프롬프트를 사용하면 됩니다.

>>> 2 + 3
5
>>> 3 * 5
15
>>>

다음은 파이썬에서 사용할 수 있는 연산자를 간략하게 정리한 것입니다.

  • + (더하기)

    • 두 객체를 더합니다.
    • 3 + 5의 결과는 8입니다. 'a' + 'b'의 결과는 'ab'입니다.
  • - (빼기)

    • 한 숫자에서 다른 숫자를 뺍니다. 첫 번째 피연산자를 지정하지 않으면 0으로 간주됩니다.
    • -5.2의 결과는 음수 숫자이고, 50 - 24의 결과는 26입니다.
  • * (곱하기)

    • 두 숫자를 곱하거나 지정한 횟수만큼 문자열을 반복한 결과를 반환합니다.
    • 2 * 3의 결과는 6입니다. 'la' * 3의 결과는 'lalala'입니다.
  • ** (거듭제곱)

    • x를 y만큼 거듭제곱합니다.
    • 3 ** 4의 결과는 81입니다(3 * 3 * 3 * 3)
  • / (나누기)

    • x를 y로 나눕니다.
    • 13 / 3의 결과는 4.333333333333333입니다.
  • // (정수 나눗셈)

    • x를 y로 나누고 몫을 가장 가까운 정수 값으로 내림합니다. 두 값 중 하나가 부동 소수점 수이면 결과도 부동 소수점 수입니다.
    • 13 // 3의 결과는 4입니다.
    • -13 // 3의 결과는 -5입니다.
    • 9//1.81의 결과는 4.0입니다.
  • % (나머지)

    • 나눗셈의 나머지를 구합니다.
    • 13 % 3의 결과는 1입니다. -25.5 % 2.25의 결과는 1.5입니다.
  • << (왼쪽 시프트)

    • 숫자를 지정한 비트 수만큼 왼쪽으로 시프트합니다. (각 숫자는 메모리 상에서 비트, 즉 2진수인 0과 1로 표현됩니다)
    • 2 << 2의 결과는 8입니다. 2를 비트로 표현하면 10입니다.
    • 2비트만큼 왼쪽 시프트한 결과는 십진수 8을 나타내는 1000입니다.
  • >> (오른쪽 시프트)

    • 숫자를 지정한 비트 수만큼 오른쪽으로 시프트합니다.
    • 11 >> 1의 결과는 5입니다.
    • 11을 비트로 나타내면 1011이며, 1비트만큼 오른쪽 시프트한 결과는 101로서 십진수 5에 해당합니다.
  • & (비트 AND)

    • 숫자에 대해 비트 AND 연산을 수행합니다.
    • 5 & 3의 결과는 1입니다.
  • | (비트 OR)

    • 숫자에 대해 비트 OR 연산을 수행합니다.
    • 5 | 3의 결과는 7입니다.
  • ^ (비트 XOR)

    • 숫자에 대해 비트 XOR 연산을 수행합니다.
    • 5 ^ 3의 결과는 6입니다.
  • ~ (비트 NOT)

  • < (~보다 작다)

    • x가 y보다 작은지 여부를 반환합니다. 모든 비교 연산은 TrueFalse를 반환합니다. 두 값의 첫 글자가 대문자라는 데 주의하세요.
    • 5 < 3의 결과는 False이고 3 < 5의 결과는 True입니다.
    • 비교 대상을 연결할 수 있습니다: 3 < 5 < 7의 결과는 True입니다.
  • > (~보다 크다)

    • x가 y보다 큰지 여부를 반환합니다.
    • 5 > 3의 결과는 True입니다. 두 피연산자가 모두 숫자이면 먼저 두 값은 공통 타입으로 변환됩니다. 그 밖의 경우에는 항상 False를 반환합니다.
  • <= (~보다 작거나 같다)

    • x가 y보다 작거나 같은지 여부를 반환합니다.
    • x = 3; y = 6; x <= y의 결과는 True입니다.
  • >= (~보다 크거나 같다)

    • x가 y보다 크거나 같은지 여부를 반환합니다.
    • x = 4; y = 3; x >= 3의 결과는 True입니다.
  • == (같다)

    • 두 객체가 같은지 비교합니다.
    • x = 2; y = 2; x == y의 결과는 True입니다.
    • x = 'str'; y = 'stR'; x == y의 결과는 False입니다.
    • x = 'str'; y = 'str'; x == y의 결과는 True입니다.
  • != (같지 않다)

    • 두 객체가 같지 않은지 비교합니다.
    • x = 2; y = 3; x != y의 결과는 True입니다.
  • not (불리언 NOT)

    • x가 True이면 False를 반환합니다. x가 False이면 True를 반환합니다.
    • x = True; not x의 결과는 False입니다.
  • and (불리언 AND)

    • x and y에서 x가 False이면 결과는 False이고, x가 True이면 y를 평가한 결과를 반환합니다.
    • x = False; y = True; x and y에서는 x가 False이기 때문에 False를 반환합니다. 이 경우 파이썬은 y를 평가하지 않을 텐데, 'and' 표현식의 좌항이 False여서 결과적으로 나머지 표현식을 평가하는 것과 상관없이 전체 표현식이 False가 되기 때문입니다. 이를 단축 평가(short-circuit evaluation)라고 합니다.
  • or (불리언 OR)

    • x가 True이면 True를 반환하고, 그렇지 않으면 y를 평가한 결과를 반환합니다.
    • x = True; y = False; x or y의 결과는 True입니다. 여기에도 단축 평가가 적용됩니다.

수학 연산과 할당의 축약식

변수를 대상으로 수학 연산을 수행한 후 연산의 결과를 다시 변수에 할당할 때가 많으므로 그러한 표현식을 줄인 축약식이 있습니다.

a = 2
a = a * 3

위 코드는 다음과 같이 작성할 수 있습니다.

a = 2
a *= 3

var = var operation expressionvar operation= expression이 된다는 점에 주의하세요.

평가 순서

2 + 3 * 4와 같은 표현식이 있다면 더하기를 먼저 할까요, 곱하기를 먼저 할까요? 고등학교 수학시간에 배운 바로는 곱하기를 먼저 해야 합니다. 이것은 곱하기 연산자가 더하기 연산자보다 우선순위가 더 높다는 뜻입니다.

아래에 나오는 내용은 파이썬에서 가장 낮은 우선순위(least binding)부터 가장 높은 우선순위(most binding)까지 우선순위를 정리한 표입니다. 즉, 이 표의 상단에 나열된 것보다 하단에 나열된 연산자나 표현식을 먼저 평가합니다.

다음 표는 전체 우선순위를 참조하기 위해 파이썬 참조 매뉴얼에서 가져온 것입니다. 우선순위를 명확하게 지정하려면 괄호를 이용해 연산자와 피연산자를 적절하게 묶는 것이 훨씬 좋습니다. 이렇게 하면 프로그램의 가독성이 높아집니다. 더 자세한 사항은 평가 순서 바꾸기를 참고하세요.

  • lambda: 람다 표현식
  • if - else: 조건식
  • or: 불리언 OR
  • and: 불리언 AND
  • not x: 불리언 NOT
  • in, not in, is, is not, <, <=, >, >=, !=, ==: 비교(포함 여부 검사 및 동일성 검사를 포함)
  • |: 비트 OR
  • ^: 비트 XOR
  • &: 비트 AND
  • <<, >>: 시프트
  • +, -: 더하기, 빼기
  • *, /, //, %: 곱하기, 나누기, 정수 나누기, 나머지
  • +x, -x, ~x: 양수, 음수, 비트 NOT
  • **: 지수승
  • x[index], x[index:index], x(arguments...), x.attribute: 인덱싱, 슬라이싱, 함수 호출, 속성 참조
  • (expressions...), [expressions...], {key: value...}, {expressions...}: 바인딩 또는 튜플 표시, 리스트 표시, 딕셔너리 표시, 세트 표시

여기에 나열하지 않은 연산자는 이후 장에서 설명하겠습니다.

우선순위가 같은 연산자는 표에서 같은 줄에 나열돼 있습니다. 예를 들어, +-는 우선순위가 같습니다.

평가 순서 바꾸기

표현식의 가독성을 높이려면 괄호를 쓰면 됩니다. 예를 들어, 2 + (3 * 4)가 연산자 우선순위에 대한 지식이 필요한 2 + 3 * 4보다 훨씬 이해하기 쉽습니다. 중요한 것은 괄호는 적당히(남용하지 말고) 사용해야 하고 (2 + (3 * 4))처럼 불필요한 곳에 써서는 안 된다는 것입니다.

괄호를 사용할 때의 이점이 더 있습니다. 바로 평가 순서를 바꾸기가 쉽다는 것입니다. 예를 들어, 표현식에서 곱하기보다 더하기를 먼저 평가하게 만들고 싶다면 (2 + 3) * 4처럼 작성하면 됩니다.

연산자 결합법칙

보통 연산자는 왼쪽에서 오른쪽으로 결합됩니다. 이것은 우선순위가 같은 연산자는 왼쪽에서 오른쪽 방향으로 평가된다는 뜻입니다. 예를 들어, 2 + 3 + 4(2 + 3) + 4로 평가됩니다.

표현식

예제(expression.py):

length = 5
breadth = 2

area = length * breadth
print('Area is', area)
print('Perimeter is', 2 * (length + breadth))

출력 결과:

$ python expression.py
Area is 10
Perimeter is 14

동작 원리

직사각형의 길이와 너비를 각기 lengthbreadth라는 이름의 변수에 저장합니다. 그런 다음, 표현식을 이용해 직사각형의 넓이와 둘레를 계산합니다. length * breadth 표현식의 결과를 area 변수에 저장한 후 print 함수를 이용해 출력합니다. 두 번째 경우에는 print 함수에서 2 * (length + breadth) 표현식의 값을 곧바로 사용합니다.

또한 파이썬이 출력 결과를 어떻게 깔끔하게 출력했는지 눈여겨봅시다. 'Area is'area 변수 사이에 아무런 공백도 주지 않았는데도 파이썬이 출력 결과를 보기 좋게 만들어서 프로그램의 가독성이 훨씬 개선됐습니다(덕분에 출력 결과에 사용하는 문자열에서 공백을 어떻게 처리할지 신경 쓰지 않아도 됩니다). 이것이 바로 파이썬이 프로그래머의 삶을 편리하게 만들어주는 한 가지 예입니다.

정리

지금까지 연산자와 피연산자, 표현식을 어떻게 사용하는지 살펴봤습니다. 이것들은 모든 프로그램의 가장 기초적인 요소입니다. 다음 장에서는 프로그램에서 문장을 어떻게 사용하는지 알아보겠습니다.