Menu
Coddy logo textTech

은행 시스템

Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 108번째.

challenge icon

챌린지

쉬움

이 과정에서 익힌 OOP 원칙을 사용하여 실제 금융 운영을 모델링하는 은행 시스템을 구축해 보겠습니다. 서로 다른 규칙을 가진 계좌를 생성하고, 거래를 추적하며, 고객을 관리하는 기능을 여러 파일에 걸쳐 조직적으로 구현하게 됩니다.

은행 시스템은 다음 6개의 파일로 구성됩니다:

  • transaction.dart: 금융 작업의 불변 기록을 나타내는 Transaction 클래스를 생성합니다. 각 거래는 type (String - "deposit", "withdrawal", 또는 "transfer"), amount (double), timestamp (DateTime)에 대한 final 필드를 가집니다. toString()을 오버라이드하여 [type] $amount를 반환하도록 합니다.
  • account.dart: private _balance (double), final 계좌 번호 (accountNumber - String), 그리고 거래 내역을 저장할 List<Transaction>를 가진 추상 Account 클래스를 생성합니다. 잔액을 위한 getter, 다른 파일의 서브클래스가 잔액을 업데이트할 수 있도록 하는 protected setter set balance(double value), 서브클래스에서 구현할 추상 메서드 bool canWithdraw(double amount), 그리고 다음의 구체적인 메서드들을 포함합니다:
    • deposit(double amount) - 잔액에 추가하고, 거래를 기록하며, Deposited $amount. Balance: $balance를 출력합니다.
    • withdraw(double amount) - canWithdraw()가 true를 반환하면 잔액에서 차감하고, 거래를 기록하며, Withdrew $amount. Balance: $balance를 출력합니다. 그렇지 않으면 Withdrawal denied를 출력합니다.
    • getTransactionCount() - 거래 횟수를 반환합니다.
  • savings_account.dart: Account를 상속받는 SavingsAccount를 생성합니다. 저축 계좌(Savings accounts)는 출금 제한이 있습니다. 단일 거래에서 $500를 초과하여 출금할 수 없습니다. 이 규칙을 적용하도록 canWithdraw()를 구현하세요(잔액이 충분한지도 확인해야 합니다). balance getter와 setter를 사용하여 주어진 이율만큼 잔액을 증가시키는 applyInterest(double rate) 메서드를 추가하고, Interest applied. Balance: $balance를 출력합니다.
  • checking_account.dart: Account를 상속받는 CheckingAccount를 생성합니다. 당좌 계좌(Checking accounts)는 $100까지 마이너스 통장 보호(overdraft protection) 기능이 있습니다. 즉, 잔액이 마이너스가 될 수 있지만 -$100 미만으로 내려갈 수는 없습니다. 결과 잔액이 -$100 이상으로 유지되는 한 출금을 허용하도록 canWithdraw()를 구현하세요.
  • customer.dart: id (String), name (String), 그리고 계좌 목록을 위한 List<Account>를 가진 Customer 클래스를 생성합니다. 계좌를 추가하는 addAccount(Account account) 메서드와 모든 계좌 잔액의 합계를 반환하는 getTotalBalance() 메서드를 포함합니다. toString()을 오버라이드하여 Customer: name (X accounts)를 반환하도록 합니다.
  • main.dart: 은행 시스템을 시연합니다. 고객(C001, John Smith)을 생성합니다. SavingsAccount(SAV001, 시작 잔액 $1000)와 CheckingAccount(CHK001, 시작 잔액 $500)를 생성합니다. 두 계좌를 고객에게 추가하고 고객 정보를 출력합니다. 그 후 다음 작업들을 수행합니다:
    1. 저축 계좌에 $200를 입금합니다.
    2. 저축 계좌에서 $300를 출금합니다 (성공해야 함).
    3. 저축 계좌에서 $600 출금을 시도합니다 (한도 초과로 거부되어야 함).
    4. 저축 계좌에 5% 이자를 적용합니다.
    5. 당좌 계좌에서 $550를 출금합니다 (마이너스 한도를 사용하여 성공해야 함).
    6. 당좌 계좌에서 $100를 더 출금하려고 시도합니다 (마이너스 한도 초과로 거부되어야 함).
    마지막으로, Savings transactions: XTotal balance: $Y (소수점 2자리까지 형식화)를 출력합니다.

예상 출력:

Customer: John Smith (2 accounts)
Deposited $200.0. Balance: $1200.0
Withdrew $300.0. Balance: $900.0
Withdrawal denied
Interest applied. Balance: $945.0
Withdrew $550.0. Balance: $-50.0
Withdrawal denied
Savings transactions: 3
Total balance: $895.00

직접 해보기

import 'transaction.dart';
import 'account.dart';
import 'savings_account.dart';
import 'checking_account.dart';
import 'customer.dart';

void main() {
  // TODO: id가 "C001"이고 name이 "John Smith"인 customer를 생성하세요
  
  // TODO: accountNumber가 "SAV001"이고 시작 잔액이 $1000인 SavingsAccount를 생성하세요
  
  // TODO: accountNumber가 "CHK001"이고 시작 잔액이 $500인 CheckingAccount를 생성하세요
  
  // TODO: 두 계좌를 customer에게 추가하세요
  
  // TODO: customer를 출력하세요
  
  // TODO: 다음 작업들을 수행하세요:
  // 1. savings account에 $200를 입금합니다
  // 2. savings account에서 $300를 출금합니다 (성공해야 함)
  // 3. savings account에서 $600 출금을 시도합니다 (한도 초과로 거부되어야 함)
  // 4. savings account에 5% 이자를 적용합니다
  // 5. checking account에서 $550를 출금합니다 (마이너스 통장 기능을 사용하여 성공해야 함)
  // 6. checking account에서 $100를 더 출금하려고 시도합니다 (마이너스 통장 한도 초과로 거부되어야 함)
  
  // TODO: "Savings transactions: X" 출력 (X는 트랜잭션 횟수)
  
  // TODO: "Total balance: \$Y" 출력 (Y는 소수점 둘째 자리까지 표시)
}

객체 지향 프로그래밍의 모든 레슨