8. 연산자와 수식

앞으로 작성할 모든 명령문(논리적 명령행)은 '수식'을 포함할 것입니다. 아주 간단한 수식의 한 예는 2 + 3 입니다. 수식은 연산자와 피연산자로 나눌 수 있습니다.

'연산자'는 무언가를 계산할 때 쓰이는 한 기능을 뜻합니다. +와 같이 기호나 특별한 키워드로 표현합니다. 연산자는 계산에 사용될 데이터를 필요로 하는데, 이를 '피연산자'라고 합니다. 앞의 수식에서 피연산자는 2와 3입니다.


8.1 연산자

이제 연산자의 사용법에 대해 알아보겠습니다. 파이썬 인터프리터 프롬프트 상에서도 수식을 계산할 수 있습니다. 다음과 같이 파이썬 인터프리터 프롬프트 상에서 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를 반환합니다. 13.0 / 3은 4.333333333333333을 반환합니다.


  • 나머지 연산자 %

나머지 연산자 %는 x를 y로 나눈 나머지를 반환합니다.
13 % 3은 1 을 반환합니다. -25.5 % 2.25는 1.5를 반환합니다.


  • 왼쪽 시프트 연산자 <<

지정된 숫자에 대해 지정된 비트 수 만큼 왼쪽 시프트 연산을 합니다(모든 숫자는 메모리상에서 0 또는 1 비트로 구성된 이진수로 표현됩니다).

2 << 2는 8을 반환합니다. 2는 이진수로 10입니다. 이것을 왼쪽으로 2비트 시프트 연산하면 이진수 1000이 되고, 이것을 정수로 표현하면 8이 됩니다.


  • 오른쪽 시프트 연산자 >>

지정된 숫자에 대해 지정된 비트 수 만큼 오른쪽 시프트 연산을 합니다.

11 >> 1은 5를 반환합니다. 11은 이진수로 1011이며, 오른쪽으로 1비트 시프트 연산을 하면 이진수 101이 됩니다. 이진수 101은 정수로 5입니다.


  • 비트 AND 연산자 &

&는 비트 AND 연산값을 반환합니다. 5 & 3은 1을 반환합니다.


  • 비트 OR 연산자 |

비트 OR 연산값을 반환합니다. 5 | 3은 7을 반환합니다.


  • 비트 XOR 연산자 ^

비트 XOR 연산값을 반환합니다. 5 ^ 3은 6을 반환합니다.


  • 비트 반전 연산자 ~

비트 반전 연산자 ~는 숫자 x의 비트 반전 연산값 -(x+1)을 반환합니다. ~5는 -6을 반환합니다. 자세한 사항은 http://stackoverflow.com/a/11810203을 읽어 보시기 바랍니다.


  • 작음 <

x가 y보다 작은지 여부를 반환합니다. 모든 비교 연산자는 True(참) 또는 False(거짓)을 반환합니다. 각 반환값의 첫 글자는 대문자라는 점에 유의하세요.

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를 반환하고 True면 y와의 and 연산값을 반환합니다.

x = False; y = True; x and y를 계산할 경우 x가 False이므로 y 값에 관계없이 x and y의 값은 False임이 자명하므로, x의 값이 False임이 확인되는 즉시 결괏값 False가 반환되며 이때 y의 값은 계산되지 않습니다. 이것을 단축 계산short-circuit evalulation이라고 부릅니다.


  • 불리언 OR 연산자 or

x가 True면 True가 반환되며, False면 y와의 or 연산값을 반환합니다.

x = True; y = False; x or y는  True가 반환됩니다. 여기서도 불리언 AND 연산자 예제와 같이 단축 계산이 적용됩니다.



8.2 연산 및 할당 연산자

다음 예제와 같이, 변수 값에 어떤 연산을 한 뒤 다시 그 변수에 연산값을 할당하는 경우는 자주 있습니다.

a = 2
a = a * 3


이 경우, 다음과 같이 연산과 할당을 한번에 줄여 쓸 수 있습니다.

a = 2
a *= 3


즉, (변수) = (변수) (연산자) (수식)이 (변수) (연산자)= (수식)의 형태가 됩니다.


8.3 연산 순서

2 + 3 * 4와 같은 수식을 계산한다고 합시다. 덧셈이 먼저일까요, 곱셈이 먼저일까요? 초등학교 시절에 이미 배우셨겠지만, 곱셈을 먼저 계산해야 합니다. 이것은 곱셈 연산이 덧셈 연산보다 연산 순서에서 우위에 있기 때문입니다.

다음 표는 파이썬에서의 연산 순서를 나타내고 있습니다. 맨 위부터 가장 늦게 계산되는 순서대로 나열한 것입니다. 이것은 특정한 수식이 주어졌을 때 파이썬은 이 표의 가장 아래에 위치한 연산부터 차례대로 계산한다는 의미합니다.

