Menu
Coddy logo textTech

뱅킹 시스템

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 85번째.

이 과제에서는 OOP 원칙을 사용하여 실제 금융 업무를 모델링하는 Banking System을 구축해야 합니다.

시스템은 SavingsAccountCheckingAccount와 같은 다양한 account 유형을 처리해야 하며, 두 유형 모두 base Account class를 확장합니다. 각 account 유형에는 고유한 동작이 있습니다. 예를 들어 savings accounts는 이자를 얻을 수 있고, checking accounts에는 초과 인출 보호 기능이 있을 수 있습니다.

거래를 어떻게 모델링할지 생각해 보세요. Transactable과 같은 인터페이스는 deposit()withdraw() 메서드를 정의할 수 있습니다. 잘못된 작업을 우아하게 처리하려면 InsufficientFundsException과 같은 사용자 지정 예외를 사용하는 것을 고려해 보세요.

Bank 클래스는 여러 계좌와 고객을 관리하여 컴포지션을 보여줄 수 있습니다. Factory 패턴을 적용하여 다양한 계좌 유형을 생성하거나, Observer 패턴을 사용하여 계좌 변경 사항을 고객에게 알릴 수 있습니다.

잔액과 계좌 번호 같은 민감한 데이터를 보호하기 위해 캡슐화에 중점을 두고, 다양한 계좌 유형을 일관되게 처리하기 위해 다형성을 사용하세요.

challenge icon

챌린지

쉬움

OOP 원칙에 대한 숙련도를 보여 주는 완전한 Banking System을 만들어 봅시다! 다양한 계정 유형, 거래 처리 및 적절한 예외 관리를 갖춘 시스템을 여러 파일에 걸쳐 구성하게 됩니다.

코드는 다음 7개의 파일로 구성합니다.

  • Transactable.java: 금융 작업에 대한 계약을 정의하는 인터페이스를 만드세요. 성공 여부를 나타내기 위해 boolean을 반환하는 deposit(double amount)withdraw(double amount) 메서드를 선언해야 합니다.
  • InsufficientFundsException.java: Exception을 확장하는 사용자 지정 예외를 만드세요. constructor는 attempted withdrawal amount와 current balance를 받아 Insufficient funds: attempted [amount], available [balance] 형식의 메시지를 생성해야 합니다.
  • Account.java: 모든 bank account를 나타내는 abstract base class를 만드세요. accountNumber (String) 및 balance (double)를 위한 private field, 두 값을 초기화하는 constructor, 적절한 getter, subclass가 수정할 수 있도록 balance를 위한 protected setter, 그리고 String을 반환하는 abstract method getAccountType()을 포함하세요. balance를 소수점 이하 2자리로 형식화하여 "[accountNumber] ([accountType]): $[balance]"를 반환하는 getDetails() 메서드를 구현하세요.
  • SavingsAccount.java: Account를 확장하고 Transactable을 구현하는 class를 만드세요. interestRate (double)를 위한 private field를 추가하세요. constructor는 accountNumber, initial balance 및 interestRate를 받습니다. getAccountType()"Savings"를 반환하도록 구현하세요. deposit()에서는 amount를 balance에 더하고 true를 반환하세요. withdraw()에서는 amount가 balance를 초과하면 false를 반환하고, 그렇지 않으면 차감한 후 true를 반환하세요. balance * interestRate만큼 balance를 증가시키는 applyInterest() 메서드를 추가하세요 (rate는 fraction으로 저장되므로 0.05는 5%를 의미합니다).
  • CheckingAccount.java: Account를 확장하고 Transactable을 구현하는 class를 만드세요. overdraftLimit (double)을 위한 private field를 추가하세요. constructor는 accountNumber, initial balance 및 overdraftLimit을 받습니다. getAccountType()"Checking"을 반환하도록 구현하세요. deposit()에서는 amount를 더하고 true를 반환하세요. withdraw()에서는 amount가 balance에 overdraftLimit을 더한 값보다 작거나 같을 때 출금을 허용하고, 이 한도를 초과하면 false를 반환하세요.
  • Bank.java: ArrayList를 사용하여 accounts를 관리하는 class를 만드세요. 다음 메서드를 포함하세요.
    • addAccount(Account account) - bank에 account를 추가합니다
    • findAccount(String accountNumber) - Account를 반환하며, 찾지 못하면 null을 반환합니다
    • transfer(String fromAccount, String toAccount, double amount) - accounts 간에 money를 transfer하며, source account에 funds가 insufficient하면 InsufficientFundsException을 발생시킵니다. 성공하면 "Transferred $[amount] from [fromAccount] to [toAccount]"를 반환합니다
    • getTotalDeposits() - 모든 account balance의 합계를 반환합니다
  • Main.java: Banking system을 구축하세요! 쉼표로 구분된 command 문자열을 입력받습니다.
    • SAVINGS:accountNumber:balance:interestRate
    • CHECKING:accountNumber:balance:overdraftLimit
    • DEPOSIT:accountNumber:amount
    • WITHDRAW:accountNumber:amount
    • TRANSFER:fromAccount:toAccount:amount
    • INTEREST:accountNumber

    각 command를 처리하고 다음을 출력하세요.

    • SAVINGS/CHECKING: Account created: [accountNumber]
    • DEPOSIT: Deposited $[amount] to [accountNumber]
    • WITHDRAW: 성공하면 Withdrew $[amount] from [accountNumber], 그렇지 않으면 Withdrawal failed: [accountNumber]
    • TRANSFER: 성공 메시지 또는 Transfer failed: [exception message]를 출력합니다
    • INTEREST: Interest applied to [accountNumber]

    모든 command가 끝나면 --- Bank Summary ---를 출력하고, 각 account의 details(getDetails() 사용)를 출력한 다음 마지막으로 Total deposits: $[total]을 소수점 이하 2자리로 형식화하여 출력하세요.

