프로그래밍 언어/Python

[Python실습] Banking System

eunnys 2023. 10. 30. 09:43
# 계좌를 관리하는 클래스
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

'프로그래밍 언어 > Python' 카테고리의 다른 글

[Python 실습] Coding Test - 2  (0) 2023.10.30
[Python 실습] Coding Test - 1  (0) 2023.10.30
[Python] 기본 문법  (0) 2023.10.29
[Python] 자료형  (0) 2023.10.29
[Python] 연산자 및 자료형 변환  (0) 2023.10.29