▼2020년/파이썬 기초

[Python] 파이썬에서의 연산, 연산자

ITISIK 2020. 1. 22. 10:36
반응형

  지난번 Boolean형 자료형 포스트를 끝으로 파이썬에서의 자료형을 모두 알아보았다.

 

  프로그래밍에서는 다양한 연산자를 통한 연산을 지원한다. 이들 연산에 대해서 바로 알고 있지 않으면 프로그램을 올바르게 제어할 수 없으므로, 연산자와 그 연산에 대해서 명확히 알며 그 결과값을 예상할 수 있어야 한다. 이번 포스트에서는 그러한 연산과 연산자에 대해서 알아보려고 한다. 우선, 필자가 늘 그렇듯이 중·고등학교 수학시간에 배웠던 연산에 대해서 간단하게 복습해보자.

 

중·고등학교 수학에서의 연산 복습

  3 + 2 = ?

 

  위 식의 답은 3과 2를 더해서 5이다. 혹은 더하는 순서를 바꾸어 2와 3을 더해도 5가 된다. 더하기 연산자(+) 하나 뿐이다 보니 연산이 쉽다.

 

  3 + 2 × 4 = ?

 

  위 식은 왼쪽부터 순서대로 3+2 먼저 계산하면 틀리게 되는 식이다. 왜냐하면, +(-) 연산과 ×(÷) 연산 사이에는 우선순위가 존재하기 때문이다. 중고등학교 과정을 성실하게 배웠다면, 곱하기 혹은 나누기를 먼저 수행해야 한다는 사실을 알고 있을 것이다. 따라서 위 식은 2 × 4를 먼저 수행하여 8이라는 중간결과를 얻고, 3+8 연산을 수행하여 11이라는 최종답을 얻게 된다.

 

  마지막으로 아래의 식을 살펴보자.

 

  (3+2) × 4 = ?

 

  위 식은 바로 전의 식과 수와 연산자는 동일하나 괄호가 생겼다는 것이 차이점인데, 이 괄호는 제곱 다음으로 최고의 연산 우선순위를 갖는다. 따라서 이번에는 3+2를 먼저 수행하여 5라는 중간결과를 얻고, 5 × 4 연산을 수행하여 20이라는 최종답을 얻게 된다.

 

 

  그럼 이제부터 프로그래밍에 있는 연산자와 그 우선순위에 대해서 알아보자.(필자가 적어두는 연산자가 파이썬의 모든 연산자는 아니다. 필자가 알고있고, 사용했던 연산자를 위주로 적었다.)

 

파이썬에서 사용되는 연산자들

구분 연산자 결합방향 결과값 우선순위
산술연산자 ** 숫자형

높음

 

낮음

*     /     //     %
+     -
포함 여부 연산자 in     not in 논리형
(True / False)

관계연산자

(비교연산자)

<     >     <=     >=     ==     !=
논리연산자 not
and     &
or    |
대입연산자 =     +=     -=     *=     /=     //=     %= -

  위 표에서 우선순위가 높은 것부터 낮은 것 순서대로 설명하려고 한다.

 

산술연산자

  ** 처럼 asterisk가 두 개 연속 나와있는 연산자는 제곱연산자이다. 제곱이란 특정 횟수만큼 반복해서 곱하는 것을 의미한다. 만약 10 ** 2 라고 식을 적으면 10의 제곱이라는 의미로 계산은 10 × 10 = 100이 된다. 그런데 만약 2 ** 2 ** 3이라고 식을 적으면 어떻게 계산될까? 인간이 추측할 수 있는 계산방식은 두 가지로 나뉘어진다. 왼쪽부터 순서대로 계산하는 방법과 오른쪽부터 순서대로 계산하는 방법으로 말이다. 만약 왼쪽부터 순서대로 계산할 경우, 2 ** 2 = 4가 되고, 4 ** 3 = 64가 정답이 될 것이다. 반면 왼쪽부터 순서대로 계산할 경우, 2 ** 3 = 8이 되고, 2 ** 8 = 256이 정답이 될 것이다. 프로그래밍 세계에서의 정답은 후자가 맞다. 즉 제곱 연산은 오른쪽부터 순서대로 하는 것이 연산순서(결합방향)이다.

  기본적인 가감승제(+-× ÷) 연산은 우리가 수학 공부하면서 했던것과 동일하여 별도 설명은 하지 않겠다. // 연산자와 % 연산자만 간단하게 알아보는 것으로 산술연산자 파트는 마치려고 한다.

 

11을 3으로 나눈 나머지는 2이고, 그 몫은 3이다. 이때 나머지를 구하는 연산자가 %이며, 몫을 구하는 연산자가 //이다.

  이것으로 산술연산자를 모두 알아보았다.

 

포함여부 연산자

  단일개의 자료를 포함하는 자료형으로는 숫자형, 문자형, 논리형이 있었다. 여러개의 자료를 포함하는 자료형으로는 리스트형, 튜플형, 딕셔너리형, 집합형이 있었다. 포함여부 연산자는 여러개의 자료를 포함하는 자료형들에게 기본적으로 기능이 제공되며, 추가적으로 문자형 자료형*에도 기능이 제공된다. 여기서 말하는 기능이란, 이름 그대로 포함 여부를 True 혹은 False로 반환해주는 기능이다. 아래 코드 예시를 통해서 알아가도록 하자.

 

* : 엄밀히 말하자면, 파이썬에서의 문자형은 여러개의 자료를 포함하는 자료형이다. 왜냐하면 문자 'a', 'b, 'c', ...의 순서와 그 조합을 저장하여 마치 하나의 문자열인것 처럼 보여주는 자료형이기 때문이다.

