대출 이자 계산 툴
대출을 받을 일이 생겼습니다..ㅠㅠ
이자 계산, 상환 방법이 여러가지가 있어 공부할 겸 툴로 구현해 보겠습니다.
개발 환경
이자 계산 툴의 가장 중요한 부분인 두 상환 방법을 구현한 코드부터 작성 하겠습니다.
1: /// <summary>
2: /// 원금 균등 상환방식
3: /// </summary>
4: /// <param name="loanMoney"></param>
5: /// <param name="loanTerm"></param>
6: /// <param name="interestRate"></param>
7: /// <returns></returns>
8: private List<RepaymentItem> PrincipalRepayment(double loanMoney, int loanTerm, double interestRate)
9: {
10: List<RepaymentItem> repayments = new List<RepaymentItem>();
11:
12: double left = loanMoney;
13: // 원금
14: double payment = Math.Round(loanMoney / loanTerm);
15: // 대출 이자율(연이자율/12), 소수점 6자리
16: double yearInterest = Math.Round(interestRate / YearOfMonthCount, 6) / 100;
17: //double yearInterest = Math.Round(interestRate / 100 / YearOfMonthCount, 6);
18:
19: for (int i = 1; i <= loanTerm; i++)
20: {
21: // 이자
22: double interest = Math.Round(left * yearInterest, 6);
23: // 남은 금액
24: left = (left - payment < 0) ? 0 : (left - payment);
25:
26: Trace.WriteLine(string.Format("회차: {0}, 원금:{1:c}, 이자:{2:c}, 남은 금액: {3:c}", i, payment, interest, left));
27:
28: repayments.Add(new RepaymentItem
29: {
30: Count = i,
31: Payment = payment,
32: Interest = interest,
33: PaymentTotal = payment + interest,
34: Balance = left
35: });
36: }
37:
38: return (repayments.Count == 0) ? null : repayments;
39: }
40:
41: /// <summary>
42: /// 원리금 균등 상환방식
43: /// </summary>
44: /// <param name="loanMoney"></param>
45: /// <param name="loanTerm"></param>
46: /// <param name="interestRate"></param>
47: /// <returns></returns>
48: private List<RepaymentItem> PrincipleRepayment(double loanMoney, int loanTerm, double interestRate)
49: {
50: List<RepaymentItem> repayments = new List<RepaymentItem>();
51:
52: // 남은금액
53: double left = loanMoney;
54: // 대출 이자율(연이자율/12), 소수점 6자리
55: double yearInterest = Math.Round(interestRate / YearOfMonthCount, 6) / 100;
56:
57: // 원금 * 대출이자율(1 + 대출이자율) 제곱 month
58: // ---------------------------------------
59: // (1 + 대출이자율) 제곱 month - 1
60:
61: // 분모
62: double denominator = Math.Pow(yearInterest + 1, loanTerm) - 1;
63: // 분자
64: double molecule = loanMoney * yearInterest * (Math.Pow(yearInterest + 1, loanTerm));
65: // 월상환금
66: double monthPayment = Math.Round(molecule / denominator);
67:
68: for (int i = 1; i <= loanTerm; i++)
69: {
70: // 이자
71: double interest = Math.Round(left * yearInterest);
72: // 상환할 원금
73: double payment = monthPayment - interest;
74: // 남은 금액
75: left = (left - payment < 0) ? 0 : left - payment ;
76:
77: Trace.WriteLine(string.Format("회차: {0}, 원금:{1:c}, 이자:{2:c}, 남은 금액: {3:c}", i, payment, interest, left));
78:
79: repayments.Add(new RepaymentItem
80: {
81: Count = i,
82: Payment = payment,
83: Interest = interest,
84: PaymentTotal = monthPayment,
85: Balance = left
86: });
87: }
88:
89: return (repayments.Count == 0) ? null : repayments;
90: }
두 메서드는 매개변수로 대출금, 대출기간, 이자율을 받아 회차 별로 계산을 합니다.
이자 계산 툴이다 보니 두 메서드를 사용하면 사실 거의 끝났다고 봐도 될 것 같습니다.
이제 UI를 구성해야 겠지요! 아래 그림을 참고해 주세요.
레이아웃을 그리드를 이용해 1Column, 3Row 로 구성:
- 첫번째 row는 검색 조건
- 두번째 row는 결과
- 세번째 row는 이벤트를 발생하는 버튼
합니다.
UI 결과란에 검색 조건을 이용한 계산을 실행 할 이벤트를 구현 해보겠습니다.
1: /// <summary>
2: /// 계산 버튼 이벤트
3: /// </summary>
4: /// <param name="sender"></param>
5: /// <param name="e"></param>
6: private void btnCalc_Click(object sender, RoutedEventArgs e)
7: {
8: // 대출금
9: double loanMoney = 0;
10: // 대출 기간 종류
11: short loanType = 0;
12: // 대출 기간
13: int loanTerm = 0;
14: // 연이자율
15: double interestOfYear = 0;
16: // 상환종류
17: short interestType = 0;
18:
19: if (!double.TryParse(
20: txtLoanMoney.Text,
21: System.Globalization.NumberStyles.Currency,
22: System.Threading.Thread.CurrentThread.CurrentUICulture,
23: out loanMoney))
24: {
25: // 잘못된 입력
26: return;
27: }
28:
29: if (!int.TryParse(txtTerm.Text, out loanTerm))
30: {
31: return;
32: }
33:
34: if (!double.TryParse(txtInterestOfYear.Text, out interestOfYear))
35: {
36: return;
37: }
38:
39: loanType = (rbYear.IsChecked.Value) ? (short)0 : (short)1;
40: interestType = (rbPrincipal.IsChecked.Value) ? (short)0 : (short)1;
41:
42: // 대출 기간 종류가 년일 경우 월로 계산
43: loanTerm = (loanType == 0) ? loanTerm * 12 : loanTerm;
44:
45: List<RepaymentItem> repayments = null;
46: if (interestType == 0)
47: {
48: // 원금 균등 상환방식
49: repayments = PrincipalRepayment(loanMoney, loanTerm, interestOfYear);
50: }
51: else
52: {
53: // 원리금 균등 상환방식
54: repayments = PrincipleRepayment(loanMoney, loanTerm, interestOfYear);
55: }
56:
57: if (repayments != null)
58: {
59: double interestSum = repayments.Sum(r => r.Interest);
60:
61: tbAmount.Text = loanMoney.ToString("N0");
62: tbTotalInterest.Text = interestSum.ToString("N0");
63: tbTotalPayment.Text = (loanMoney + interestSum).ToString("N0");
64:
65: gridResult.Visibility = Visibility.Visible;
66: }
67: }
계산 버튼에 이벤트를 등록 합니다.
1: <Button x:Name="btnCalc" Grid.Column="0" Content="계산하기" Margin="150,15,15,15" Click="btnCalc_Click" />
이번에 구현한 이자 계산 툴은 UI 결과로 총 이자 계산 결과를 보여주고 있지만, 상환 방법 별 메서드에서
'상환 정보 객체'를 리스트로 반환을 하기에 리스트를 이용해 회차 별 상환 정보를 볼 수 있도록 추가 구현도 가능 합니다.
1: /// <summary>
2: /// 상환 정보 객체
3: /// </summary>
4: public class RepaymentItem
5: {
6: // 회차
7: public int Count { get; set; }
8: // 납입원금
9: public double Payment { get; set; }
10: // 대출이자
11: public double Interest { get; set; }
12: // 월상환금
13: public double PaymentTotal { get; set; }
14: // 대출잔금
15: public double Balance { get; set; }
16: }
댓글
댓글 쓰기