# 계좌를 관리하는 클래스
class Account:
def __init__(self, owner, accNo, balance):
self.owner = owner
self.accNo = accNo
self.balance = balance
# 잔고 조회
def getBalance(self):
return self.balance
# 입금
def deposit(self, amount):
self.balance += amount
# 계좌 정보 조회
def showAccountInfo(self):
return f'계좌주:{self.owner}, 계좌번호:{self.accNo}, 잔고:{self.balance}'
# 출금
def withdraw(self, amount):
if self.balance >= amount:
self.balance -= amount
else:
raise InvalidTransactionException('출금 잔고가 부족합니다.')
# 이체
def transfer(self, amount, target):
if self.balance >= amount:
self.balance -= amount
target.deposit(amount) # 상대방에게 입금
else:
raise InvalidTransactionException('이체 잔고가 부족합니다.')
# 계좌 번호 조회
def getAccNo(self):
return self.accNo
# Banking System의 업무관리 로직 클래스
# 계좌 등록, 계좌 조회, 등록된 전체 계좌 목록 조회
import random
import pickle, os
class BankManager:
def __init__(self):
self.account_list = [] # Account 클래스의 객체를 저장 (객체는 모든 정보를 갖고 있다)
self.accNo_list = [] # 생성된 계좌번호 저장
# 계좌 번호 자동 생성
# 계좌 번호 형식: XXX-XXX -> XXX는 100~999 사이의 값
def genAccNo(self):
while True:
n1 = random.randint(100, 999)
n2 = random.randint(100, 999)
accNo = str(n1) + '-' + str(n2)
if accNo not in self.accNo_list:
self.accNo_list.append(accNo)
return accNo
# 신규 계좌 등록
def addAccount(self, a):
self.account_list.append(a)
# 계좌 검색
def searchAccount(self, accNo):
result = None # 검색된 Account 객체를 할당
for a in self.account_list:
if a.getAccNo() == accNo:
result = a # result에는 Acoount 객체가 담긴다
break
return result
# 등록된 모든 계좌 정보를 반환
def getAllAccountList(self):
return self.account_list
# 데이터 저장
def saveData(self):
with open('data.dat', 'wb') as f:
pickle.dump(self.account_list, f)
# 데이터 읽기
def readData(self):
if os.path.exists('data.dat'):
with open('data.dat', 'rb') as f:
self.account_list = pickle.load(f)
# 비정상적 거래가 발생했을 때 사용할 사용자 정의 예외
class InvalidTransactionException(Exception):
def __init__(self, message):
super().__init__(message)
self.message = message
def __str__(self):
return '[Invalid Transaction Exception]' +self.message
from bank import Account, BankManager, InvalidTransactionException
a1 = Account('홍길동', '11-11', 500)
print(a1.showAccountInfo())
a2 = Account('김철수', '11-12', 1000)
print(a2.showAccountInfo())
print('홍길동 -> 김철수 계좌이체')
try:
a1.transfer(600, a2) # 잔고가 부족하기 때문에 예외 처리
print(a1.showAccountInfo())
print(a2.showAccountInfo())
except InvalidTransactionException as e:
print(e)
manager = BankManager()
manager.addAccount(a1)
manager.addAccount(a2)
print('등록된 모든 계좌 정보 출력')
for a in manager.getAllAccountList():
print(a.showAccountInfo())
print()
print('11-13 계좌 검색')
r = manager.searchAccount('11-13')
if r == None:
print('검색결과 없음')
else:
print(r.showAccountInfo())
from bank import Account, BankManager, InvalidTransactionException
def print_main_menu():
print('--------------------')
print('Welcome to MIMA Bank')
print('--------------------')
print('1. 계좌생성')
print('2. 입금')
print('3. 출금')
print('4. 이체')
print('5. 전체 계좌정보 출력')
print('6. 종료')
manager = BankManager()
manager.readData()
while True:
print_main_menu()
num = input('메뉴 선택:')
if num == '1': # 계좌를 생성하는 로직: 정보 입력 -> Account 객체를 생성 -> 등록
owner = input('계좌주:')
accNo = manager.genAccNo()
balance = int(input('잔액:'))
a1 = Account(owner, accNo, balance)
manager.addAccount(a1)
print(a1.showAccountInfo())
elif num == '2': # 입금 로직: 계좌번호, 입금 금액 입력 -> 계좌 검색 -> 입금
accNo = input('계좌번호:')
amount = int(input('입금 금액:'))
search_account = manager.searchAccount(accNo)
if search_account:
search_account.deposit(amount)
print(search_account.showAccountInfo())
else:
print('계좌번호가 조회되지 않습니다. 다시 입력해주세요')
elif num == '3': # 출금 로직: 계좌번호, 출금 금액 입력 -> 계좌 검색 -> 출금
accNo = input('계좌번호:')
amount = int(input('출금 금액:'))
search_account = manager.searchAccount(accNo)
if search_account:
search_account.withdraw(amount)
print(search_account.showAccountInfo())
else:
print('계좌번호가 조회되지 않습니다. 다시 입력해주세요')
elif num == '4': # 이체 로직: 출금 계좌번호, 입금 계좌번호, 이체 금액 -> 출금, 이체대상 계좌 검색 -> 입금
accNo1 = input('출금 계좌번호:')
accNo2 = input('입금 계좌번호:')
amount = int(input('이체 금액:'))
try:
search_account1 = manager.searchAccount(accNo1)
search_account2 = manager.searchAccount(accNo2)
if search_account1 and search_account2:
search_account1.transfer(amount, search_account2)
print(search_account1.showAccountInfo())
print(search_account2.showAccountInfo())
else:
print('계좌번호가 조회되지 않습니다. 다시 입력해주세요')
except InvalidTransactionException as e:
print(e)
elif num == '5': # 등록된 모든 계좌정보
for a in manager.getAllAccountList():
print(a.showAccountInfo())
elif num == '6':
print('뱅킹 시스템 종료')
manager.saveData()
break