연산자란 무엇일까 ?
우리의 일상에서 "계산"은 흔하게 이루어지는 과정이다.
계산이라고 하면, 단순히 편의점에서 물건을 구입하고 돈을 거슬러 받는 것을 떠올릴 수도 있지만,
우리가 즐겨보는 영화의 컴퓨터 그래픽 장면들이 역시 계산의 영역에 속한다.
그래픽 장면들이 컴퓨터의 계산 기능을 통하여 이루어지기 때문이다.
컴퓨터는 사람이 해야 하는 계산을 대신 해주기 위해 만들어진 "전자계산기" 로 처음 만들어졌다.
이처럼 계산을 컴퓨터에게 시키는 과정에서 우리는 수식만 작성하여 컴퓨터로 넘겨주면 된다.
그러기 위해 "연산자"에 대해서 알아야 한다.
올바르게 수식을 작성하여야 계산의 효율도 높이고 코드도 간략하게 만들 수 있기 때문이다.
이제 연산자에 대해서 알아보자.
우리는 이미 파이썬을 공부하면서 연산자 하나를 사용하고 있다.
바로 할당 연산자 (assignment operator) 이다.
변수에 값을 할당할 때 사용하였던 = 기호가 바로 할당 연산자이다. (대입 연산자라고 부르기도 한다)
변수에 값을 대입한다는 것이 이해가 가지 않는다면 다음 게시글을 참고하자
= 연산자의 왼쪽은 값을 저장할 수 있는 "변수" 이어야 하고,
오른쪽은 값을 표현하는 숫자나 변수, 혹은 수식 (expression) 이 와야 한다.
x = 100
y = 200
다음 코드와 같이 여러 개의 변수에 동일한 값을 저장하는 것도 가능하다.
이를 "다중 할당문 multiple assignment" 이라고 한다.
x = y = 100
이 코드의 결과를 살펴보면, x 와 y 변수 모두 100으로 할당된다.
또한, 여러 변수에 한꺼번에 여러 값을 할당할 수도 있다.
이를 "동시 할당문 simultaneous assignment" 이라고 한다.
x, y = 100, 200
# x에 100, y에 200 할당
그럼 이제 사칙연산과 관련된 연산자들을 살펴보자.
연산자 | 기호 | 사용 예 | 결과값 |
덧셈 | + | 7 + 4 | 11 |
뺄셈 | - | 7 - 4 | 3 |
곱셈 | * | 7 * 4 | 28 |
지수 | ** | 7 ** 2 | 49 |
나눗셈(몫) | // | 7 // 4 | 1 |
나눗셈(실수) | / | 7 / 4 | 1.75 |
나머지 | % | 7 % 4 | 3 |
주의 깊게 볼 것은 나눗셈 연산이다.
파이썬에서 / 연산자를 이용해 나누기를 진행할 경우, 우리가 흔히 생각하는 나눗셈 결과
즉 실수로 계산된다는 것이다.
의도적으로 몫과 나머지를 구분해서 연산을 진행하고 싶은 경우, // 연산자와 % 연산자를 사용하면 된다.
또한 나머지 없이 딱 떨어지는 나눗셈 연산인 경우에도 / 연산자를 이용해서 연산을 한다면,
연산 결과는 실수로 계산된다.
예를 들어 8 / 4 연산을 진행하면 나눗셈 결과는 2 가 아니라 2.0 이다.
나눗셈 연산을 이용할 수 있는 예제를 한 번 살펴보자.
사용자가 시간을 초로 입력하면 입력된 초가 몇 시간 몇 분 몇 초에 해당하는 지 출력하는 프로그램을 한 번 작성해보자.
다음 코드를 보기 전에 스스로 생각해서 작성해보는 것도 좋다.
time = int(input('초를 입력하세요 : '))
hour = time // 3600
min = time % 3600 // 60
sec = time % 60
print('입력한 시간은', hour, '시간', min, '분', sec, '초입니다.')
print() 함수에서 문자열을 출력하면서 변수의 값을 출력하고 싶을 땐 쉼표로 구분지으면서 변수 이름을 넣어주면
다음과 같이 출력되게 된다.
그렇다면 이번에는 자동 판매기 프로그램을 한 번 만들어보자.
자동 판매기는 사용자로부터 투입한 돈과 물건값을 입력받는다. (물건값은 100원 단위라고 가정)
프로그램은 잔돈을 계산하여 출력한다. (자판기는 500원, 100원짜리만 가지고 있다고 가정)
투입한 금액과 물건값을 입력으로 받아 거스름돈으로 500원 동전 몇 개와 100원 동전 몇 개를 내어 보내면 되는지
계산하는 프로그램을 작성해보자.
여기서 힌트를 추가하자면,
동전은 정수로만 내어 줄 수 있기 때문에 정수 나눗셈 몫을 사용해야 한다.
즉, // 연산자를 사용한다는 말이다.
그리고 500원 동전으로 거스름돈을 주고 남은 나머지 거스름돈을 구하는 것은
나머지 연산자 % 를 이용하여 구할 수 있다.
다음은 이 프로그램을 구현해본 것이다.
money = int(input('투입한 돈 : '))
price = int(input('물건 값 : '))
change = money - price
print('거스름돈 : ', change)
coin500 = change // 500
change = change % 500
coin100 = change // 100
print('500원 동전의 개수 :', coin500)
print('100원 동전의 개수 :', coin100)
출력 결과는 다음과 같다.
이제 연산자에 대해서 알아보았으니 추가적으로 복합 할당 연산자에 대해서 알아보자.
이는 산술 연산자와 할당 연산자를 결합하여 조금 간략하게 표현하는 방법이다.
만약 특정한 산술 연산자를 @라 하면, 복합 할당 연산자는 @= 모양이 되면서 다음과 같은 동작을 한다.
a @= b ↔ a = a @ b
@ 자리에는 앞에서 배웠던 연산자들이 올 수 있다.
이러한 복합 할당 연산자는 어떤 변수가 가지고 있는 값에 연산을 진행한 후,
다시 해당 변수에 저장해야 할 상황에 사용한다.
다음은 비교 연산자 comparison operator 에 대해 알아보자.
비교 연산은 두 개의 피연산자를 대상으로 크기 관계를 살펴본다.
그리고 그 결과인 True 혹은 False 를 반환한다.
이렇게 True 나 False 의 값을 갖는 자료형을 부울 bool 형이라고 한다.
파이썬은 아래와 같은 비교 연산자를 제공하고 있다.
연산자 | 설명 |
== | 두 피연산자의 값이 같으면 True 반환 |
!= | 두 피연산자의 값이 다르면 True 반환 |
> | 왼쪽 피연산자가 오른쪽 피연산자보다 클 때 True 반환 |
< | 왼쪽 피연산자가 오른쪽 피연산자보다 작을 때 True 반환 |
>= | 왼쪽 피연산자가 오른쪽 피연산자보다 크거나 같을 때 True 반환 |
<= | 왼쪽 피연산자가 오른쪽 피연산자보다 작거나 같을 때 True 반환 |
이번에는 논리 연산자 logical operator 라는 것을 알아보자.
논리 연산자는 논리 and, or, not 연산을 통해 True 나 False 중 하나의 값을 가지는 부울 bool 값을 반환한다.
연산자 | 의미 |
x and y | x와 y중 False 가 하나라도 있으면 모두 거짓, 모두 True인 경우에만 True |
x or y | x나 y중 하나라도 True면 True, 모두 False일 때만 False |
not x | x가 True면 False, x가 False면 True |
마지막으로 비트 연산자 bitwise operator 에 대해서 알아보자.
컴퓨터의 정보는 결국 이진수로 변환되어 연산된다.
비트 하나는 0과 1을 표현할 수 있는데 이 저장된 정보의 비트 단위로 처리가 이루어지는 연산이 바로 비트 연산이다.
연산자 | 의미 | 설명 |
& | 비트 단위 AND | 두 개의 피연산자의 해당 비트가 모두 1이면 1, 아니면 0 |
| | 비트 단위 OR | 두 피연산자의 해당 비트 중 하나라도 1이면 1, 아니면 0 |
^ | 비트 단위 XOR | 두 개의 피연산자의 해당 비트 값이 같으면 0, 아니면 1 |
~ | 비트 단위 NOT | 0은 1로, 1은 0으로 만든다. |
<< | 비트 단위 왼쪽으로 이동 | 지정된 개수만큼 모든 비트를 왼쪽으로 이동시킨다. |
>> | 비트 단위 오른쪽으로 이동 | 지정된 개수만큼 모든 비트를 오른쪽으로 이동시킨다. |
비트 연산자는 지금 단계에서는 사용할 일이 많이 없지만 알고 넘어가야 한다.
예를 들어 << 연산자는 Shift 연산자라고도 하는데, 1칸 왼쪽으로 비트가 이동할 때마다 2배씩 커지는 특징이 있다.
* 연산자를 이용하는 것보다 속도가 빠르다.
지금은 "이런 게 있구나" 정도만 알고 넘어가자.
그렇다면 수식에서 2개 이상의 연산자를 가지고 있는 경우에는
어떤 연산자가 먼저 수행될 것인가?
컴퓨터가 아닌 일상생활에서 우리는 연산을 진행할 때에 곱하기 연산을 더하기 보다
먼저 진행해야 한다는 것을 알고 있다.
컴퓨터에서도 연산자 간의 우선순위가 존재한다.
우선 괄호로 감싸진 연산은 무조건 먼저 실행한다.
그 다음에 ** 지수 연산자, 단항 연산자 순으로 실행된다.
단항 연산자는 피연산자가 하나인 연산자를 의미하는데,
수 앞에 붙는 부호 (+, -) 와 NOT 을 의미하는 ~ 연산자가 이에 속한다.
이후 *, /, %, // 곱셈과 나눗셈, 나머지 연산자가 뒤를 이어 실행되고,
+, - 덧셈, 뺄셈 연산자가 그 후 실행된다.
이후엔 비트 연산자, 비교 연산자가 실행된다고 알고 있으면 되겠다.
이제 연산자에 대해서 배웠으니, 관련된 모듈을 알아보자.
파이썬은 모듈을 이용해서 바로 사용할 수 있다는 점이 큰 장점이라고 앞선 글에서 설명하였다.
파이썬엔 random, math 모듈이 존재하는데,
random 모듈은 임의의 수를 생성하거나, 리스트나 튜플 내의 요소를 무작위로 섞거나,
선택하는 함수를 포함하고 있다. random 모듈에 포함되어 있는 대표적인 함수 몇 가지를 알아보자.
import random
random.random() # 0 이상 1 미만의 임의의 실수를 반환
random.randint(1, 7) # 1 이상 7 이하의 임의의 정수를 반환
random.randrange(7) # 0 이상 7 미만의 임의의 정수를 반환
random.randrange(1, 7) # 1이상 7 미만의 임의의 정수를 반환
random.randrange(0, 10, 2) # 0, 2, 4, 8 중 하나를 반환
lst = [10, 20, 30, 40, 50] # 여러 개의 값을 가지는 리스트를 생성
random.shuffle(lst) # lst 리스트의 순서를 무작위로 섞음
random.choice(lst) # lst 리스트의 원소 중 무작위로 하나를 고름
위의 코드를 직접 실행해서 결과값을 출력해보자.
math 모듈은 원주율, 자연상수 등의 상수 값과 실수의 절대값 등의 다양한 수학 함수를 포함하고 있다.
다음 코드를 살펴보자.
import math
math.pow(3, 3) # 3 의 3 제곱
math.fabs(-99) # -99 의 실수 절대값
math.log(2.71828) # log 값
math.log(100, 10) # log10 을 밑으로 하는 100 값
math.pi # 원주율
math.sin(math.pi / 2.0) # sin() 함수의 인자로 PI/2.0
위 코드 역시 직접 실행시켜 출력해보자.
위의 모듈과 상수, 함수들은 문제를 풀어나가는 과정에 있어 요긴하게 사용된다.
이번 장을 공부하면서 파이썬의 / 연산자와 ** 연산자가 굉장히 편리하게 느껴졌다.
또한 random 모듈과 math 모듈 등 제공해주고 있는 모듈들을 이용해 코딩을 하니
훨씬 짧은 시간 안에 많은 것을 공부할 수 있었다.
얼른 기본을 잘 다지고 난이도 있는 코딩 문제 역시 해결할 수 있으면 좋겠다 :)
출처 : 따라하며 배우는 파이썬과 데이터 과학 - 천인국, 박동규, 강영민