프로그래밍

변수와 자료형

값을 어딘가에 저장해 두지 않으면
다음 줄에서 다시 쓸 수 없습니다.

학습 목표

  1. 변수가 무엇인지 알고, 값을 저장한 뒤 이름으로 다시 꺼내 쓸 수 있다.
  2. 대입이 오른쪽부터 계산된다는 것을 알고, 값이 바뀌는 순서를 따라갈 수 있다.
  3. 정수·실수·문자열·논리값을 구별하고, 같은 기호가 자료형에 따라 다르게 동작하는 예를 들 수 있다.
  4. 자료형을 바꾸는 함수를 써서 값을 원하는 자료형으로 변환할 수 있다.

값을 저장하는 변수

계산 결과는 어딘가에 저장해 두지 않으면 그대로 사라집니다.

계산기로 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 크지 않으니까요. 하지만 파이썬에서 이 줄은 등식이 아니라 순서가 있는 명령입니다.

한 줄이 처리되는 순서

  1. 오른쪽을 먼저 계산한다 — count에 저장된 10을 꺼내 1을 더해 11을 얻는다.
  2. 그 결과를 왼쪽 변수에 저장한다 — 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. 다음 중 틀린 설명은?