list_test = [1, 'a', 111]
1 in list_test
2 in list_test

  리스트 형에 대해서 in 연산자가 잘 동작한다.

 

 

tuple_test = ('one', 3)
1 in tuple_test
'one' in tuple_test

튜플형에서도 in 연산자가 잘 동작한다.

 

 

dic_test = {'key' : 'value', 'age' : 27}
'age' in dic_test
27 in dic_test

딕셔너리 형에서도 in 연산자가 잘 작동한다.

 

set_test = set({1, 2, 3})
1 not in set_test
'one' not in set_test

  집합형에서는 일부러 not in 연산자를 사용해보았다. in 연산자와 not in 연산자는 서로 사용할 수 있거나 없는 범위가 동일하다는 점을 기억해주었으면 좋겠다.(=> 집합형에서 in 연산자 사용이 가능하다는 의미는 not in 연산자도 사용이 가능하다는 의미이다.(역 또한 참.))

 

text_test = 'Python is... my friends. Maybe.'
'p' in text_test
'P' in text_test

  이와같이 문자형에서도 in 연산자는 사용 가능하다.

 

관계연산자(비교연산자)

  관계연산자는 기본적으로 숫자를 피연산자로 한다는 특징을 가지고 있다. 그러나 다른 자료형에 대해서도 연산이 되는 경우가 있는데 이는 논외로 한다. 우리는 관계연산자를 가지고 숫자만을 다루려고 한다.

 

  관계연산자에서의 관계가 의미하는 바는 쉽게 대소판별 정도를 생각하면 될 것 같다. 수들에 대한 대소판별을 한 뒤에 식에 따라 참 거짓값을 반환하는 것이다.

1 < 2
3 > 99
23 == 23
23 != 23
1 >= 1
10 <= 9

  이와같이 관계연산자는 주어진 숫자들에 대해서 대소판별을 진행한 후 그 참/거짓 여부를 반환하여 준다.

 

논리연산자

  논리연산자는 이 다음 포스트에서 배울 제어문을 프로그래밍에서 활용할 때 자주 사용하게 될 연산자이다. 바로 전의 관계연산자(비교연산자)가 숫자를 피연산자로 고려한 연산자였다면, 논리연산자는 논리형(True/False)을 피연산자로 고려한 연산자이다. 즉 True와 False를 가지고 연산을 수행하기 위해 만들어진 연산자라는 의미이다.

 

  and 연산자는 피연산자 두 개 모두 True일 때에만 True이고 이외에는 False를 반환하는 연산자이다. and 이외에도 &라는 기호를 이용해서 동일한 연산을 수행할 수 있다. or 연산자는 피연산자 두 개 모두 False일 때에만 False이고, 이외에는 True를 반환하는 연산자이다. or 이외에도 |라는 기호를 이용해서 동일한 연산을 수행할 수 있다.

 

  다만, 단일값(True / False)이 아닌 리스트 형 등에 담긴 논리형값'들'에 대한 연산을 수행하려 한다면 &와 |는 되지 않고, and와 or만 가능하게 된다.

 

  아래 예시코드를 보면서 결과값을 예측해보면서 공부해보자.

True and True
True & True

True or True
True | True

False and False
False & False

False or False
False | False

True and False
False and False
True or False
False or True
False and False

t = [True, True, True]
f = [False, False, False]
t & f
# error

t and f
[False, False, False]
t or f
[True, True, True]

  이렇게 연산할 수 있다. 나중에는 좀 더 복잡하게 이용하지만, 기본적으로 이 틀을 잘 이해하고 있다면 조금 복잡해진다고 하더라도 정답을 알아내기가 크게 까다롭지 않다.

 

대입연산자

  지금까지 알게 모르게 많이 사용해왔던 연산자이다. 변수를 선언하고 그 값을 할당할 때 사용했던 등호기호(=)가 그것인데, 별 다른 특징은 없다. 등호를 기준으로 우변에 있는 값을 좌변에 적혀있는 변수명에 해당하는 메모리 공간에 값을 할당해주는 것이다.

assignment1 = 1
assignment2 = 'one'
assignment3 = True
assignment4 = ['list', 'real', 'fake']
assignment5 = ('tuple',)
assignment6 = {'key':'value', 'name':'ITisIK'}
assignment7 = set({1, 2, 3, 4, 1, 2, 7, 8})

  그런데 이러한 등호 기호 옆에 산술 연산자들이 붙는 특이한 기호를 표에서 보았을 것이다. 이들 기호는 아래와 같이 풀어서 해석하면 금방 이해할 수 있다.

a = 1
a += 2
# 위 식을 풀어서 작성하면 a = a + 2가 된다.
# 따라서, a(1) + 2 = 3이므로, 3을 a에 대입함으로써 기존 a값인 1은 없어지고 a의 값은 3이 된다.

  즉 *=의 경우, 좌변과 우변의 값을 곱한 후, 좌변의 변수에 할당하여라 라는 의미이고, /=의 경우, 좌변을 우변의 값으로 나누어 그 결과값을 좌변의 변수에 할당하여라 라는 의미이다. 나머지 기호들도 모두 동일한 의미를 가지고 있다. 익숙하지 않아서 그런 것이지 단순 산술연산 이후 대입(새로 할당)하라는 뜻이기 때문에 어려운 개념은 아니다. 이후 제어문 파트에서 종종 사용할 것이므로 그 때가서 더 익숙해져도 된다.

 

  이렇게 할당 연산까지 알아보았다. 이로써 파이썬에서 사용되는 핵심적인 연산자들에 대해서는 얼추 다 짚은 것 같다. 다음 포스트에서는 지금까지 배운 자료형과 연산자들을 통해서 어떻게 프로그램을 제어해나가는지 제어문에 대해서 알아볼 예정이다.

반응형