무엇을 만드나
이자에 다시 이자가 붙으면 어떻게 될까요?
주어진 문제
매달 넣을 돈과 월 이자율을 입력받아, 1개월부터 24개월까지 달마다 잔액이 얼마가 되는지 한 줄씩 내놓는 프로그램을 만듭니다.
번호를 하나씩 찍는 반복은 매번 따로 노는 일입니다. 여기서는 지난달의 잔액이 이번 달 계산의 재료입니다. 그래서 반복이 앞의 결과를 물려받으며 돌아야 합니다.
먼저 밝혀 둘 것 — 실제 금융 상품과 다릅니다
이 프로그램은 「잔액 전체에 이자가 붙는다」는 계산만 그대로 따라 합니다. 실제 예금과 적금은 이자를 매기는 방식이 상품마다 다르고, 세금도 붙습니다. 여기서 나온 숫자를 실제 저축의 결과로 여기면 안 됩니다. 배우려는 것은 금융이 아니라 앞의 결과를 물려받는 반복입니다.
| 단계 | 여기서 답할 질문 |
|---|---|
| 1 요구 분석 | 몇 달까지 보여 주고 자릿수를 어떻게 할 것인가 |
| 2 설계 | 이번 달 잔액이 무엇으로 정해지는가 |
| 3 구현 | 잔액의 처음 값을 어디서 정할 것인가 |
| 4 테스트 | 손으로 계산할 수 있는 값을 어떻게 고를 것인가 |
먼저 개발 문서 양식을 내려받으세요
읽기만 하지 말고 직접 채워 보세요. 단계마다 자기 답을 적어 두면 그 기록이 요구 사항 명세서이자 설계서가 됩니다. 답을 보기 전에 먼저 적어 봅니다.
요구 분석과 설계는 언어와 상관없습니다. 두 양식의 앞부분은 같고, 구현을 적는 자리만 언어에 맞춰 다릅니다. 수업에서 쓰는 언어에 맞는 것을 받으면 됩니다. 이 강의노트의 코드 예시는 파이썬으로 되어 있습니다.
1단계 · 무엇을 만들 것인가
「잔액을 알려 준다」에 정할 것이 남아 있습니다.
되물어야 할 것들
- 이자를 언제 붙이나요? 그달 저축을 넣기 전인가요 넣은 뒤인가요
- 몇 달까지 보여 주나요? 24개월로 정해져 있나요
- 소수점을 어떻게 하나요? 원 단위로 자르나요
- 이자율은 연 이율인가요 월 이율인가요?
- 매달만 보여 주나요? 마지막 값만 보여 주면 안 되나요
정리한 요구 사항
- 매달 넣을 돈과 월 이자율(퍼센트)을 한 줄에 하나씩 받는다.
- 그달 저축을 먼저 넣고, 그 전체에 이자를 붙인다.
- 1개월부터 24개월까지 매달의 잔액을 한 줄에 하나씩 내놓는다.
- 각 줄에는 몇 개월째인지와 잔액을 함께 적는다.
- 잔액은 소수점 둘째 자리까지 반올림해 내놓는다.
- 기간 24개월은 고정한다.
2번을 안 정하면 답이 달라집니다
저축을 넣고 이자를 붙이는 것과 이자를 붙인 뒤 저축을 넣는 것은 답이 다릅니다. 첫째 달만 봐도 그렇습니다. 앞쪽이면 넣은 돈에도 이자가 붙고, 뒤쪽이면 0에 이자가 붙어 그대로입니다. 둘 다 말이 되는 규칙이라 무엇이 맞는지 코드로는 알 수 없습니다. 정해서 적어 두어야만 테스트할 수 있습니다.
요구 사항 2번을 반대로 — 이자를 먼저 붙이고 저축을 넣는다고 정하면 첫째 달 잔액은 얼마가 될까요? 매달 10만 원, 월 1%로 계산해 보세요.
2단계 · 지난달을 물려받는다
이번 달 잔액은 무엇으로 정해질까요?
| 토막 | 무엇을 정하는가 |
|---|---|
| 입력 | 매달 넣을 돈, 월 이자율 — 실수 두 개 |
| 처리 | 지난달 잔액에 이번 달 저축을 더하고 이자를 붙이기를 24번 |
| 출력 | 24줄 — 달과 잔액 |
한 달치 계산은 한 줄이면 된다
새 잔액 = (지난 잔액 + 이번 달 저축) × (1 + 이자율 ÷ 100)
이자율을 100으로 나누는 것은 퍼센트를 배율로 바꾸는 일입니다. 1퍼센트는 0.01이고, 여기에 1을 더한 1.01을 곱하면 1퍼센트가 붙은 값이 됩니다. 이자만 따로 구해 더하지 않고 한 번에 곱하는 것이 간단합니다.
| 달 | 계산 | 잔액 (매달 10만 원, 월 1%) |
|---|---|---|
| 1개월 | (0 + 100000) × 1.01 | 101,000 |
| 2개월 | (101000 + 100000) × 1.01 | 203,010 |
| 3개월 | (203010 + 100000) × 1.01 | 306,040.1 |
2개월 줄의 101000은 1개월 줄의 결과입니다. 계산이 사슬처럼 이어집니다.
푸는 순서
- 매달 넣을 돈과 이자율을 입력받는다.
- 잔액을 0으로 놓는다.
- 1개월부터 24개월까지 반복한다.
- 잔액 = (잔액 + 매달 넣을 돈) × (1 + 이자율 ÷ 100)
- 몇 개월째인지와 잔액을 한 줄 내놓는다.
2번이 반복 밖에 있어야 합니다
잔액을 0으로 놓는 줄이 반복 안에 들어가면 달마다 0으로 되돌아갑니다. 그러면 매달 똑같은 값이 24번 찍힙니다. 가장 큰 값을 찾을 때 그 값을 반복 밖에 두는 것과 같은 이야기입니다. 물려받아야 하는 값은 반복 밖에서 마련합니다.
표의 3개월째 잔액을 직접 계산해 보세요. 그리고 그 값이 넣은 돈 30만 원보다 얼마나 많은지도 구해 보세요.
3단계 · 파이썬으로 옮기기
설계 그대로 옮기면 여섯 줄입니다.
먼저 스스로 적어 본 뒤에 코드를 보세요.
복리.기본.py
# 매달 넣을 돈과 월 이자율을 한 줄씩 받는다
savings = float(input())
rate = float(input())
balance = 0
for month in range(1, 25):
# 이번 달 저축을 더한 뒤, 그 전체에 이자가 붙는다
balance = (balance + savings) * (1 + rate / 100)
print(month, round(balance, 2))
round(balance, 2)는 흔히 배운 반올림과 조금 다릅니다. 딱 중간인 값은 짝수 쪽으로 보내고,
실수를 이진수로 저장하며 생기는 작은 오차도 있어 round(2.675, 2)가 2.67로 나옵니다.
같은 이름이 양쪽에 나오는 줄
잔액을 구하는 줄에서 잔액이라는 이름이 왼쪽에도 오른쪽에도 나옵니다. 수학의 등호로 읽으면 이상한 식이지만, 여기서는 「오른쪽을 계산해서 왼쪽에 새로 담아라」는 뜻입니다. 오른쪽의 잔액은 지난달 값, 왼쪽의 잔액은 이번 달 값입니다. 물려받는 반복은 거의 언제나 이 모양을 하고 있습니다.
반복이 도는 값을 이번엔 씁니다
도는 값을 쓰지 않는 반복이라면 밑줄 하나로 두어도 됩니다. 여기서는 몇 개월째인지 내놓아야 하므로 이름을 지어 씁니다. 1부터 24까지 돌아야 하니 범위의 끝은 25입니다.
잔액을 0으로 놓는 줄을 반복 안으로 들여쓰면 24줄에 무엇이 찍힐까요? 매달 10만 원, 월 1%로 생각해 보세요.
4단계 · 넣어 보고 확인하기
이자율 0을 넣으면 답을 손으로 알 수 있습니다.
손으로 계산할 수 있는 값을 골라 첫 줄과 마지막 줄만 확인합니다. 24줄을 다 검산할 수는 없기 때문입니다.
| 넣은 값 | 나와야 할 결과 | 무엇을 보려는 값인가 |
|---|---|---|
| 100000 / 0 | 1개월 100000.0 24개월 2400000.0 |
이자율 0 — 넣은 돈이 그대로 쌓이는지 |
| 0 / 5 | 24개월 모두 0.0 | 넣는 돈이 0 — 0에 이자를 붙여도 0인지 |
| 100000 / 1 | 1개월 101000.0 2개월 203010.0 |
설계 표와 맞는지 |
| 100000 / 1 | 24개월 2724319.95 | 사슬이 24번 제대로 이어지는지 |
| 100000 / 100 | 1개월 200000.0 | 이자율 100퍼센트 — 배율로 잘 바뀌는지 |
결과가 어긋났다면 여기부터 봅니다
- 24줄이 모두 같다 — 잔액을 반복 안에서 0으로 되돌리고 있습니다
- 이자율 1인데 1개월에 200000이 나온다 — 배율을 1 + 이자율/100이 아니라 1 + 이자율로 적어 100으로 안 나눴습니다
- 이자율 0인데 값이 0이 된다 — 배율에 1을 더하지 않았습니다
- 1개월에 100000이 나온다 (이자율 1인데) — 이자를 붙이고 저축을 넣는 순서로 적었습니다. 요구 사항 2번과 반대입니다
- 23줄만 나온다 — 범위 끝에 1을 더하지 않았습니다
- 소수점이 길게 나온다 — 반올림하는 부분이 빠졌습니다
이자율 0이 가장 좋은 테스트입니다
이자율을 0으로 넣으면 답을 암산으로 알 수 있습니다. 10만 원씩 24번이면 240만 원입니다. 계산이 복잡한 프로그램일수록 「계산이 사라지는 값」을 찾아 넣어 보면 사슬이 제대로 이어지는지만 따로 확인할 수 있습니다.
테스트 표에서 이자율 100을 넣으면 1개월 잔액이 20만 원입니다. 왜 그렇게 되는지 배율로 설명해 보세요.
더 해 보기
단리와 비교해 보면 복리가 무엇인지 또렷해집니다.
단리와 비교하려면 먼저 단리를 정의해야 합니다
「단리는 이자에 이자가 안 붙는 것」이라고만 하면 계산할 수가 없습니다. 매달 돈을 넣는 경우에는 「각 달에 넣은 돈이 남은 개월 수만큼 이자를 받는다」처럼 정확히 정해 주어야 숫자가 나옵니다.
그렇게 정하고 매달 10만 원, 월 1%로 24개월을 계산하면 단리는 270만 원, 복리는 약 272만 4,320원입니다. 차이는 약 2만 4,320원입니다.
생각보다 작다고 느껴질 수 있습니다. 기간이 짧기 때문입니다. 기간을 늘려 보면 차이가 어떻게 벌어지는지 「기간을 입력받는다」 과제에서 직접 확인해 보세요.
기간을 입력받는다
24개월 고정을 풀어 봅니다. 60개월, 120개월로 늘려 가며 단리와의 차이가 어떻게 되는지 적어 보세요.
단리도 함께 보여 준다
한 줄에 단리 잔액과 복리 잔액을 나란히 내놓습니다. 「각 달에 넣은 돈이 남은 개월 수만큼 이자를 받는다」는 단리 규칙을 그대로 코드로 옮기면 됩니다.
목표 금액에 언제 닿나
1000만 원을 목표로 두고 몇 개월이 걸리는지 구해 봅니다. 몇 번 돌지 미리 모르는 반복이 필요합니다. 목표에 닿으면 빠져나가는 조건을 함께 적어야 합니다.
원 단위로 자른다
실제 돈은 소수점 아래가 없습니다. 매달 소수점을 버리고 계산하면 24개월 뒤 값이 달라집니다. 얼마나 달라지는지 확인해 보세요.
「원 단위로 자른다」 과제에서 매달 소수점을 버리면 최종 잔액이 커질까요 작아질까요? 그리고 그 차이는 기간이 길어질수록 어떻게 될까요?