Menu
Coddy logo textTech

은행 시스템

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

challenge icon

챌린지

쉬움

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

여러분의 뱅킹 시스템은 다음 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)을 생성합니다. 저축 계좌(SAV001, 시작 잔액 $1000)와 당좌 계좌(CHK001, 시작 잔액 $500)를 생성합니다. 두 계좌를 고객에게 추가하고 고객 정보를 출력하세요. 그런 다음 다음 작업들을 수행하세요:
    1. 저축 계좌에 $200를 입금합니다.
    2. 저축 계좌에서 $300를 출금합니다 (성공해야 함).
    3. 저축 계좌에서 $600 출금을 시도합니다 (한도 초과로 거부되어야 함).
    4. 저축 계좌에 5% 이자를 적용합니다.
    5. 당좌 계좌에서 $550를 출금합니다 (마이너스 통장 기능을 사용하여 성공해야 함).
    6. 당좌 계좌에서 $100를 더 출금하려고 시도합니다 (마이너스 한도 초과로 거부되어야 함).
    마지막으로, Savings transactions: XTotal balance: $Y (소수점 둘째 자리까지 형식화)를 출력하세요.

예상 출력:

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.0

직접 해보기

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

void main() {
  // TODO: id가 "C001"이고 이름이 "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를 출금하세요 (overdraft를 사용하여 성공해야 함)
  // 6. checking에서 $100를 더 출금해 보세요 (거부되어야 함 - overdraft 한도를 초과함)
  
  // TODO: "Savings transactions: X"를 출력하세요. 여기서 X는 transaction 횟수입니다
  
  // TODO: "Total balance: \$Y"를 출력하세요. 여기서 Y는 소수점 2째 자리까지 형식화된 값입니다
}

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