은행 시스템
Coddy Dart 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 110개 중 108번째.
챌린지
쉬움이 과정에서 익힌 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 setterset 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()를 구현하세요 (충분한 잔액이 있는지도 확인해야 합니다).balancegetter와 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)를 생성합니다. 두 계좌를 고객에게 추가하고 고객 정보를 출력하세요. 그런 다음 다음 작업들을 수행하세요:- 저축 계좌에 $200를 입금합니다.
- 저축 계좌에서 $300를 출금합니다 (성공해야 함).
- 저축 계좌에서 $600 출금을 시도합니다 (한도 초과로 거부되어야 함).
- 저축 계좌에 5% 이자를 적용합니다.
- 당좌 계좌에서 $550를 출금합니다 (마이너스 통장 기능을 사용하여 성공해야 함).
- 당좌 계좌에서 $100를 더 출금하려고 시도합니다 (마이너스 한도 초과로 거부되어야 함).
Savings transactions: X와Total 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째 자리까지 형식화된 값입니다
}