연산자와 수식
여러분이 앞으로 작성하게 될 거의 모든 명령문 (논리적 명령줄)은 수식 을 포함하게 될 것입니다. 아주 간단한 수식의 한 예는 2 + 3
입니다. 수식은 연산자와 피연산자로 나누어집니다.
연산자 란 무언가를 계산할 때 쓰이는 특정 기능을 뜻하며, +
와 같이 기호 또는 또는 특별한 키워드로 나타내어집니다. 또 연산자는 계산에 사용될 데이터를 필요로 하는데, 이들을 피연산자 라고 부릅니다. 이 경우, 피연산자는 2
와 3
이 됩니다.
연산자
이제 연산자의 사용법에 대해 알아보도록 하겠습니다.
파이썬 인터프리터 프롬프트 상에서도 수식을 계산할 수 있습니다. 다음과 같이 파이썬 인터프리터 프롬프트 상에서 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
을 반환합니다.
%
(나머지 연산자)- x를 y로 나눈 나머지를 반환합니다.
13 % 3
은1
을 반환합니다.-25.5 % 2.25
은1.5
를 반환합니다.
<<
(왼쪽 시프트 연산자)- 지정된 숫자에 대해 지정된 비트 수 만큼 왼쪽 시프트 연산합니다 (모든 숫자는 메모리상에서 0 또는 1 의 비트로 구성된 이진수로 표현됩니다).
2 << 2
는8
을 반환합니다.2
는 이진법으로10
으로 표현됩니다.- 이를 왼쪽으로 두 번 시프트 연산하면
1000
이 되며, 이 결과는 십진법으로 표현하면8
이 됩니다.
>>
(오른쪽 시프트 연산자)- 지정된 숫자에 대해 지정된 비트 수 만큼 오른쪽 시프트 연산합니다.
11 >> 1
은5
를 반환합니다.11
은 이진법으로1011
로 표현되며, 오른쪽으로 한 번 시프트 연산하면101
이 되고, 이는 십진법으로 표현하면5
가 됩니다.
&
(비트 AND 연산자)- 비트 AND 연산값을 반환합니다: 두 비트가 모두
1
인 경우, 결과는1
입니다. 아닌 경우,0
입니다. 5 & 3
은1
을 반환합니다 (0101 & 0011
은0001
이 됩니다)
- 비트 AND 연산값을 반환합니다: 두 비트가 모두
|
(비트 OR 연산자)- 비트 OR 연산값을 반환합니다: 두 비트가 모두
0
인 경우, 결과는0
입니다. 아닌 경우,1
입니다. 5 | 3
은7
을 반환합니다 (0101 | 0011
은0111
이 됩니다)
- 비트 OR 연산값을 반환합니다: 두 비트가 모두
^
(비트 XOR 연산자)- 비트 XOR 연산값을 반환합니다: 두 비트 (
1 또는 0
) 가 서로 같은 경우, 결과는0
입니다. 아닌 경우, it's1
입니다. 5 ^ 3
gives6
(O101 ^ 0011
은0110
이 됩니다)
- 비트 XOR 연산값을 반환합니다: 두 비트 (
~
(비트 반전 연산자)- 숫자 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보다 작은지 여부를 반환합니다. 모든 비교 연산자는
>
(큼 연산자)- 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
를 반환하며 아닌 경우 y 가 참인지 거짓인지를 판별하여 반환합니다.x = False; y = True; x and y
를 계산할 경우, x 가 거짓이므로 y값과 관계없이False
가 반환됩니다. 이 경우, 이미 'and' 연산의 왼쪽 값이 거짓이므로 전체 식의 결과가 거짓임이 자명하므로, 오른쪽에 해당하는 y 가 참인지 거짓인지를 판별할 필요가 없고, 따라서 y 는 연산되지 않습니다. 이것을 단축 계산(short-circuit evalulation)이라고 부릅니다.
or
(불리언 OR 연산자)- x 가
True
이면 True 가 반환되며,False
이면 y 가 참인지 거짓인지를 판별하여 반환합니다. x = True; y = False; x or y
를 계산할 경우True
가 반환됩니다. 여기서도 위와 같이 단축 계산이 적용됩니다.
- x 가
연산 및 할당 연산자
아래 예제와 같이, 변수의 값에 어떤 연산을 한 뒤 다시 그 변수에 연산값을 할당하는 경우가 자주 발생합니다:
a = 2
a = a * 3
이런 경우, 아래와 같이 연산과 할당을 한번에 줄여 쓸 수 있습니다:
a = 2
a *= 3
즉 (변수) = (변수) (연산자) (수식)
이 (변수) (연산자)= (수식)
의 형태가 됩니다.
연산 순서
2 + 3 * 4
와 같은 수식을 계산한다고 합시다. 덧셈이 먼저일까요, 곱셈이 먼저일까요? 초중고등학교 시절에 이미 배우셨겠지만, 곱셈을 먼저 계산해야 합니다. 이것은 곱셈 연산이 덧셈 연산보다 연산 순서에서 우위에 있기 때문입니다.
아래 표는 파이썬에서의 연산 순서를 나타내고 있습니다. 맨 위부터 가장 늦게 계산되는 순서대로 나열한 것입니다. 이것은 특정한 수식이 주어졌을 때, 파이썬은 이 표의 가장 아래에 위치한 연산부터 차례대로 계산하게 된다는 것을 의미합니다.
아래 표는 파이썬 레퍼런스 매뉴얼 에서 가져온 것입니다. 연산 순서를 적절히 조절하기 위해서는 괄호를 적당한 위치에 사용하는 것이 좋습니다. 또, 적절한 괄호의 사용은 프로그램을 좀 더 읽기 쉽게 해 줍니다. 아래의 연산 순서 변경 챕터을 통해 이에 대해 좀 더 자세히 알아보시기 바랍니다.
lambda
: 람다 식if - else
: 조건 식or
: 불리언 ORand
: 불리언 ANDnot x
: 불리언 NOTin, 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
와 같이 계산됩니다. 다만, 할당 연산자와 같은 몇몇 특별한 연산자들은 오른쪽에서 왼쪽으로 계산됩니다. 예를 들어 a = b = c 는 a = (b = c) 와 같이 계산됩니다.
수식 예제
예제 (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
동작 원리
먼저 직사각형의 높이와 너비가 각각 length 와 breadth 라는 변수에 저장됩니다. 이제 앞서 배운 수식을 이용하여, 두 변수를 이용해 직사각형의 면적과 둘레를 계산합니다. 첫번째로 area
라는 변수에 length * breadth
라는 수식의 결과가 저장되며, 이 값은 print
함수에 의해 화면에 출력됩니다. 두번째로는 print 함수에 곧바로 2 * (length + breadth)
라는 수식을 직접 입력하고, 그 결과를 화면에 출력합니다.
파이썬이 얼마나 예쁘게 결과를 보여주는지 확인하세요. 우리가 ’Area is'
라는 문자열이나 area
라는 변수에 공백을 지정하지 않았음에도, 파이썬이 그 둘 사이에 자동으로 공백을 넣어 줌으로 결과물이 깔끔하고 멋지게 출력될 수 있도록 해 주기 때문에 좀 더 읽기 쉬운 프로그램을 작성할 수 있습니다. 이것은 파이썬이 프로그래머의 삶을 좀 더 쉽게 만들어주는 하나의 좋은 예라고도 할 수 있겠습니다.
요약
지금까지 연산자, 피연산자, 수식에 대해 알아보았습니다. 이들은 여러분이 앞으로 작성할 프로그램의 기본적인 골격이 되어 줄 것입니다. 다음으로는, 여러분의 프로그램에서 명령문을 이용하여 지금까지 배운 것들을 응용하는 방법에 대해 알아보겠습니다.