계산해 놓은 값을 어디에 둘 것인가
저장해 둘 곳이 없으면 필요할 때마다 다시 계산해야 합니다.
한 개에 1200원 하는 물건을 3개 산다고 해 봅시다. 총액은 3600원입니다. 여기까지는 암산으로 됩니다.
그런데 이 총액을 뒤에서 몇 번 더 써야 한다면 이야기가 달라집니다. 할인율을 곱할 때 한 번, 봉투값을 더할 때 한 번, 화면에 출력할 때 또 한 번. 그때마다 1200 × 3을 다시 적는다면 나중에 값이 1300원으로 오르는 순간 고쳐야 할 곳을 전부 찾아다녀야 합니다.
그래서 값에 이름을 붙여 저장해 둡니다. 그러면 그다음부터는 값 대신 이름을 쓰면 됩니다.
변수(variable)
프로그램이 실행되는 동안 값을 저장해 두는 공간입니다. 그 공간에 붙인 이름을 변수 이름이라고 합니다.
교실 사물함을 떠올리면 쉽습니다. 사물함은 원래 「3번 칸」처럼 번호로 부릅니다. 그런데 칸마다 「체육복」, 「실내화」라고 이름표를 붙여 두면 번호를 외우지 않아도 됩니다. 변수 이름이 바로 그 이름표입니다.
price = 1200
count = 3
total = price * count
print(total)
=는 「같다」가 아니라 「오른쪽 값을 왼쪽 변수에 저장하라」는 뜻이고,
이것을 대입(assignment)이라고 합니다. 수학에서 쓰던 등호와 다르므로 처음에 자주 헷갈립니다.
total = price * count는 「total과 price×count가 같다」가 아니라
「price와 count를 곱한 값을 total에 대입하라」입니다.
변수는 「관계」를 기억하지 않습니다
total = price * count를 실행한 뒤에 count를 5로 바꾸면
total도 6000으로 따라 바뀔 것 같지만 그렇지 않습니다.
total에는 계산한 그 순간의 값 3600이 저장되었을 뿐,
「price 곱하기 count」라는 관계가 저장된 것이 아닙니다.
다시 계산해서 대입해야 바뀝니다.
표 계산 프로그램의 수식 셀과는 다른 점이니 특히 주의하세요.
이름을 짓는 규칙
이름은 마음대로 지을 수 있지만 몇 가지는 지켜야 합니다.
- 이름 맨 앞에 숫자를 둘 수 없습니다.
3score는 안 되고score3는 됩니다. - 철자가 같아도 대소문자가 다르면 다른 이름입니다.
score와Score는 서로 다른 변수입니다. - 공백과 기호를 넣을 수 없습니다. 다만 밑줄
_은 됩니다 —total_price처럼 씁니다. - 파이썬이 문법으로 쓰려고 정해 둔 단어(예약어)는 쓸 수 없습니다.
if,for,True같은 것들입니다.
규칙만 지키면 a, b, x1이라고 지어도 프로그램은 실행됩니다.
그런데도 total_price처럼 길게 짓는 이유가 있습니다.
코드는 대개 쓰는 시간보다 읽는 시간이 훨씬 깁니다.
한 달 뒤의 나와 옆자리 친구가 읽을 것을 생각하면,
이름만 보고도 무엇이 저장되었는지 알 수 있어야 합니다.
다음 넷 중 변수 이름으로 쓸 수 없는 것을 고르고 이유를 말해 보세요.
my_score, 2day, Total, for.
같은 「3」이라도 종류가 다르면 다른 값이다
종류를 정해 주지 않으면 컴퓨터가 무엇을 해야 할지 알 수 없습니다.
아래 두 줄은 똑같이 더하기 기호를 쓰는데 결과가 다릅니다. 직접 결과를 짐작해 보고 읽어 보세요.
print(3 + 4)
print('3' + '4')
3 + 4는 7, '3' + '4'는 34가 나옵니다.
따옴표가 없는 3과 4는 수라서 더한 것이고,
'3'과 '4'는 따옴표로 감싼 문자라서 이어 붙인 것입니다.
기호는 같은데 하는 일이 달라졌습니다.
무엇이 그 차이를 만들었을까요? 값의 종류입니다.
자료형(data type)
값이 어떤 종류인지를 가리키는 구분입니다. 종류가 정해져야 그 값으로 무엇을 할 수 있는지가 정해집니다.
| 자료형 | 어떤 값인가 | 예 |
|---|---|---|
| 정수 int |
소수점이 없는 수 | 17, 0, -5 — 사람 수, 개수처럼 쪼갤 수 없는 것 |
| 실수 float |
소수점이 있는 수 | 168.5, 3.14 — 키, 몸무게, 평균처럼 쪼갤 수 있는 것 |
| 문자열 str |
따옴표로 감싼 문자들의 나열 | '학생 A', '3' — 이름, 주소처럼 계산하지 않는 것 |
| 불 bool |
참 또는 거짓, 둘 중 하나 | True, False — 조건이 맞는지 아닌지 |
파이썬에서는 자료형을 따로 적어 주지 않습니다.
값을 대입하면 그 값을 보고 파이썬이 알아서 정합니다.
type()을 쓰면 값의 자료형이 무엇인지 확인할 수 있습니다.
age = 17
height = 168.5
name = '학생 A'
is_member = True
print(type(age), type(height), type(name), type(is_member))
결과는 <class 'int'> <class 'float'> <class 'str'> <class 'bool'>입니다.
17에는 소수점이 없으니 정수로, 168.5에는 있으니 실수로 정해졌습니다.
따옴표가 있느냐 없느냐가 문자열인지 아닌지를 결정합니다.
문자열과 수는 더할 수 없습니다
'3' + 4처럼 문자열과 수를 더하려고 하면 파이썬은 어느 쪽으로 해석해야 할지 정할 수 없어
오류를 내고 멈춥니다.
이건 파이썬이 까다로워서가 아닙니다.
조용히 아무 쪽으로나 계산해서 틀린 답을 내놓는 것보다,
멈추고 알려 주는 편이 훨씬 낫기 때문입니다.
이런 오류를 만나면 「내가 자료형을 섞었구나」 하고 보면 됩니다.
우리 반 인원수, 시험 평균 점수, 학교 이름, 오늘 비가 왔는지 여부. 넷을 각각 어떤 자료형으로 두는 것이 알맞을까요?
값을 다루는 기호들
계산하는 것, 비교하는 것, 묶는 것. 셋으로 나뉩니다.
값을 가지고 무언가를 하려면 기호가 필요합니다. 이런 기호를 연산자(operator)라고 하고, 하는 일에 따라 크게 세 가지로 나뉩니다.
하나 — 산술 연산자, 계산한다
수학에서 쓰던 사칙연산이 거의 그대로 있고, 셋이 더 있습니다.
| 기호 | 하는 일 | 예 |
|---|---|---|
+ - * / |
더하기 · 빼기 · 곱하기 · 나누기 | 곱하기가 ×가 아니라 *인 것에 주의합니다. |
** |
거듭제곱 | 2 ** 10은 1024입니다. |
// |
나눈 몫 (양수끼리 나누면 소수점 아래를 버린 값) | 17 // 5는 3입니다. |
% |
나눈 나머지 | 17 % 5는 2입니다. |
나머지를 구하는 %가 왜 필요할까요?
2로 나눈 나머지가 0이면 짝수, 1이면 홀수입니다.
번호를 보고 홀짝으로 조를 나누는 일이 이 기호 하나로 됩니다.
초를 60으로 나눈 나머지를 구하면 「몇 분 몇 초」의 초가 나오고,
요일이나 시각처럼 일정한 주기로 처음 값에 돌아오는 것을 다룰 때에도 자주 씁니다.
둘 — 비교 연산자, 크기를 비교한다
두 값을 놓고 어느 쪽이 큰지, 같은지를 비교합니다. 결과는 언제나 참 또는 거짓입니다. 이 참과 거짓을 나타내는 자료형이 불입니다.
| 기호 | 뜻 |
|---|---|
> < |
보다 크다 · 보다 작다 |
>= <= |
크거나 같다 · 작거나 같다. 부등호가 앞, 등호가 뒤입니다. |
== |
두 값이 같다 |
!= |
두 값이 다르다 |
=와 ==는 전혀 다릅니다
=는 값을 변수에 대입하라는 뜻이고,
==는 두 값이 같은지 물어보는 것입니다.
「점수가 100인가?」를 확인하려고 if score = 100:이라고 쓰면 파이썬은 문법 오류를 내고 실행하지 않습니다.
조건이 아닌 줄에 score = 100이라고 적으면 오류 없이 확인하는 대신 점수를 100으로 바꿔 버립니다.
처음 프로그램을 짜는 사람이 가장 많이 하는 실수 가운데 하나입니다.
셋 — 논리 연산자, 조건을 묶는다
조건이 하나가 아닐 때가 많습니다. 「60점 이상이면서 90점 미만」처럼 여러 조건을 한꺼번에 검토해야 할 때 씁니다.
| 기호 | 언제 참이 되는가 |
|---|---|
and |
두 조건이 모두 참일 때 |
or |
둘 중 하나라도 참일 때 |
not |
참과 거짓을 뒤집는다 |
score = 72
print(score >= 60)
print(score >= 60 and score < 90)
둘 다 True가 나옵니다.
72는 60 이상이고, 동시에 90보다 작기 때문입니다.
여기서 만든 참과 거짓은 조건에 따라 실행할 명령을 고르는 곳에 그대로 쓰입니다.
순서도에서 마름모 안에 적는 물음이 코드에서는 이런 모양이 되는 것입니다.
연산자에는 먼저 계산되는 순서가 있습니다. 곱셈이 덧셈보다 먼저인 것과 같습니다. 다만 순서를 외우려 애쓸 필요는 없습니다. 헷갈리면 괄호를 치면 됩니다. 괄호는 읽는 사람에게도 도움이 되므로 넉넉히 쓰는 편이 낫습니다.
오늘이 몇 번째 날인지를 안다면, 나머지 연산자 %로
무슨 요일인지를 알아낼 수 있을까요? 어떻게 하면 될지 말해 보세요.
자료형을 잘못 고르면 실제로 이런 일이 난다
오류도 안 나고, 그냥 조용히 틀립니다.
문자열과 수를 섞으면 오류가 납니다. 그런데 더 곤란한 것은 오류조차 나지 않는 경우입니다. 프로그램은 멀쩡히 실행되고, 답만 틀립니다.
하나 — 앞자리 0이 사라진다
학번이 00123인 학생이 있다고 해 봅시다. 학번을 「숫자니까」 하고 정수로 저장하면 수에는 앞자리 0이 뜻이 없으므로 123이 됩니다. 전화번호도 마찬가지로 앞의 0이 사라집니다.
숫자로 보인다고 다 수가 아닙니다. 구분하는 기준은 간단합니다 — 더하거나 빼는 일이 뜻을 갖는가? 학번끼리 더할 일은 없습니다. 그러면 그것은 수가 아니라 이름표이고, 문자열로 두어야 합니다.
둘 — 크기 비교가 뒤집힌다
거꾸로, 수여야 할 것을 문자열로 두면 다른 문제가 생깁니다.
print('9' > '10')
print(0.1 + 0.2)
'9' > '10'의 결과가 True입니다.
9가 10보다 크다는 뜻이 되어 버렸습니다.
문자열끼리 크기를 볼 때는 사전에서 단어를 찾듯 앞 문자부터 하나씩 비교하기 때문입니다.
'9'의 첫 문자 9가 '10'의 첫 문자 1보다 뒤에 오므로
'9'가 크다고 판단합니다.
나이나 점수를 문자열로 받아 그대로 비교하면 이런 일이 납니다.
셋 — 실수 계산에는 아주 작은 오차가 있다
0.1 + 0.2의 결과를 보세요.
0.3이 아니라 0.30000000000000004가 나옵니다.
컴퓨터는 모든 값을 0과 1로만 저장합니다. 그런데 0.1처럼 0과 1로 적으면 소수점 아래가 끝없이 이어지는 소수는 정확히 저장되지 않습니다. 우리가 3분의 1을 소수로 적을 때 0.3333…으로 끝없이 이어져 어딘가에서 잘라야 하는 것과 같은 사정입니다. 잘라 낸 부분이 아주 작은 오차로 남습니다.
그래서 실수끼리 「정확히 같은가」를 묻지 않습니다
0.1 + 0.2 == 0.3은 거짓이 됩니다.
한 번의 오차는 눈에 띄지 않지만, 같은 계산을 수천 번 반복하면 차이가 쌓입니다.
돈처럼 1원도 어긋나면 안 되는 것을 다룰 때 실수를 피하는 이유가 여기 있습니다.
이럴 때는 원 단위 정수로 바꾸어 계산합니다.
그래서 자료형을 고를 때 이렇게 묻는다
익혀야 할 것은 「네 가지 자료형을 외우는 것」이 아니라 「이 값에 알맞은 자료형을 고르는 것」입니다. 물음 셋이면 대개 정해집니다.
더하거나 뺄 일이 있는가
없으면 수가 아니라 이름표입니다. 문자열로 둡니다.
쪼갤 수 있는 값인가
사람 수는 쪼갤 수 없으니 정수, 키와 평균은 쪼갤 수 있으니 실수입니다.
한 치도 어긋나면 안 되는가
돈처럼 정확해야 하면 실수를 피하고 정수로 바꾸어 다룹니다.
우편번호를 정수로 저장하면 어떤 일이 생길까요? 자료형을 고르는 세 물음 가운데 어느 물음에 걸리는지도 함께 말해 보세요.
핵심 정리
변수
variable
- 값을 저장해 두고 이름으로 부르는 공간
=는 「같다」가 아니라 「오른쪽 값을 왼쪽 변수에 대입하라」- 대입되는 것은 그때의 값이지 계산 관계가 아니다
자료형
data type
- 정수 · 실수 · 문자열 · 불 네 가지를 가장 많이 쓴다
- 자료형이 다르면 같은 기호도 다르게 동작한다 —
3+4와'3'+'4' - 파이썬은 값을 보고 알아서 자료형을 정한다
연산자
operator
- 산술 — 계산한다.
//는 몫,%는 나머지 - 비교 — 참·거짓을 낸다.
=와==는 전혀 다르다 - 논리 —
andornot으로 조건을 묶는다
알맞은 자료형 고르기
잘못 고르면 조용히 틀린다
- 학번을 정수로 두면 앞자리 0이 사라진다
- 수를 문자열로 두면 크기 비교가 뒤집힌다
- 실수에는 아주 작은 오차가 있어 돈 계산에서는 피한다
확인 퀴즈
배운 내용을 확인해 봅시다.
파이썬에서 '3' + '4'의 결과는?
학번 00123을 저장하기에 알맞은 자료형과 그 까닭은?
변수와 연산자에 대한 설명으로 옳지 않은 것은?