입력으로 하나의 값, 즉 쉼표로 구분된 command 문자열을 받습니다.

예를 들어 입력이 SAVINGS:SAV001:1000.00:0.05,CHECKING:CHK001:500.00:200.00,DEPOSIT:SAV001:250.00,WITHDRAW:CHK001:600.00,TRANSFER:SAV001:CHK001:100.00,INTEREST:SAV001이면 출력은 다음과 같습니다.

Account created: SAV001
Account created: CHK001
Deposited $250.00 to SAV001
Withdrew $600.00 from CHK001
Transferred $100.00 from SAV001 to CHK001
Interest applied to SAV001
--- Bank Summary ---
SAV001 (Savings): $1207.50
CHK001 (Checking): $0.00
Total deposits: $1207.50

checking account는 balance가 $500에 불과한데도 $600 withdrawal을 허용합니다. 이것이 바로 overdraft protection이 작동하는 방식입니다! savings account는 transfer 후 balance에 대해 5% interest를 얻습니다. 이 challenge는 inheritance, interfaces, polymorphism, custom exceptions 및 encapsulation을 현실적인 banking application에 결합합니다!

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input = scanner.nextLine();
        
        // TODO: Bank 인스턴스 생성
        
        // TODO: 쉼표로 입력을 분할하여 개별 명령어 가져오기
        
        // TODO: 각 명령어 처리:
        // - SAVINGS:accountNumber:balance:interestRate -> Create SavingsAccount, print "Account created: [accountNumber]"
        // - CHECKING:accountNumber:balance:overdraftLimit -> Create CheckingAccount, print "Account created: [accountNumber]"
        // - DEPOSIT:accountNumber:amount -> 입금 및 "Deposited $[amount] to [accountNumber]" 출력
        // - WITHDRAW:accountNumber:amount -> Withdraw and print success or "Withdrawal failed: [accountNumber]"
        // - TRANSFER:fromAccount:toAccount:amount -> 이체 및 성공 또는 "Transfer failed: [exception message]" 출력
        // - INTEREST:accountNumber -> Apply interest and print "Interest applied to [accountNumber]"
        
        // TODO: 모든 명령어 처리 후 "--- Bank Summary ---" 출력
        
        // TODO: getDetails()를 사용하여 각 계좌의 상세 정보 출력
        
        // TODO: Print "Total deposits: $[total]" formatted to 2 decimal places
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

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

직접 연습해 보세요: 온라인 Java 컴파일러