값을 저장하는 변수
계산 결과는 어딘가에 저장해 두지 않으면 그대로 사라집니다.
계산기로 3 × 5를 눌러 15를 얻었다고 합시다. 그 15로 다시 계산하려면 눈으로 읽고 손으로 다시 입력해야 합니다. 프로그램은 그렇게 할 수 없으므로 값에 이름을 붙여 저장해 두어야 다음 줄에서 다시 꺼내 쓸 수 있습니다.
변수(variable)
값을 저장해 두고 이름으로 다시 꺼내 쓸 수 있게 한 공간입니다. 저장된 값이 무엇으로 바뀌든 같은 이름으로 부를 수 있습니다.
score = 90 # score라는 변수에 90을 대입한다
name = "학생 A" # 문자열도 저장할 수 있다
print(score) # 90
print(name) # 학생 A
=는 수학의 「같다」가 아닙니다. 오른쪽 값을 왼쪽 변수에 저장하라는 명령이고,
이것을 대입(assignment)이라고 합니다. 그래서 score = 90은
「score는 90과 같다」가 아니라 「score에 90을 대입한다」로 읽습니다.
여기서 쓴 print는 저장된 값을 화면에 출력해 눈으로 확인하는 명령입니다.
지금은 값이 제대로 저장되었는지 확인하는 용도로만 씁니다.
이름을 아무렇게나 붙일 수는 없습니다
| 규칙 | 되는 예 / 안 되는 예 |
|---|---|
| 영문자·숫자·밑줄로 짓는다(한글도 되지만 흔히 쓰지 않는다) | score, student_count / my-score는 뺄셈으로 읽힌다 |
| 숫자로 시작하지 않는다 | score1 / 1score |
| 대문자와 소문자는 다른 이름 | score와 Score는 서로 다른 변수다 |
| 문법에 쓰는 단어(예약어)는 쓸 수 없다 | if, for를 이름으로 쓰면 문법 오류가 난다 |
| 이미 있는 기능의 이름은 피한다 | print는 이름으로 쓸 수는 있지만, 덮어쓰면 그 뒤로 출력 기능을 쓸 수 없다 |
규칙만 지키면 프로그램은 실행됩니다. 그래도 무엇을 저장했는지 알아볼 수 있는 이름을 붙이는 편이 좋습니다. 코드는 한 번 쓰고 끝나지 않고, 며칠 뒤의 자신이 다시 읽기 때문입니다.
student_count = 3 # 알아볼 수 있는 이름
sc = 3 # 짧지만 무엇인지 알 수 없다스스로 확인
total = total처럼 변수에 자기 자신을 대입하면 무슨 일이 일어날까요? 오류가 날까요, 아무 일도 일어나지 않을까요?
대입은 오른쪽을 먼저 계산한다
이 한 가지만 기억하면 값이 바뀌는 순서가 보입니다.
처음 배울 때 많이 헷갈리는 줄이 바로 이것입니다.
count = 10
count = count + 1 # 오른쪽 10 + 1을 먼저 계산해 11을 count에 저장한다
print(count) # 11수학에서 count = count + 1은 성립하지 않는 식입니다. 어떤 수도 자기 자신보다 1 크지 않으니까요. 하지만 파이썬에서 이 줄은 등식이 아니라 순서가 있는 명령입니다.
한 줄이 처리되는 순서
- 오른쪽을 먼저 계산한다 —
count에 저장된 10을 꺼내 1을 더해 11을 얻는다. - 그 결과를 왼쪽 변수에 저장한다 —
count가 11이 된다.
오른쪽을 계산하는 동안 count는 아직 10입니다. 값은 마지막 단계에서 바뀝니다.
왼쪽과 오른쪽은 하는 일이 다릅니다
10 = count라고 쓰면 오류가 납니다. 왼쪽에는 값을 저장할 변수가 와야 하는데
10은 변수가 아니라 값이기 때문입니다. =의 양쪽은 서로 바꿔 쓸 수 없습니다.
스스로 확인
a = 3, b = a를 한 뒤 a = 5로 바꾸면 b는 얼마일까요? 「한 줄이 처리되는 순서」의 두 단계를 그대로 따라가 보세요.
값에는 종류가 있다
같은 더하기 기호가 값의 종류에 따라 다르게 동작합니다.
자료형(data type)
값이 어떤 종류인지를 가리킵니다. 종류가 정해지면 그 값으로 무엇을 할 수 있는지도 함께 정해집니다.
| 자료형 | 나타내는 값 | 예 |
|---|---|---|
int 정수 |
소수점 없는 수 | 3, -17, 0 |
float 실수 |
소수점 있는 수 | 3.14, -0.5, 3.0 |
str 문자열 |
따옴표로 묶은 글자 | "학생 A", "3" |
bool 불(bool), 논리값 |
참 또는 거짓 | True, False |
값의 자료형이 궁금하면 type으로 확인할 수 있습니다.
print(type(3)) # <class 'int'>
print(type(3.0)) # <class 'float'>
print(type("3")) # <class 'str'>
print(type(3 > 1)) # <class 'bool'>3과 "3"은 다른 값입니다
print("3" + "4") # 34 문자열을 이어 붙인다
print(3 + 4) # 7 숫자를 더한다같은 기호인데 결과가 다릅니다. 문자열끼리는 이어 붙이고, 숫자끼리는 더합니다. 기호가 무엇을 하는지는 양쪽 값의 자료형이 정합니다.
변수에는 자료형을 적지 않지만, 값에는 자료형이 있습니다
파이썬은 score = 90처럼 자료형을 적지 않고 바로 대입합니다.
그렇다고 자료형이 없는 것은 아닙니다. 저장된 값이 저마다 자료형을 가지고 있습니다.
나중에 score = "구십"을 실행하면 score라는 이름이 가리키는 값이 바뀌고, 자료형도 그 값을 따라 바뀝니다.
자료형은 변수 이름이 아니라 저장된 값에 붙어 있습니다.
0.1 같은 실수는 근삿값으로 저장됩니다
컴퓨터는 수를 0과 1로 저장하므로 0.1 같은 실수를 정확하게 나타내지 못하고, 아주 가까운 값으로 저장합니다.
그래서 0.1 + 0.2가 0.3이 아니라 0.30000000000000004로 나옵니다.
print(0.1 + 0.2) # 0.30000000000000004
print(0.1 + 0.2 == 0.3) # False 아주 조금 어긋나 같지 않다
print(round(0.1 + 0.2, 2) == 0.3) # True 필요한 자릿수까지 반올림한 뒤 비교한다
계산 결과가 맞아 보여도 실수끼리 ==로 비교하면 같지 않다고 나올 수 있습니다.
실수를 비교할 때는 필요한 자릿수까지 반올림한 뒤 비교하거나, 두 값의 차이가 아주 작은지를 봅니다.
스스로 확인
"3" * 4는 무엇이 나올까요? 3 * 4와 비교해 예상해 보고 확인해 보세요.
자료형 바꾸기
자료형이 맞지 않아 생기는 오류는 대부분 형 변환으로 해결됩니다.
값의 자료형을 바꾸는 것을 형 변환(type conversion)이라고 합니다. 변환하려는 자료형의 이름을 그대로 함수처럼 씁니다.
text = "170"
height = int(text) # 문자열 "170"을 정수 170으로 변환한다
print(height + 5) # 175
print(int(3.7)) # 3 실수를 정수로 변환하면 소수점 아래를 버린다
print(float(3)) # 3.0
print(str(3) + "층") # 3층int(3.7)은 4가 아니라 3
반올림이 아니라 소수점 아래를 버립니다.
반올림이 필요하면 따로 round를 씁니다.
다만 round는 정확히 절반인 값을 가까운 짝수로 만들어 round(2.5)가 2가 되므로,
수학 시간에 배운 반올림과 다를 수 있습니다.
변환할 수 없는 값도 있습니다
int("사과")는 오류가 납니다. int는 정수를 나타내는 문자열만 정수로 변환합니다.
int("3.5")처럼 소수점이 있어도 오류가 나므로, 이때는 float("3.5")로 변환합니다.
형 변환이 자주 필요한 이유
사용자가 키보드로 입력한 값은 숫자처럼 보여도 문자열로 들어옵니다. 그래서 「170」을 입력받아 5를 더하려 하면 자료형이 맞지 않아 오류가 납니다. 바깥에서 들어온 값을 계산에 쓰려면 거의 언제나 형 변환이 필요합니다.
스스로 확인
str(3) + str(4)와 int("3") + int("4")는 각각 무엇이 될까요?
핵심 정리
변수
값을 저장해 두고 이름으로 다시 꺼내 쓰는 공간. =는 같다는 뜻이 아니라
오른쪽 값을 왼쪽 변수에 저장하라는 명령이다.
대입의 순서
오른쪽을 먼저 계산하고 그 결과를 왼쪽 변수에 저장한다. 오른쪽을 계산하는 동안 왼쪽 변수에는 아직 이전 값이 들어 있다.
자료형
값의 종류. 정수·실수·문자열·논리값이 있고,
같은 기호도 자료형에 따라 다르게 동작한다
("3" + "4"는 34, 3 + 4는 7).
0.1 같은 실수는 근삿값으로 저장되므로 ==로 비교하면 어긋날 수 있다.
형 변환
int·float·str로 자료형을 변환한다.
int는 반올림이 아니라 소수점 아래를 버린다.
확인 퀴즈
배운 내용을 확인해 봅시다.
1. n = 4 다음에 n = n * n을 실행하면 n은 얼마인가?
2. print("2" + "5")의 결과는?
3. 다음 중 틀린 설명은?