Menu
CoddyTech

은행 시스템

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

challenge icon

챌린지

어려움

두 종류의 계좌가 있는 은행을 만드세요. 모든 작업은 결과 딕셔너리 {"ok": bool, "message": String}를 반환합니다. 제공된 코드는 이를 OK: MESSAGE 또는 Failed: MESSAGE로 출력합니다. 모든 금액은 float이며 메시지의 모든 금액은 $ 뒤에 소수점 이하 두 자리로 표시됩니다.

transaction.gd의 Transaction: 생성자는 kind("deposit", "withdrawal" 또는 "interest")와 amount를 받습니다. _to_string()은 종류의 첫 글자를 대문자로 바꾸고 금액을 뒤에 붙여 반환합니다. 예: Deposit - $200.00. 거래에는 계좌가 저장되지 않습니다.

account.gd의 Account는 @abstract 클래스입니다.

  • 생성자는 account_number, owner_name, initial_balance를 받습니다. 돈은 private _balance에 저장되며, balance는 getter가 _balance를 반환하는 읽기 전용 속성입니다. _history는 Array[Transaction]이며, get_history()는 이를 반환합니다.
  • 추상 메서드는 두 개입니다. account_type() -> String과 withdrawal_error(amount: float) -> String이며, 후자는 출금이 거부된 이유 또는 ""를 반환합니다.
  • deposit(amount): 금액이 0 이하이면 Deposit amount must be positive를 반환하며 실패합니다. 그렇지 않으면 돈을 더하고 deposit 거래를 기록한 다음 Deposited $A. New balance: $B를 반환합니다.
  • withdraw(amount): 금액이 0 이하이면 Withdrawal amount must be positive를 반환하며 실패합니다. 비어 있지 않은 withdrawal_error()는 해당 텍스트와 함께 실패합니다. 그렇지 않으면 돈을 빼고 withdrawal 거래를 기록한 다음 Withdrew $A. New balance: $B를 반환합니다. 잔액이 이제 0 미만이면 뒤에 (Overdraft)가 붙습니다.
  • _to_string()은 TYPE NUMBER (OWNER): $BALANCE를 반환합니다.

savings_account.gd의 SavingsAccount는 Account를 상속하며, 상수는 INTEREST_RATE = 0.02와 MIN_BALANCE = 100.0입니다. 계좌 유형은 Savings입니다. 출금 후 잔액이 MIN_BALANCE보다 낮아지는 경우 Cannot withdraw below minimum balance of $100.00와 함께 거부됩니다. apply_interest()는 balance * INTEREST_RATE를 더하고 interest 거래를 기록한 다음 Applied interest: $I. New balance: $B를 반환합니다.

checking_account.gd의 CheckingAccount는 Account를 상속하며, 상수는 OVERDRAFT_LIMIT = 200.0입니다. 계좌 유형은 Checking입니다. 잔액은 -200.00까지 내려갈 수 있으며, 그보다 더 내려가는 출금은 Cannot exceed overdraft limit of $200.00와 함께 거부됩니다.

bank.gd의 Bank는 계좌 번호를 키로 사용하는 private 딕셔너리에 계좌를 보관합니다.

  • 생성자는 bank_name을 받습니다.
  • create_account(kind, account_number, owner_name, initial_balance)는 팩토리입니다. kind는 대소문자와 관계없이 savings 또는 checking입니다. Account number already exists 또는 Invalid account type와 함께 실패하며, 그렇지 않으면 Savings account created successfully(또는 Checking)를 반환합니다.
  • get_account(account_number) -> Account는 계좌를 반환하거나 null을 반환합니다.
  • transfer(from_number, to_number, amount): One or both accounts not found와 함께 실패합니다. 첫 번째 계좌에서 출금하며, 실패하면 출금 메시지 앞에 Transfer failed: 를 붙여 실패합니다. 그렇지 않으면 두 번째 계좌에 입금한 다음 Transferred $A from FROM to TO를 반환합니다.
  • total_holdings() -> float는 모든 잔액의 합계를 반환합니다.

제공된 코드는 은행 이름을 읽은 다음 명령을 읽습니다. 다음 입력의 경우:

First Bank
open savings|S1|Alice|1000
open checking|C1|Bob|50
withdraw S1|950
transfer S1|C1|300
withdraw C1|400
history C1
total

출력은 다음과 같습니다.

OK: Savings account created successfully
OK: Checking account created successfully
Failed: Cannot withdraw below minimum balance of $100.00
OK: Transferred $300.00 from S1 to C1
OK: Withdrew $400.00. New balance: $-50.00 (Overdraft)
History of C1:
1. Deposit - $300.00
2. Withdrawal - $400.00
Total held by First Bank: $650.00

코드는 transaction.gd, account.gd, savings_account.gd, checking_account.gd, bank.gd에 작성합니다. main.gd에는 제공된 입출력 코드가 있으며 수정할 수 없습니다.

직접 해보기

extends Node

func _ready():
	# 제공된 입출력 코드: 그대로 유지하세요

	var bank := Bank.new(OS.read_string_from_stdin())

	var line := OS.read_string_from_stdin()
	while line != "":
		var parts := line.split(" ", true, 1)
		var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
		match parts[0]:
			"open":
				show_result(bank.create_account(f[0], f[1], f[2], float(f[3])))
			"deposit":
				show_result(bank.get_account(f[0]).deposit(float(f[1])))
			"withdraw":
				show_result(bank.get_account(f[0]).withdraw(float(f[1])))
			"interest":
				var account: Account = bank.get_account(f[0])
				if account is SavingsAccount:
					var savings := account as SavingsAccount
					show_result(savings.apply_interest())
				else:
					print("Failed: ", f[0], " is not a savings account")
			"transfer":
				show_result(bank.transfer(f[0], f[1], float(f[2])))
			"history":
				var history: Array = bank.get_account(f[0]).get_history()
				print("History of ", f[0], ":")
				for i in history.size():
					print(i + 1, ". ", history[i])
			"account":
				print(bank.get_account(f[0]))
			"total":
				print("Total held by %s: $%.2f" % [bank.bank_name, bank.total_holdings()])

		line = OS.read_string_from_stdin()

func show_result(result: Dictionary) -> void:
	print(("OK: " if result["ok"] else "Failed: ") + result["message"])

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

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