다음 표는 파이썬 레퍼런스 매뉴얼에서 가져온 것입니다. 연산 순서를 적절히 조절하기 위해서는 괄호를 적당한 위치에 사용하는 것이 좋습니다. 또, 적절한 괄호의 사용은 프로그램을 좀 더 읽기 쉽게 해 줍니다. 8.4 연산 순서 변경에서 연산 순서에 대해서는 좀 더 자세히 살펴보겠습니다.

연산자 설명
lambda 람다 수식
if – else 조건 수식
or 불리언 OR
and 불리언 AND
not x 불리언 NOT
innot inisis not<<=>>=!=== 비교 연산, 요소 연산, 관계 연산
| 비트 OR
^ 비트 XOR
& 비트 AND
<<>> 시프트 연산
+- 덧셈 및 뺄셈 연산
*@///% 곱셈, 나눗셈 후 내림 연산, 나머지 연산
+x-x~x 양수 표현, 음수 표현, 비트 NOT 연산
** 거듭제곱
await x await 연산
x[index]x[index:index]x(arguments...)x.attribute 원소 접근, 슬라이스, 함수 호출, 속성 참조

(expressions...)[expressions...]

{key:value...}{expressions...}

괄호 또는 튜플, 리스트, 사전, 집합


아직 이 연산자들에 대해 모두 다루지 않았지만, 곧 다루게 될 것입니다. 같은 연산 순서를 갖는 연산자는 이 표에서 같은 행에 위치하고 있습니다. 예를 들어, + 연산자와 - 연산자는 연산 순서가 같습니다.


8.4 연산 순서 변경

괄호를 사용하여 수식을 좀 더 읽기 쉽게 표현할 수 있습니다. 예를 들어, 2 + 3 * 4를 2 + (3 * 4)라고 쓰면 연산자 순서를 잘 모르는 사람도 쉽게 읽을 수 있습니다. 그렇지만, 괄호를 적당히 사용하는 것도 중요합니다. (2 + (3 * 4))와 같이 괄호를 너무 많이 사용하는 것은 피하세요.

또 괄호를 사용하면 연산의 순서를 바꿀 수 있습니다. 예를 들어 앞의 수식에서 덧셈을 곱셈보다 먼저 계산하고 싶을 경우 (2 + 3) * 4라고 적으면 됩니다.


8.5 같은 연산 순서를 가질 경우

기본적으로 연산자는 왼쪽에서 오른쪽으로 차례대로 계산됩니다. 즉, 같은 연산 순서를 가진 연산자의 경우 왼쪽에서 오른쪽으로 순서대로 계산됨을 의미합니다. 예를 들어, 2 + 3 + 4는 (2 + 3) + 4와 같습니다. 다만, 할당 연산자와 같은 몇몇 특별한 연산자는 오른쪽에서 왼쪽으로 계산됩니다. 예를 들어 a = b = c는 a = (b = c)와 같습니다.


8.6 수식 예제

length = 5
breadth = 2

area = length * breadth
print 'Area is', area
print 'Perimeter is', 2 * (length + breadth)
이 코드를 복사하여 expression.py로 저장하세요.

이 코드를 실행한 결과는 다음과 같습니다.

$ python expression.py
Area is 10
Perimeter is 14


먼저 직사각형의 높이와 너비가 각각 length와 breadth 변수에 저장됩니다. 이제 앞서 배운 수식과 두 변수를 이용해 직사각형의 면적과 둘레를 계산합니다. 첫번째로 area라는 변수에 length * breadth 수식의 결과가 저장되며, 이 값은 print 명령에 의해 화면에 출력됩니다. 두번째로는 print 명령에 곧바로 2 * (length + breadth라는 수식을 직접 입력하여 결과를 화면에 출력합니다.

파이썬이 얼마나 예쁘게 결과를 보여주는지 확인하세요. 우리가 Area is라는 문자열이나 area라는 변수에 공백을 지정하지 않았음에도, 파이썬이 그 둘 사이에 자동으로 공백을 넣어줘 계산 결과가 깔끔하고 멋지게 출력되었습니다. 이것은 파이썬이 프로그래머의 삶을 좀 더 쉽게 만들어주는 좋은 예의 하나입니다.


8.7 요약

지금까지 연산자, 피연산자, 수식에 대해 알아보았습니다. 이들은 여러분이 앞으로 작성할 프로그램의 기본적인 골격이 되어 줄 것입니다. 다음으로는, 여러분의 프로그램에서 명령문을 이용하여 지금까지 배운 것을 응용해 보겠습니다.