본문 바로가기
실습기록

12월 10일 간단한 은행업무 프로그램

by project100 2023. 12. 10.
// 계좌에 대한 클래스
public class Account {
	private String ano;    // 계좌번호
	private String owner;  // 사용자이름
	private int balance;   // 잔액
	
	
	// 필드 값을 초기화하는 생성자(private)
	private Account(String ano, String owner, int balance) {
		this.ano = ano;
		this.owner = owner;
		this.balance = balance;
	}
	
	// 생성자에 대한 정적 메소드 구현
	public static Account AccountMethod(String ano, String owner, int balance) {
		return new Account(ano, owner, balance);
	}
	
	// 메소드(getter/setter) : public
	public String getAno() {
		return ano;
	}
	public void setAno(String ano) {
		this.ano = ano;
	}
	public String getOwner() {
		return owner;
	}
	public void setOwner(String owner) {
		this.owner = owner;
	}
	public int getBalance() {
		return balance;
	}
	public void setBalance(int balance) {
		this.balance = balance;
	}

	@Override
	public String toString() {
		return "계좌상세내역 [계좌번호=" + ano + ", 사용자 이름 =" + owner + ", 잔액 =" + balance + "]";
	}
}
// 계좌를 생성할 때 발생할 수 있는 사용자 예외 처리 클래스
public class AccountException extends Exception {
	
	// 수업 때 만들었던 사용자 예외 처리 클래스 만드는 방법과 동일
    public AccountException() {
        super();
    }

    public AccountException(String message) {
        super(message);
    }
}
import java.util.InputMismatchException;
import java.util.Scanner;

public class MainApplication {

	private static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		BankApplication bankApp = new BankApplication();
		int selectNo;
		boolean isRun = true;
		while (isRun) {
			bankApp.MenuInfo();
			try {
				selectNo = bankApp.getSelect(sc.nextInt());
				isRun = bankApp.getMenu(selectNo);
			} catch (InputMismatchException e) {
				System.out.println("잘못된 선택입니다.");
				sc.nextLine();
			} catch (AccountException e) {
				System.out.println(e.getMessage());
			}
		}
	}
}
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

// 은행업무를 수행할 클래스
// 계좌 생성, 입금, 출금 가능
public class BankApplication {

	private static List<Account> accounts = new ArrayList(); // 계정에 대한 리스트
	private static Scanner sc = new Scanner(System.in);

	// 메뉴를 선택할 때 발생할 예외 처리를 포함해 구현
	public int getSelect(int number) throws AccountException {
		// 1~5번이 아닌 경우
		if (number < 1 || number > 5) {
			throw new AccountException("해당 메뉴는 없습니다.");
		}
		return number;
	}

	// 계좌를 생성 시 계좌 번호가 같은 경우에 대한 예외 처리를 구현
	public void ExistAnoException(Account ac, String ano) throws AccountException {
		for (Account account : accounts) {
			if (account != null && account.getAno().equals(ano)) {
				throw new AccountException("같은 계좌번호가 이미 존재합니다.");
			}
		}
	}

	// 예금 또는 출금 시 금액이 부족한 상황이거나 음수 입력 시에 대한 예외처리를 진행
	// op : true(예금) / false(출금)
	public void BalanceException(Account ac, int money, boolean op) throws AccountException {
		if(money < 0) {
			throw new AccountException("잘못된 금액입니다.");
		}
		if (!op && ac.getBalance() < money) {
			throw new AccountException("잔액이 부족합니다.");
		}
	}

	private Account findAccount(String accountNumber) {
		for (Account account : accounts) {
			if (account.getAno().equals(accountNumber)) {
				return account;
			}
		}
		return null;
	}

	// 메뉴들에 대한 출력을 진행할 메소드를 자유롭게 구현
	public void MenuInfo() {

		System.out.println("=== 메뉴 ===");
		System.out.println("1. 계좌생성");
		System.out.println("2. 계좌목록");
		System.out.println("3. 에금처리");
		System.out.println("4. 출금처리");
		System.out.println("5. 어플종료");
		System.out.print("메뉴를 선택하세요>>");
	}

	// 메뉴를 선택하는 메소드
	public boolean getMenu(int number) {
		switch (number) {
		case 1: 
			Create();
			break;
		case 2:
			List();
			break;
		case 3:
			Deposit();
			break;
		case 4:
			Withdraw();
			break;
		case 5:
			Exit();
			return false;
			default:
				System.out.println("유효하지 않은 메뉴입니다. 다시 선택하세요.");
		}
		return true;
	}
	private void Create() {
		try {
			System.out.print("계좌번호를 입력하세요: ");
			String ano = sc.next();
			System.out.print("사용자이름을 입력하세요: ");
			String owner = sc.next();
			System.out.print("초기 잔액을 입력하세요: ");
			int balance = sc.nextInt();

			Account newAccount = Account.AccountMethod(ano, owner, balance);
			ExistAnoException(newAccount, ano);
			accounts.add(newAccount);
			System.out.println("계좌가 생성되었습니다.");
			System.out.println("계좌 정보: " + newAccount);
		} catch (InputMismatchException e) {
			System.out.println("잘못된 입력입니다.");
			sc.nextLine();
		} catch (AccountException e) {
			System.out.println(e.getMessage());
		}
	}
	private void List() {
		for (int i = 0; i < accounts.size(); i++) {
			System.out.println(accounts.get(i));
		}
	}
	private void Deposit() {
		try {
			System.out.print("계좌번호를 입력하세요: ");
			String depositAno = sc.next();
			System.out.print("예금할 금액을 입력하세요: ");
			int depositAmount = sc.nextInt();
			Account depositAccount = findAccount(depositAno);
			BalanceException(depositAccount, depositAmount, true);
			depositAccount.setBalance(depositAccount.getBalance() + depositAmount);
			System.out.println("예금이 완료되었습니다. 현재 잔액: " + depositAccount.getBalance());
		} catch (InputMismatchException e) {
			System.out.println("잘못된 입력입니다.");
			sc.nextLine();
		} catch (AccountException e) {
			System.out.println(e.getMessage());
		}
	}
	private void Withdraw() {
		try {
			System.out.print("계좌번호를 입력하세요: ");
			String withdrawAno = sc.next();
			Account withdrawAccount = findAccount(withdrawAno);
			if (withdrawAccount == null) {
				System.out.println("해당하는 계좌가 존재하지 않습니다.");
				return;
			}

			System.out.print("출금할 금액을 입력하세요: ");
			int withdrawAmount = sc.nextInt();
			BalanceException(withdrawAccount, withdrawAmount, false);

			if (withdrawAccount.getBalance() >= withdrawAmount) {
				withdrawAccount.setBalance(withdrawAccount.getBalance() - withdrawAmount);
				System.out.println("출금이 완료되었습니다. 현재 잔액: " + withdrawAccount.getBalance());
			} else {
				System.out.println("잔액이 부족합니다. 출금이 취소됩니다.");
			}
		} catch (InputMismatchException e) {
			System.out.println("잘못된 입력입니다.");
			sc.nextLine();
		} catch (AccountException e) {
			System.out.println(e.getMessage());
		}
	}
	private void Exit() {
		System.out.println("프로그램을 종료합니다.");
	}
}