import platform
import matplotlib.pyplot as plt
if platform.system() == "Windows":
plt.rc("font", family="Malgun Gothic")
elif platform.system() == "Darwin":
plt.rc("font", family="AppleGothic")
else:
plt.rc("font", family="NanumBarunGothic")
plt.rcParams["axes.unicode_minus"] = False2 변수와 자료형: 경제 데이터에 이름 붙이기 (2주차)
2.1 이번 장에서 배우는 것
1장에서 우리는 파이썬을 계산기처럼 썼습니다. 숫자를 직접 두드려 넣고, print()로 결과를 확인했지요. 이번 장에서는 그 숫자들에 이름을 붙입니다. 이름을 붙이는 순간 코드는 ’계산식 모음’에서 ’읽을 수 있는 글’로 바뀝니다.
- 값에 이름을 붙여 저장하는 변수(variable)를 만들고,
=가 ’같다’가 아니라 ’저장하라’는 명령임을 이해한다. - 정수(
int)·실수(float)·문자열(str)·불리언(bool) 네 가지 자료형을 구분하고type()으로 확인한다. - 웹이나 키보드에서 온 문자열 숫자를
int()·float()로 바꿔 계산에 쓴다. 특히input()이 돌려주는 값은 언제나 문자열이라는 사실을 기억한다. - f-string의 서식 지정으로 1234567을 1,234,567원으로, 0.031을 3.1%로 바꿔 보고서답게 출력한다.
- (경제학) 명목 값과 실질 값의 차이를 등록금 사례로 계산한다 — 숫자가 커진 것과 부담이 커진 것은 다르다.
- (경제학) 예산 제약의 성립 여부를 불리언 값 하나로 판정하고, 그 뒤에 숨은 기회비용을 읽는다.
2.2 여는 질문: 등록금은 정말 15만 원만큼 올랐을까
새 학기 등록금 고지서를 받았다고 합시다. 작년에는 340만 원이었는데 올해는 355만 원입니다. 15만 원 인상. 숫자가 커졌다는 사실은 분명합니다. 그런데 여러분의 부담도 정확히 15만 원만큼 커진 걸까요? 만약 같은 기간에 물가가 3.1% 올랐다면 이야기가 복잡해집니다. 학식도, 버스비도, 원두값도 함께 올랐다면, 등록금 인상분의 일부는 ’등록금이 특별히 비싸진 것’이 아니라 ’세상 모든 것이 함께 비싸진 것’일 테니까요.
이 질문에 답하려면 두 가지가 필요합니다. 하나는 경제학의 구분입니다. 고지서에 적힌 숫자(명목)와 물가를 걷어낸 뒤의 부담(실질)은 다른 개념입니다. 다른 하나는 파이썬의 기술입니다. 작년 등록금, 올해 등록금, 물가상승률 — 이 값들을 각각 이름 붙여 보관해 두고, 서로 조합해 계산하고, 결과를 사람이 읽을 수 있는 형식으로 출력하는 방법이지요. 이 장에서 둘 다 배우고, 장의 후반부 「경제학 응용」에서 이 질문에 숫자로 답하겠습니다.
2.3 그래프 준비
이번 장 끝에서 여러 나라의 GDP를 막대 그래프 하나로 비교합니다. 그래프 문법 자체는 4주차부터 차근차근 배우지만, 한글 제목과 축 이름이 깨지지 않도록 폰트 설정만 미리 해 둡니다. 아래 셀을 한 번 실행해 두세요. 셀 안에 아직 배우지 않은 문법(if)이 보일 텐데, 지금은 ‘내 컴퓨터 운영체제에 맞는 한글 폰트를 고르는 준비 코드’ 정도로만 알아 두면 충분합니다.
!pip install koreanize-matplotlib
import koreanize_matplotlib구글 Colab에서 실습한다면 위의 폰트들이 설치되어 있지 않아 한글이 네모 상자로 깨집니다. 그럴 때는 바로 위 셀을 실행해 koreanize-matplotlib을 설치하면 됩니다. 설치는 Colab 세션마다 한 번이면 충분하고, 내 컴퓨터(Windows·macOS)에서 실습한다면 이 셀은 건너뛰어도 됩니다.
2.4 숫자를 코드에 그대로 박으면 생기는 일
1장 끝에서 교내 카페 ’이콘 카페’의 하루 손익을 계산했습니다. 아메리카노 한 잔 3,000원, 하루 120잔 판매, 임대료와 인건비 같은 하루 고정비 200,000원, 한 잔을 만드는 재료비 1,000원. 그때의 코드는 대략 이런 모습이었지요.
# 이콘 카페의 하루 손익 (1장 방식: 숫자를 그대로 사용)
print("하루 총수입:", 3000 * 120)
print("하루 총비용:", 200000 + 1000 * 120)
print("하루 이익:", 3000 * 120 - (200000 + 1000 * 120))하루 총수입: 360000
하루 총비용: 320000
하루 이익: 40000
계산은 맞습니다. 그런데 이 코드에는 세 가지 불편이 숨어 있습니다. 첫째, 3000이라는 숫자가 세 번 등장합니다. 사장님이 가격을 3,200원으로 올리면 세 군데를 전부 찾아 고쳐야 하고, 하나라도 놓치면 코드는 아무 불평 없이 틀린 답을 내놓습니다. 둘째, 두 달 뒤에 이 코드를 다시 열어 보면 3000이 가격인지 재료비인지, 120이 판매량인지 다른 무엇인지 코드만 보고는 알 길이 없습니다. 주석이 지워지는 순간 이 코드는 암호문이 됩니다. 셋째, 같은 계산 3000 * 120을 두 번 반복하고 있습니다. 첫 번째 계산의 결과를 어딘가에 담아 두었다가 다시 꺼내 쓸 수 있다면 좋을 텐데요.
이 세 가지 불편을 한 번에 해결하는 것이 변수(variable)입니다.
2.5 변수: 값에 이름을 붙이는 기술
변수를 만드는 문법은 한 줄입니다.
이름 = 값
여기서 =를 수학의 등호로 읽으면 안 됩니다. 파이썬에서 =는 “오른쪽 값을 계산해서, 왼쪽 이름에 저장하라”는 명령입니다. 그래서 이 동작을 할당(assignment)이라고 부릅니다. 양쪽이 같다고 선언하는 것이 아니라, 오른쪽에서 왼쪽으로 값이 흘러 들어가는 한 방향 동작이지요. 이 구분이 왜 중요한지는 잠시 뒤 예제에서 확인합니다.
방금의 카페 계산을 변수로 다시 써 봅시다.
americano_price = 3000 # 아메리카노 한 잔 가격 (원)
cups_sold = 120 # 하루 판매량 (잔)
fixed_cost = 200000 # 하루 고정비: 임대료, 인건비 등 (원)
unit_cost = 1000 # 한 잔당 재료비 (원)
daily_revenue = americano_price * cups_sold
daily_cost = fixed_cost + unit_cost * cups_sold
daily_profit = daily_revenue - daily_cost
print("하루 총수입:", daily_revenue)
print("하루 총비용:", daily_cost)
print("하루 이익:", daily_profit)하루 총수입: 360000
하루 총비용: 320000
하루 이익: 40000
한 줄씩 뜯어보기
americano_price = 3000— 3000이라는 값을 만들고 거기에americano_price라는 이름표를 붙입니다. 이제부터 코드 어디서든 이 이름을 부르면 3000이 나옵니다.daily_revenue = americano_price * cups_sold—=의 오른쪽이 먼저 계산됩니다. 파이썬은americano_price자리에 3000을,cups_sold자리에 120을 가져다 놓고 곱해 360000을 만든 뒤, 그 결과에daily_revenue라는 이름을 붙입니다.daily_cost = fixed_cost + unit_cost * cups_sold— 곱셈이 덧셈보다 먼저라는 1장의 연산 순서 규칙이 그대로 적용됩니다. 재료비 곱하기 판매량을 먼저 구하고, 고정비를 더합니다.print("하루 이익:", daily_profit)— 계산 결과를 담아 둔 변수를 그대로print()에 넘깁니다. 같은 계산을 두 번 할 필요가 없어졌습니다.
코드가 오히려 길어졌는데 왜 더 좋은 코드일까요? 이제 이 코드는 숫자 나열이 아니라 읽히는 문장이기 때문입니다. 수입은 가격 곱하기 판매량, 비용은 고정비 더하기 잔당 재료비 곱하기 판매량. 경제학원론의 정의 \(TR = P \times Q\) 가 코드에 그대로 비쳐 보입니다.
값 바꾸기: 변수는 이름표다
원두값이 올라 사장님이 아메리카노 가격을 3,200원으로 인상했다고 합시다. 아까의 하드코딩 버전이라면 3000을 세 군데에서 찾아 고쳐야 했지만, 이제 고칠 곳은 딱 한 줄입니다.
americano_price = 3200 # 가격 인상: 이 한 줄만 바꾸면 된다
daily_revenue = americano_price * cups_sold
daily_cost = fixed_cost + unit_cost * cups_sold
daily_profit = daily_revenue - daily_cost
print("인상 후 하루 총수입:", daily_revenue)
print("인상 후 하루 이익:", daily_profit)인상 후 하루 총수입: 384000
인상 후 하루 이익: 64000
변수에 새 값을 할당하면 이전 값은 버려지고 이름표가 새 값으로 옮겨 붙습니다. 이를 재할당이라고 합니다. 특별한 문법은 없고, 같은 이름에 다시 =를 쓰면 됩니다.
한 가지 짚고 갈 점이 있습니다. 방금 계산에서 가격을 올렸는데 판매량 120잔은 그대로 두었습니다. 경제학 수업을 들은 사람이라면 바로 이의를 제기할 대목이지요. 가격이 오르면 수요량은 줄어들 텐데요. 맞는 지적입니다. 가격과 판매량이 함께 움직이는 세계는 6장에서 수요·공급 모형으로 제대로 다루기로 하고, 지금은 ’다른 조건이 모두 같다면’이라는 경제학의 오랜 가정을 빌려 오겠습니다.
=가 등호가 아니라 명령이라는 사실을 가장 극적으로 보여주는 코드가 있습니다. 수학이라면 말이 안 되는 식입니다.
cups_sold = 120
cups_sold = cups_sold + 10 # 단골 손님이 10명 늘었다
print(cups_sold)130
수학에서 \(x = x + 10\) 을 만족하는 \(x\)는 없습니다. 하지만 파이썬은 이 줄을 방정식이 아니라 순서 있는 명령으로 읽습니다. 먼저 오른쪽을 계산하고(현재 cups_sold인 120에 10을 더해 130), 그 결과를 왼쪽 이름 cups_sold에 다시 저장합니다. ‘지금 값을 꺼내서, 조금 바꿔서, 도로 넣기’. 이 패턴은 앞으로 누적 합계, 잔고 갱신, 물가 누적 같은 온갖 계산에서 다시 만나게 됩니다.
변수 이름 짓기
변수 이름에는 문법 규칙과 관례가 있습니다. 규칙은 어기면 에러가 나고, 관례는 어겨도 코드는 돌아가지만 읽는 사람 — 대부분은 두 달 뒤의 나 자신 — 이 고생합니다.
문법 규칙부터. 이름은 영문자나 밑줄로 시작해야 하고(gdp_2026은 되지만 2026_gdp는 안 됩니다), 영문자·숫자·밑줄만 쓸 수 있으며(net-income의 하이픈은 뺄셈으로 해석됩니다), 대소문자를 구분하고(gdp와 GDP는 서로 다른 변수), if나 import처럼 파이썬이 예약해 둔 단어는 쓸 수 없습니다.
관례는 하나만 기억하면 됩니다. 소문자 단어를 밑줄로 이어 붙이는 스네이크 케이스(snake case)를 쓰고, 이름에 값의 의미를 담을 것. a보다는 price가, price보다는 americano_price가 미래의 나에게 친절합니다.
실수 노트 — 천 단위 콤마를 코드에 쓰면
등록금 350만 원을 변수에 담는다고 합시다. 고지서에 적힌 모양 그대로 3,500,000이라고 입력하면 어떻게 될까요? 에러가 날 것 같지만, 실제로는 더 나쁜 일이 벌어집니다. 직접 확인해 봅시다.
tuition = 3,500,000 # 고지서에 적힌 대로 콤마를 넣으면?
print(tuition)
print(type(tuition))(3, 500, 0)
<class 'tuple'>
에러 없이 멀쩡히 실행되지만, 결과는 350만이 아니라 (3, 500, 0)이라는 낯선 묶음입니다. 파이썬은 콤마를 ’값 여러 개를 나란히 묶어라’는 뜻으로 읽기 때문입니다(이 묶음의 정체는 5장에서 튜플이라는 이름으로 다시 만납니다). 게다가 콤마 뒤의 000은 그냥 0으로 읽혀서 값 자체도 엉망이 되었습니다. 에러가 나는 실수보다 조용히 틀리는 실수가 더 무섭습니다. 프로그램이 멈추지 않으니, 계산이 한참 진행된 뒤에야 뭔가 이상하다는 것을 알게 되니까요.
콤마 없이 3500000이라고 쓰는 것이 원칙이지만, 0이 몇 개인지 세다가 지치겠다 싶으면 파이썬이 준비해 둔 밑줄 구분을 쓰면 됩니다.
tuition = 3_500_000 # 밑줄은 사람 눈을 위한 자릿수 구분일 뿐, 값은 3500000
print(tuition)3500000
[직접 해보기] 이번 달 생활비를 변수로 정리해 봅시다. 월세(또는 기숙사비), 식비, 교통비를 각각 의미가 드러나는 이름의 변수에 저장하고, 세 값을 더한 합계를 monthly_expense 변수에 담아 출력해 보세요. 금액이 크다면 밑줄 구분도 써 보세요.
# TODO: 월세(또는 기숙사비), 식비, 교통비를 각각 변수에 저장하세요.
# TODO: 세 변수를 더한 값을 monthly_expense에 저장하고 print()로 출력하세요.2.6 자료형: 데이터에는 종류가 있다
변수에는 숫자만 담기는 것이 아닙니다. 나라 이름 같은 글자도, ’흑자인가?’라는 질문에 대한 참/거짓 판단도 담깁니다. 파이썬은 모든 값에 자료형(data type)이라는 종류를 붙여 관리합니다. 종류가 왜 중요할까요? 자료형에 따라 할 수 있는 연산이 다르기 때문입니다. GDP끼리는 더할 수 있지만, 나라 이름을 2로 나누는 것은 뜻이 없지요. 경제 데이터에서 가장 자주 만나는 네 가지 자료형을 차례로 살펴봅니다. 값의 종류가 궁금할 때는 type() 함수에 넣어 보면 됩니다.
정수 int — 낱개로 세는 수
소수점이 없는 수입니다. 인구수, 판매량, 연도처럼 개수를 세는 값들이 여기에 속합니다.
year = 2026
population_korea = 51_700_000 # 한국 인구 (약 5,170만 명, 교육용 근사치)
cups_sold = 120 # 이콘 카페 하루 판매량
print(year, type(year))
print(population_korea, type(population_korea))
print(cups_sold, type(cups_sold))2026 <class 'int'>
51700000 <class 'int'>
120 <class 'int'>
실수 float — 연속적으로 재는 수
소수점이 있는 수입니다. 금리, 환율, 물가상승률, 성장률처럼 연속적으로 측정하는 값들이 대부분 실수로 다뤄집니다. 이번 장의 주인공 숫자 하나도 여기서 소개합니다. 한국의 연간 GDP는 약 2,200조 원입니다. 이 책의 거시 수치는 교육용 근사치이니, 정확한 최신 값은 한국은행 경제통계시스템(ECOS)에서 확인하세요.
gdp_korea_trillion_krw = 2200.0 # 한국 GDP (단위: 조 원, 교육용 근사치)
base_rate = 0.025 # 기준금리 2.5%
usd_krw = 1350.0 # 원/달러 환율 (가정)
inflation = 0.031 # 연간 물가상승률 3.1% (가정)
print(gdp_korea_trillion_krw, type(gdp_korea_trillion_krw))
print(base_rate, type(base_rate))
print(usd_krw, type(usd_krw))
print(inflation, type(inflation))2200.0 <class 'float'>
0.025 <class 'float'>
1350.0 <class 'float'>
0.031 <class 'float'>
문자열 str — 글자의 나열
따옴표로 감싼 글자들입니다. 작은따옴표와 큰따옴표 어느 쪽을 써도 됩니다. 나라 이름, 통화 코드, 보고서 제목이 문자열이고 — 여기서 함정 하나 — "2200.0"처럼 따옴표에 감싸인 숫자도 숫자가 아니라 문자열입니다. 생김새가 아니라 따옴표가 자료형을 결정합니다.
country = "대한민국"
currency_code = "KRW"
gdp_text = "2200.0" # 따옴표 안에 있으면, 숫자처럼 보여도 문자열
print(country, type(country))
print(currency_code, type(currency_code))
print(gdp_text, type(gdp_text))대한민국 <class 'str'>
KRW <class 'str'>
2200.0 <class 'str'>
불리언 bool — 참 아니면 거짓
True 아니면 False, 단 두 가지 값만 가지는 자료형입니다. 첫 글자가 대문자라는 점에 주의하세요. 그런데 True를 코드에 직접 써넣는 일보다 훨씬 흔한 것은, 비교 연산의 결과로 불리언을 얻는 경우입니다. >, >=, <, <=는 크기를 비교하고, ==는 두 값이 같은지, !=는 다른지 묻습니다. 비교식 하나가 곧 질문 하나이고, 파이썬은 반드시 True 또는 False로 대답합니다.
특히 ==(같은가?)와 =(저장하라)는 생김새가 비슷해서, 3장에서 조건문을 배우기 시작하면 반드시 한 번은 헷갈립니다. 여기서 미리 구분해 두세요. 등호 하나는 명령, 등호 둘은 질문입니다.
is_surplus = True # 이콘 카페는 오늘 흑자인가
print(is_surplus, type(is_surplus))
# 비교 연산의 결과는 불리언이다
print(3200 > 3000) # 인상된 가격이 원래 가격보다 큰가
print(1350.0 == 1350) # 값이 같은가 (int와 float 사이에도 비교할 수 있다)
print(4000 >= 4800) # 학식 가격이 편의점 도시락 가격 이상인가True <class 'bool'>
True
True
False
[직접 해보기] 네 가지 자료형을 하나씩 만들어 봅시다. 다니는 학교 이름(문자열), 올해 연도(정수), 원/달러 환율(실수)을 변수에 담고, 오늘 지출한 금액이 1만 원을 넘는지를 비교 연산으로 판정해 불리언 변수에 담으세요. 마지막에 네 변수 각각의 값과 type() 결과를 나란히 출력합니다.
# TODO: 학교 이름(str), 올해 연도(int), 원/달러 환율(float)을 변수에 저장하세요.
# TODO: 오늘 지출액을 변수에 담고, 지출액 > 10000 의 결과를 새 변수에 저장하세요.
# TODO: 네 변수 각각에 대해 값과 type()을 print()로 출력하세요.2.7 형 변환: 문자열로 온 숫자를 계산 가능하게
자료형이 왜 실전 문제인지는 데이터를 바깥에서 가져오는 순간 드러납니다. 통계청 웹페이지에서 긁어 온 GDP, 파일에서 읽어 들인 인구수, 키보드로 입력받은 잔고 — 바깥세상에서 파이썬으로 들어오는 데이터는 거의 전부 문자열로 도착합니다. 화면의 "2200.0"은 사람 눈에는 숫자지만 파이썬에게는 글자 여섯 개일 뿐이어서, 그대로는 나눗셈도 뺄셈도 되지 않습니다.
그래서 자료형을 바꾸는 함수 세 개가 준비되어 있습니다. int(값)은 정수로, float(값)은 실수로, str(값)은 문자열로 바꿉니다. 이렇게 자료형을 바꾸는 일을 형 변환(type conversion)이라고 부릅니다.
문자열로 도착한 한국의 GDP와 인구로 1인당 GDP를 계산해 봅시다.
gdp_str = "2200.0" # 웹에서 가져왔다고 가정한 GDP (조 원)
population_str = "51700000" # 문자열로 도착한 인구 (명)
gdp = float(gdp_str) # 문자열 -> 실수
population = int(population_str) # 문자열 -> 정수
gdp_krw = gdp * 1_000_000_000_000 # 조 원 -> 원
per_capita_gdp = gdp_krw / population # 1인당 GDP (원)
print("1인당 GDP:", per_capita_gdp, "원")1인당 GDP: 42553191.4893617 원
한 줄씩 뜯어보기
gdp = float(gdp_str)— 문자열"2200.0"을 실수 2200.0으로 바꿔gdp라는 새 이름에 저장합니다. 원본gdp_str은 여전히 문자열로 남아 있습니다. 형 변환은 원본을 고치는 것이 아니라, 변환된 새 값을 만들어 돌려줍니다.population = int(population_str)— 같은 원리로 문자열을 정수로 바꿉니다. 한 가지 주의:int("2200.0")처럼 소수점이 든 문자열을int()에 바로 넣으면 에러가 납니다. 소수점이 있으면float()를 거쳐야 합니다.gdp_krw = gdp * 1_000_000_000_000— 조 원 단위를 원 단위로 바꿉니다. 1조는 0이 12개. 밑줄 구분이 없었다면 0의 개수를 세다 하루가 갔을 겁니다.per_capita_gdp = gdp_krw / population— 나눗셈/의 결과는 언제나 실수라는 1장의 규칙이 여기서도 적용됩니다.
결과는 약 4,255만 원. 그런데 출력이 소수점 아래 자릿수를 주렁주렁 달고 나왔습니다. 계산은 끝났지만 보고서에 이대로 쓸 수는 없는 상태지요. 이 출력을 사람이 읽을 수 있게 다듬는 일은 잠시 뒤 f-string 절의 몫입니다.
반대 방향의 변환도 있습니다. int()에 실수를 넣으면 소수점 아래를 반올림하는 것이 아니라 그냥 잘라 버립니다. int(3.99)는 4가 아니라 3입니다. 금액이든 평점이든 반올림이 필요한 자리에 무심코 int()를 쓰면 값이 슬그머니 줄어드니 주의하세요. str()은 숫자를 문자열로 감싸는 함수인데, 숫자를 글자와 이어 붙일 일이 있을 때 씁니다.
print(int(3.99)) # 반올림이 아니라 버림: 3
print(int("42")) # 문자열 -> 정수
print(float(2200)) # 정수 -> 실수: 2200.0
print(str(3200)) # 숫자 -> 문자열: 화면엔 같아 보여도 이제 글자다
print(type(str(3200)))3
42
2200.0
3200
<class 'str'>
실수 노트 — 문자열끼리의 덧셈은 계산이 아니다
형 변환을 잊으면 어떤 일이 생길까요? 두 가지 경우가 있는데, 하나는 조용히 틀리고 하나는 요란하게 틀립니다. 조용한 쪽부터 봅시다.
price_a = "100"
price_b = "200"
print(price_a + price_b) # 300이 나올까?100200
300이 아니라 100200이 나왔습니다. 문자열에게 +는 덧셈이 아니라 이어붙이기입니다. "경제" + "원론"이 "경제원론"이 되는 것과 똑같은 동작이지요. 에러가 없으니 프로그램은 멀쩡히 돌아가고, 틀린 값이 다음 계산으로 흘러갑니다. 콤마 함정에서 본 ’조용히 틀리는 실수’의 또 다른 대표 사례입니다.
요란한 쪽은 문자열과 숫자를 섞을 때입니다.
print("100" + 200) # 문자열과 숫자를 더하면?이 셀을 실행하면 다음과 같은 에러가 납니다.
TypeError: can only concatenate str (not "int") to str
에러 메시지는 아래에서 위로 읽는 것이 요령입니다. 마지막 줄이 결론이거든요. TypeError는 ’자료형이 맞지 않는 연산을 시켰다’는 분류이고, 이어지는 문장은 ’문자열(str)에는 문자열만 이어 붙일 수 있는데 정수(int)를 붙이려 했다’는 설명입니다. 해결책은 방향을 정하는 것입니다. 계산이 목적이면 int("100") + 200으로 숫자 쪽에 맞추고, 문장을 만드는 것이 목적이면 "100" + str(200)으로 문자열 쪽에 맞춥니다.
2.8 input(): 키보드로 값 받기
지금까지는 계산에 쓸 값을 코드에 미리 적어 두었습니다. 그런데 등록금 계산기를 만들어 친구에게 건넨다면 어떨까요? 친구는 파이썬 코드를 고칠 줄 몰라도 자기 등록금을 넣어 볼 수 있어야 합니다. input() 함수는 프로그램을 잠깐 멈추고, 사용자가 키보드로 입력한 값을 받아 옵니다. 괄호 안에는 사용자에게 보여줄 안내 문구를 넣습니다.
아래 셀은 여러분이 직접 실행하며 값을 넣어 보라고 남겨 둔 셀입니다(책을 만드는 자동 실행에서는 건너뜁니다).
name = input("이름을 입력하세요: ")
print("반갑습니다,", name)실행하면 입력창이 뜨고, 이름을 넣으면 다음처럼 이어집니다.
이름을 입력하세요: 김경제
반갑습니다, 김경제
여기까지는 순조롭습니다. 문제는 숫자를 입력받을 때 시작됩니다. input()은 사용자가 무엇을 입력하든 항상 문자열을 돌려줍니다. 숫자 50000을 입력해도 파이썬에 도착하는 것은 문자열 "50000"입니다. 방금 배운 형 변환이 필요한 순간이지요.
balance_str = input("현재 잔고를 입력하세요(원): ")
print(type(balance_str)) # 무엇을 입력해도 str
balance = int(balance_str) # 계산에 쓰려면 형 변환
print("잔고에 5000원이 들어오면:", balance + 5000, "원")50000을 입력했다면 출력은 이렇습니다.
현재 잔고를 입력하세요(원): 50000
<class 'str'>
잔고에 5000원이 들어오면: 55000 원
한 줄씩 뜯어보기
balance_str = input("현재 잔고를 입력하세요(원): ")— 프로그램이 멈추고 입력을 기다립니다. 사용자가 50000을 치고 엔터를 누르면, 문자열"50000"이balance_str에 저장됩니다.print(type(balance_str))— 정말 문자열인지 확인합니다. 숫자를 입력했는데도<class 'str'>이 나옵니다.balance = int(balance_str)— 문자열을 정수로 바꿉니다. 이 줄이 없으면balance_str + 5000에서 방금 실수 노트에서 본 TypeError가 납니다.- 익숙해지면 두 단계를
int(input("..."))처럼 한 줄로 겹쳐 쓰기도 합니다. 안쪽의input()이 먼저 실행되고 그 결과가 곧바로int()로 넘어가는, 함수 속의 함수입니다. 물가상승률처럼 소수점이 필요한 값은float(input("..."))으로 받습니다.
[직접 해보기] 알바 주급 계산기를 만들어 봅시다. 시급과 이번 주 근무 시간을 각각 input()으로 받고, 곱해서 주급을 출력하세요. 시급은 정수로, 근무 시간은 소수점이 있을 수 있으니 실수로 변환하는 것이 자연스럽습니다.
# TODO: 시급을 input()으로 받아 int()로 변환해 wage 변수에 저장하세요.
# TODO: 근무 시간을 input()으로 받아 float()로 변환해 hours 변수에 저장하세요.
# TODO: 주급(wage * hours)을 계산해 print()로 출력하세요.2.9 f-string: 경제 수치를 보고서 형식으로
1인당 GDP를 계산했을 때 출력이 42553191.48936… 같은 모습으로 나왔던 것을 기억할 겁니다. 계산은 끝났지만 전달은 안 되는 상태지요. 경제 수치는 ’얼마인가’만큼 ’어떻게 보여주는가’가 중요합니다. 42,553,191원이라고 쓴 보고서와 42553191.48936170원이라고 쓴 보고서는 같은 정보를 담고 있어도 읽는 사람에게 주는 신뢰가 다릅니다.
f-string은 문자열 앞에 f를 붙이고, 중괄호 { } 안에 변수나 계산식을 넣는 문법입니다. 파이썬이 중괄호 자리를 실제 값으로 채워 완성된 문장을 만들어 줍니다.
americano_price = 3200
print(f"이콘 카페 아메리카노는 한 잔 {americano_price}원입니다.")
print(f"두 잔이면 {americano_price * 2}원입니다.") # 중괄호 안에서 계산도 된다이콘 카페 아메리카노는 한 잔 3200원입니다.
두 잔이면 6400원입니다.
f-string의 진짜 쓸모는 중괄호 안, 콜론(:) 뒤에 서식을 지정할 수 있다는 데 있습니다. {값:서식} 꼴입니다. 경제 수치 보고에 필요한 서식은 사실상 세 가지입니다.
첫째, :,는 천 단위마다 콤마를 찍습니다. 코드에 콤마를 직접 쓰면 튜플이 되어 버리는 함정을 실수 노트에서 봤지요. 콤마는 값을 입력할 때가 아니라 출력할 때, 바로 이 서식으로 찍는 것입니다.
tuition = 3_550_000
gdp_krw = 2200.0 * 1_000_000_000_000 # 2,200조 원을 원 단위로
print(f"올해 등록금: {tuition:,}원")
print(f"한국 GDP: {gdp_krw:,.0f}원") # 콤마 서식과 소수점 서식은 함께 쓸 수 있다올해 등록금: 3,550,000원
한국 GDP: 2,200,000,000,000,000원
둘째, :.2f는 소수점 아래 두 자리까지만 보여줍니다. f 앞의 숫자를 바꾸면 자릿수가 바뀌고, .0f로 쓰면 소수점을 아예 지웁니다. 반올림해서 보여줄 뿐 변수에 저장된 원래 값은 그대로라는 점도 기억해 두세요. 환율이나 지수처럼 소수점이 의미 있는 값에 씁니다.
usd_krw = 1350.5
per_capita_gdp = 2200.0 * 1_000_000_000_000 / 51_700_000
print(f"원/달러 환율: {usd_krw:.2f}원")
print(f"1인당 GDP: {per_capita_gdp:,.0f}원") # 소수점은 지우고 콤마만원/달러 환율: 1350.50원
1인당 GDP: 42,553,191원
아까 그 지저분하던 1인당 GDP가 드디어 보고서에 실을 수 있는 모습이 되었습니다.
셋째, :.1%는 0.031처럼 소수로 저장된 비율에 100을 곱하고 % 기호까지 붙여 줍니다. 경제 데이터에서 비율은 계산할 때는 소수(0.031)로, 보여줄 때는 퍼센트(3.1%)로 다루는 것이 관례인데, 이 서식이 두 세계를 이어 줍니다.
inflation = 0.031
base_rate = 0.025
print(f"물가상승률: {inflation:.1%}")
print(f"기준금리: {base_rate:.1%}")
print(f"소수점 둘째 자리까지 보이려면: {inflation:.2%}")물가상승률: 3.1%
기준금리: 2.5%
소수점 둘째 자리까지 보이려면: 3.10%
세 가지 서식을 모아 경제 기사의 첫 문단 같은 보고를 만들어 봅시다. 값은 전부 변수에 있고, 문장은 f-string이 조립합니다.
gdp_trillion_krw = 2200.0
growth_rate = 0.021
usd_krw = 1350.0
print(f"한국의 GDP는 약 {gdp_trillion_krw:,.0f}조 원으로, 전년 대비 {growth_rate:.1%} 성장했다.")
print(f"달러로 환산하면 약 {gdp_trillion_krw / usd_krw:.2f}조 달러 규모다(환율 {usd_krw:,.0f}원 기준).")한국의 GDP는 약 2,200조 원으로, 전년 대비 2.1% 성장했다.
달러로 환산하면 약 1.63조 달러 규모다(환율 1,350원 기준).
실수 노트 — 이름 하나 틀렸을 뿐인데: NameError
변수를 쓰기 시작하면 가장 자주 만나는 에러가 NameError입니다. 원인은 대부분 오타입니다. 아래 코드에는 글자 두 개의 순서가 바뀌어 있습니다.
americano_price = 3200
print(f"가격: {americano_pirce:,}원") # price가 pirce로 잘못 적혔다실행하면 이런 에러가 납니다.
NameError: name 'americano_pirce' is not defined
’americano_pirce라는 이름은 정의된 적이 없다’는 뜻입니다. 파이썬은 철자가 한 글자만 달라도 완전히 다른 이름으로 취급하고, 비슷한 이름을 알아서 고쳐 주지 않습니다(최근 버전은 Did you mean: 'americano_price'?라고 후보를 제안해 주기는 합니다). NameError를 만나면 당황하지 말고, 메시지의 따옴표 안 이름을 그대로 복사한 다음 그 이름을 할당한 줄이 정말 있는지, 철자가 정확히 같은지 확인하세요.
오타가 아닌데도 NameError가 나는 경우가 하나 더 있습니다. 변수를 만드는 셀을 실행하기 전에 그 변수를 쓰는 셀부터 실행한 경우 — 노트북에서 셀 실행 순서가 꼬인 경우입니다. 이때는 노트북을 위에서부터 차례로 다시 실행하는 것이 가장 확실한 처방입니다.
2.10 경제학 응용 1: 명목과 실질 — 등록금은 정말 올랐을까
여는 질문으로 돌아갑시다. 작년 등록금 340만 원, 올해 355만 원. 고지서의 숫자는 15만 원, 비율로는 약 4.4% 올랐습니다. 이 4.4%를 명목(nominal) 인상률이라고 부릅니다. 화폐 액수 그대로의 변화라는 뜻입니다.
그런데 같은 기간 물가가 3.1% 올랐다면 이야기가 달라집니다. 물가가 오른다는 것은 같은 돈으로 살 수 있는 것이 줄어든다는 뜻, 즉 돈의 구매력이 떨어진다는 뜻입니다. 등록금 인상분 가운데 3.1%포인트어치는 등록금만 특별히 비싸진 것이 아니라 세상 모든 것이 함께 비싸진 부분입니다. 물가 효과를 걷어내고 남는 순수한 부담의 증가를 실질(real) 인상률이라고 부릅니다.
\[\text{실질 인상률} = \frac{1 + \text{명목 인상률}}{1 + \text{물가상승률}} - 1\]
왜 빼기가 아니라 나누기일까요? 인상률은 곱해지면서 쌓이는 값이기 때문입니다. 작년 등록금에 (1 + 명목 인상률)을 곱하면 올해 등록금이 되고, 작년 물가에 (1 + 물가상승률)을 곱하면 올해 물가가 됩니다. 물가 효과를 정확히 걷어내려면 배율끼리 나눠야 하지요. 다만 비율이 작을 때는 명목에서 물가를 그냥 뺀 값( \(4.4\% - 3.1\% = 1.3\%\) )과 거의 같아서, 경제 기사에서는 종종 뺄셈 근사를 씁니다. 둘 다 계산해서 비교해 봅시다.
tuition_last = 3_400_000 # 작년 등록금 (원)
tuition_this = 3_550_000 # 올해 등록금 (원)
inflation = 0.031 # 같은 기간 물가상승률 (가정)
nominal_rate = tuition_this / tuition_last - 1 # 명목 인상률
real_rate = (1 + nominal_rate) / (1 + inflation) - 1 # 실질 인상률
approx_rate = nominal_rate - inflation # 뺄셈 근사
print(f"명목 인상률: {nominal_rate:.2%}")
print(f"실질 인상률: {real_rate:.2%}")
print(f"뺄셈 근사: {approx_rate:.2%}")명목 인상률: 4.41%
실질 인상률: 1.27%
뺄셈 근사: 1.31%
한 줄씩 뜯어보기
nominal_rate = tuition_this / tuition_last - 1— 355만을 340만으로 나누면 1.0441…이 나옵니다. ‘작년의 1.0441배’라는 뜻이니, 1을 빼면 인상률 0.0441, 곧 4.41%입니다. 변화율을 구하는 이 ’나누고 1 빼기’ 패턴은 앞으로 성장률 계산이 나올 때마다 등장합니다.real_rate = (1 + nominal_rate) / (1 + inflation) - 1— 명목 배율 1.0441을 물가 배율 1.031로 나눠 물가 효과를 걷어내고, 다시 1을 빼 비율로 되돌립니다. 괄호를 빼면 연산 순서가 무너지니 그대로 쓰세요.print(f"명목 인상률: {nominal_rate:.2%}")— 계산은 소수로, 보고는 퍼센트로. 방금 배운:.2%서식이 곧바로 일합니다.
결과를 읽어 봅시다. 고지서의 숫자는 4.41% 올랐지만, 물가를 감안한 실제 부담은 약 1.27% 늘어나는 데 그쳤습니다. 숫자가 커진 것과 부담이 커진 것은 이렇게 다릅니다. 그리고 이 구분은 경제학 전체를 관통합니다. 명목 GDP와 실질 GDP, 명목 임금과 실질 임금, 명목 금리와 실질 금리. 신문의 큰 숫자를 볼 때마다 ’물가를 걷어낸 뒤에도 저 말이 성립하는가’를 묻는 습관이 경제학 훈련의 절반입니다. 연습문제에서는 같은 계산을 최저시급에 적용해 보는데, 그때는 실질 값의 부호가 뒤집히는 광경을 보게 됩니다.
2.11 경제학 응용 2: 예산 제약 — 살 수 있는가, 무엇을 포기했는가
경제학원론 첫 장의 명제는 ’자원은 희소하다’입니다. 대학생의 언어로 번역하면 ’잔고는 유한하다’가 되겠지요. 소비자는 가진 돈 안에서만 살 수 있다는 제약, 즉 예산 제약(budget constraint) 아래에서 선택합니다. 지출 합계가 잔고를 넘지 않아야 한다는 조건을 식으로 쓰면 \(\text{지출 합계} \le \text{잔고}\) 이고, 이 조건이 성립하는지는 참 아니면 거짓 — 정확히 불리언 하나로 표현됩니다.
시험 기간의 장바구니로 확인해 봅시다. 통장 잔고는 5만 원입니다.
balance = 50_000 # 통장 잔고 (원)
# 장바구니: 시험 기간 준비물
workbook_price = 28_000 # 미시경제학 연습서
pen_price = 4_500 # 형광펜 세트
coffee_price = 3_000 # 이콘 카페 아메리카노 (시험 기간 할인가)
cart_total = workbook_price + pen_price + coffee_price
is_affordable = balance >= cart_total # 예산 제약 판정: 결과는 불리언
print(f"장바구니 합계: {cart_total:,}원")
print(f"구매 가능 여부: {is_affordable}")
print(f"결제 후 잔액: {balance - cart_total:,}원")장바구니 합계: 35,500원
구매 가능 여부: True
결제 후 잔액: 14,500원
is_affordable에 담긴 True — 이것이 판정의 전부입니다. 우리는 아직 이 값에 따라 프로그램의 행동을 바꾸는 법을 배우지 않았지만, 판정 자체는 이미 완성되어 있습니다. 3장에서 배울 조건문은 이 불리언을 받아서 ’살 수 있으면 결제하고, 없으면 포기한다’는 행동의 갈림길을 만드는 문법입니다. 이번 장의 불리언이 다음 장의 연료인 셈이지요.
이번에는 장바구니에 전공 원서를 추가해 봅시다.
textbook_price = 65_000 # 전공 원서 (신간)
cart_total = workbook_price + pen_price + coffee_price + textbook_price
is_affordable = balance >= cart_total
print(f"장바구니 합계: {cart_total:,}원")
print(f"구매 가능 여부: {is_affordable}")
print(f"부족한 금액: {cart_total - balance:,}원")장바구니 합계: 100,500원
구매 가능 여부: False
부족한 금액: 50,500원
판정이 False로 바뀌었고, 5만 500원이 모자랍니다. 여기서 예산 제약의 본질이 드러납니다. 이것은 어기면 벌금을 무는 규칙이 아니라, 선택을 강제하는 조건입니다. 무언가를 사려면 다른 무언가를 포기해야 합니다.
포기한 것 가운데 가장 아까운 것의 가치를 경제학에서는 기회비용(opportunity cost)이라고 부릅니다. 잔고 5만 원으로 전공 원서(6만 5,000원)는 어차피 못 사니 제쳐 두고, 미시경제학 연습서(2만 8,000원)와 치킨 한 마리(2만 6,000원) 사이에서 고민한다고 합시다. 연습서를 고르면 치킨을 못 먹고, 치킨을 고르면 연습서를 못 삽니다. 이때 연습서 구매의 진짜 비용은 가격표의 2만 8,000원이 아니라 ’포기한 치킨’입니다. 영수증에는 찍히지 않지만 모든 선택에 어김없이 따라붙는 비용이지요. 다음 장에서 조건문을 배우면 이런 선택의 규칙 자체 — 만약 잔고가 부족하면 더 싼 쪽을 고른다 — 를 코드로 옮길 수 있게 됩니다.
2.12 그림으로 확인하기: 한국 경제의 크기를 그림 한 장으로
이 장에서 한국 GDP를 2,200조 원이라고 적었습니다. 그런데 외국 신문이나 국제 통계는 GDP를 달러로 적습니다. 나라마다 통화가 다르니, 비교하려면 하나로 맞춰야 하기 때문이지요. 우리도 비교 그래프를 그리기 전에 원화 GDP를 달러로 환산해 둡시다. 환산은 나눗셈 한 번입니다. 원화 금액을 환율(원/달러)로 나누면 달러 금액이 됩니다.
gdp_korea_trillion_krw = 2200.0 # 한국 GDP (조 원, 교육용 근사치)
usd_krw = 1350.0 # 원/달러 환율 (가정)
gdp_korea_trillion_usd = gdp_korea_trillion_krw / usd_krw # 조 원 / (원/달러) = 조 달러
print(f"한국 GDP: {gdp_korea_trillion_krw:,.0f}조 원")
print(f"달러 환산: 약 {gdp_korea_trillion_usd:.2f}조 달러 (환율 {usd_krw:,.0f}원 기준)")한국 GDP: 2,200조 원
달러 환산: 약 1.63조 달러 (환율 1,350원 기준)
약 1.63조 달러입니다. 이제 주요국과 나란히 세워 봅니다. 아래 셀에는 아직 배우지 않은 문법이 둘 등장합니다. 대괄호 [ ]로 여러 값을 묶는 리스트는 4장에서, matplotlib이라는 그래프 도구는 4장과 8장에서 정식으로 배웁니다. 오늘은 ’변수에 담아 둔 값이 그대로 그림의 재료가 된다’는 사실만 눈으로 확인하면 됩니다.
import matplotlib.pyplot as plt
countries = ["미국", "중국", "일본", "독일", "대한민국"] # 리스트: 4장에서 배웁니다
gdp_trillion_usd = [29.0, 18.5, 4.1, 4.7, gdp_korea_trillion_usd] # 교육용 근사치 (조 달러)
plt.figure(figsize=(8, 5))
plt.bar(countries, gdp_trillion_usd, color="lightgray") # 전체는 회색으로
plt.bar("대한민국", gdp_korea_trillion_usd, color="tab:blue") # 한국만 강조색
plt.title("주요국 GDP 비교 (조 달러, 교육용 근사치)")
plt.ylabel("GDP (조 달러)")
plt.show()
막대 다섯 개가 숫자 다섯 개보다 빠르게 말합니다. 미국 경제는 한국의 약 18배, 중국은 약 11배 규모입니다. 일본과 독일이 4조 달러 안팎에서 그다음 그룹을 이루고, 한국은 그 절반에 못 미치는 규모로 뒤를 잇습니다. 색을 두 가지만 쓴 것도 눈여겨보세요. 막대를 전부 다른 색으로 칠하면 화려해질 뿐 아무것도 강조되지 않습니다. 회색 바탕에 강조색 하나 — 8장에서 배울 ‘경제학자의 그래프’ 스타일의 첫 번째 원칙입니다.
이 그래프가 말하는 경제학 문장 한 줄: “통화 단위를 맞춰 놓고 보면, 세계 경제는 미국·중국 두 축에 크게 쏠려 있고 한국은 일본·독일의 절반에 못 미치는 규모다.”
끝으로 주의할 점 하나. 그래프의 1.63조 달러와 본문의 2,200조 원은 같은 값입니다. 환율이라는 다리를 건넜을 뿐이지요. 단위가 다른 숫자를 비교하거나 더할 때는 반드시 단위부터 맞출 것 — 코드에서도 경제학에서도 철칙입니다.
2.13 연습문제
문제마다 새 코드 셀을 만들어 풀어 보세요. input()을 쓰는 문제는 셀을 실행한 뒤 직접 값을 넣어 보아야 합니다.
손풀기
1. 알바 주급을 변수로 — 시급 10,030원을 hourly_wage에, 하루 근무 5시간을 hours_per_day에, 주 3일 근무를 days_per_week에 저장하고, 주급을 계산해 weekly_pay 변수에 담은 뒤 {weekly_pay:,}원 형식으로 출력하세요.
2. 자료형 알아맞히기 — 다음 네 값의 자료형을 먼저 종이에 예측해 적고, type()으로 확인하세요: 2026, 1350.5, "1350.5", 4000 > 3500.
3. 문자열을 숫자로 — 연간 기숙사비가 문자열 "3200000"으로 주어져 있습니다. 정수로 변환한 뒤 12로 나눠, 한 달 부담액을 :,.0f 서식으로 출력하세요.
응용
4. 학식과 도시락 가격 차이 보고 — 학식 한 끼는 4,000원, 편의점 도시락은 4,800원입니다. 두 가격을 변수에 저장하고, 도시락이 학식보다 몇 원, 그리고 몇 퍼센트 비싼지를 한 문장으로 출력하세요. 금액에는 :,, 비율에는 :.1% 서식을 씁니다. (비율 = 가격 차이 / 학식 가격)
5. 최저시급의 명목과 실질 — 최저시급이 작년 9,860원에서 올해 10,030원이 되었습니다. 물가상승률을 2.3%라고 가정하고, 명목 인상률과 실질 인상률을 각각 :.2% 서식으로 출력하세요. 실질 인상률의 부호를 확인하고, 그것이 알바생의 구매력에 관해 말해 주는 바를 주석 한 줄로 적으세요.
6. 커피값 계산기 — 커피 한 잔 가격과 이번 달 마신 잔 수를 input()으로 받아, 한 달 커피 지출을 :, 서식의 원 단위로 출력하는 계산기를 만드세요. 두 입력값을 각각 어떤 자료형으로 변환해야 할지 먼저 정하고 코드를 쓰세요.
도전
7. 예산 제약 리포트 생성기 — 통장 잔고, 그리고 사고 싶은 물건 세 개의 가격을 모두 input()으로 받아, 다음 네 줄을 출력하는 프로그램을 만드세요. (1) 장바구니 합계(콤마 서식), (2) 잔고(콤마 서식), (3) 구매 가능 여부(불리언 그대로), (4) 잔고에서 합계를 뺀 금액(콤마 서식 — 음수라면 그 자체가 부족액입니다). 조건문 없이, 이 장에서 배운 것만으로 완성할 수 있습니다.
풀이는 부록 C에 있습니다.
2.14 미니 프로젝트: 생각을 코드로, 코드를 글로
과제: 등록금 실질 부담 계산기
이번 장의 내용을 전부 동원해, 누구나 쓸 수 있는 등록금 계산기를 만들고 그 결과를 세 문단의 짧은 글로 해석합니다. 예상 소요 시간은 30~60분입니다.
1단계 — 계산기 만들기. input()으로 세 값을 받습니다: 작년 등록금(원), 올해 등록금(원), 물가상승률(%, 예: 3.1). 퍼센트로 받은 물가상승률은 100으로 나눠 소수로 바꿔서 씁니다. 이어서 명목 인상률, 실질 인상률, 그리고 올해 등록금을 작년 화폐가치로 환산한 금액(올해 등록금 ÷ (1 + 물가상승률))을 계산하세요.
2단계 — 결과 표 만들기. 계산 결과를 아래와 같은 정돈된 보고 형식으로 출력하세요. 금액은 :,.0f, 비율은 :.2% 서식을 쓰고, print()를 여러 번 써서 표 모양을 만들면 됩니다.
========= 등록금 실질 부담 보고서 =========
작년 등록금 3,400,000원
올해 등록금 3,550,000원
명목 인상률 4.41%
물가상승률 3.10%
실질 인상률 1.27%
올해 등록금(작년 화폐가치) 3,443,259원
==========================================
숫자 열을 완벽하게 맞추는 데 목숨 걸 필요는 없습니다. 읽는 사람이 한눈에 파악할 수 있으면 충분합니다. 여러분 학교의 실제 등록금은 학교 홈페이지나 대학알리미에서, 물가상승률은 통계청 소비자물가지수에서 찾아 넣어 보세요.
3단계 — 세 문단 글쓰기. 계산 결과를 근거로, 다음 틀에 맞춰 마크다운 셀에 글을 씁니다.
- 1문단(주장): 우리 학교 등록금의 실질 부담이 늘었는지 줄었는지, 명확한 한 문장의 주장으로 시작합니다.
- 2문단(근거): 계산기가 출력한 수치를 최소 두 개 인용합니다. “명목으로는 X% 올랐지만 물가 Y%를 감안하면 실질 인상률은 Z%다”처럼, 숫자가 문장 안에서 일하게 하세요.
- 3문단(한계와 확장): 이 계산이 놓친 것을 적어도 하나 지적합니다. 전체 물가상승률이 대학생의 실제 소비 바구니와 다를 수 있다는 점, 장학금이나 분납을 반영하지 않았다는 점 등. 다음에 무엇을 더 계산해 보고 싶은지로 마무리합니다.
자기 점검 체크리스트
input()으로 받은 값을 전부 알맞은 자료형으로 변환했는가? (input은 항상 문자열을 돌려준다)- 물가상승률을 퍼센트에서 소수로 바꾸는 단계를 빠뜨리지 않았는가?
- 출력된 금액에는 콤마 서식이, 비율에는 퍼센트 서식이 적용되어 있는가?
- 2문단에서 실제 출력 수치를 두 개 이상 인용했는가?
- 3문단에 계산의 한계가 최소 하나 적혀 있는가?
# TODO: 1단계 - 작년 등록금, 올해 등록금, 물가상승률(%)을 input()으로 받으세요.
# TODO: 받은 값을 알맞은 자료형으로 변환하세요. (물가상승률은 100으로 나눠 소수로)
# TODO: 명목 인상률, 실질 인상률, 작년 화폐가치로 환산한 올해 등록금을 계산하세요.
# TODO: 2단계 - f-string 서식으로 보고서 형식의 표를 출력하세요.2.15 요약과 다음 장 예고
이 장의 출발점은 숫자를 코드에 그대로 박아 넣을 때 생기는 세 가지 불편 — 반복 수정, 불투명함, 같은 계산의 중복 — 이었고, 해결책은 값에 이름을 붙이는 변수였습니다. =는 같다는 선언이 아니라 오른쪽 값을 왼쪽 이름에 저장하라는 명령이며, 그래서 cups_sold = cups_sold + 10 같은 줄이 성립합니다. 변수에 담기는 값에는 종류가 있어서, 정수·실수·문자열·불리언 네 자료형을 인구·GDP·통화 코드·예산 판정 같은 경제 데이터와 짝지어 확인했습니다. 바깥세상에서 오는 데이터는 거의 언제나 문자열로 도착하므로 — input()이 돌려주는 값이 대표적입니다 — int()와 float()로 변환해야 비로소 계산이 가능해집니다. 계산을 마친 숫자는 f-string의 세 가지 서식(천 단위 콤마, 소수점 자릿수, 퍼센트)을 거쳐 읽을 수 있는 보고가 됩니다. 경제학 쪽에서는 등록금 사례로 명목과 실질을 구분해 ’숫자가 커진 것과 부담이 커진 것은 다르다’는 사실을 계산으로 확인했고, 예산 제약의 성립 여부를 불리언 값 하나에 압축했습니다.
그 불리언이 다음 장의 주인공입니다. 3장에서는 조건문 if를 배워, True/False 판정에 따라 프로그램이 서로 다른 행동을 하게 만듭니다. 잔고가 모자라면 더 싼 것을 고르는 선택의 규칙, 그리고 소득 구간마다 세율이 달라지는 누진세 계산기가 조건문으로 코드가 되는 과정을 보게 될 겁니다.