⚙️ Backend/JAVA

JAVA1 - Bank 은행 프로그램 예제 풀이

코너(Corner) 2021. 1. 22.
반응형

JAVA1 - Bank 은행 예제 풀이 

 

메소드, 클래스, 상속, 배열, 랜덤 함수를 사용한다.

 

국민은행, 우리은행, 신한은행 클래스가 있으며 이를 담는 상위 클래스 Bank클래스

사용자가 사용하는 ATM 클래스가 있다.

 


ATM클래스

package bank;

import java.util.Random;
import java.util.Scanner;

public class ATM {
	public static void main(String[] args) {
		// 각 은행별로 최대 100명의 고객을 유치할 수 있다.
		String msg = "1.신한은행\n2.국민은행\n3.우리은행\n4.나가기";
		String menu = "1.계좌 개설\n2.입금하기\n3.출금하기\n4.잔액조회\n5.계좌번호 찾기\n6.나가기";

		// 고객의 은행 번호로 은행 이름을 알아내기 위한 배열
		String[] bankName = { "신한은행", "국민은행", "우리은행" };

		Scanner sc = new Scanner(System.in);
		Random r = new Random();

		// 임시 저장 공간
		String name="",  pw = "", account = "",   phone = "";
		
		// 검사한 객체를 담을 저장공간
		Bank user = null;
		
		int choice = 0, menu_choice = 0;
		while(true) {
			System.out.println(msg);
			choice = sc.nextInt();
			
			if(choice == 4 ) { break; }
			// 사용자가 선택한 은행번호가 choice - 1 이므로 1 빼준다.
			choice--;
			
			while(true) {
				System.out.println(menu);
				menu_choice = sc.nextInt();
				// 엔터 먹기
				sc.nextLine();
				
				// 나가기
				if(menu_choice == 6 ) {System.out.println("프로그램 종료합니다."); break;}
				switch (menu_choice) {
				// 계좌 개설
				case 1:
						/* 
					계좌 개설시 어떤 은행을 선택했는지는 알지만, 각 은행객체는 규칙성이 
					 없기 때문에  규칙성을 부여하고자 배열에 달아준다.
					 */
					Bank[] arBank = {new Shinhan(), new Kookmin(), new Woori()};
					while(true) {
						// 새로운 회원의 랜덤한 계좌번호를 account에 담아준다.
						account = "" + (r.nextInt(90000) + 10000 );
						// 만약 존재하지 않는 계좌번호라면 탈출한다.
						// 중복이 있다면 없을 때까지 무한반복
						if(Bank.checkDup(account) == null ) break;
					}
					// 위의 반복문을 탈출했다면 acc에는 중복이 없는 계좌번호가 담겨있다.
					// 해당 은행 객체는 계좌번호 및 정보를 넣어준다.
					arBank[choice].account = account;
					
					System.out.print("예금주 : " );
					arBank[choice].name = sc.next();
					
					while(true) {
						int i = 0;
						System.out.print("핸드폰 번호 [  '-' 제외 ] : ");
						phone = sc.next();
						for(i = 0 ; i <phone.length(); i++ ) {
							//숫자를 제외한 문자가 포함되어 있으면 
							// 숫자만 입력할 때까지 무한 반복
							
							// 사용자가 입력한 각 문자가 '0'보다 작거나 '9'보다 크면 종료 
							if (phone.charAt(i) < 48 || phone.charAt(i) > 57) {
								break;
							}
						}
						// 위의 for문에서 강제로 break를 만나서 탈출한다면 i는 phone.length() 까지 
						// 절대로 증가할 수 없다. 따라서 정상적으로 증가하여 i가 phone.length()가 되었다면 
						// 사용자가 핸드폰번호를 특수문자 없이 잘 입력했다는 뜻이다. 
						if (i == phone.length()) {
							// 사용자가 입력한 폰번호가 중복이 없다면 탈출 
							if(Bank.checkPhone(phone)==null) break;
							else System.out.println("이미 존재하는 번호 입니다.");
						}
					}
					
					// 핸드폰 번호를 정상적으로 입력했을 때 올 수 있는 영역
					arBank[choice].phone = phone;
					while(true) {
						System.out.print("비밀번호 4자리 : ");
						pw=sc.next();
						// 사용자가 입력한 비번 4자리가 아니면 무한반복
						if(pw.length() == 4 ) { break; }
					}
					
					arBank[choice].pw = pw;
					// 사용자가 선택한 은행(행 : choice)에 arCnt[choice]번째 고객으로 신규고객arBank[choice]저장
					Bank.arrBank[choice][Bank.arCnt[choice]] = arBank[choice];
					System.out.println("내 계좌번호 : "+account);
					// 사용자가 선택한 은행의 고객수 1증가
					Bank.arCnt[choice]++;
					break;
					
					// 입금하기
				case 2 : 
					System.out.print("계좌번호 : ");
					account = sc.next();
					System.out.print("비밀번호 : ");
					pw = sc.next();
					
					// 로그인 성공시 객체 리턴. 실패시 null 리턴
					user = Bank.login(account, pw);
					//입금시 타행에서 입금 할 수 없음, 고객의 은행 번호와 현재 이용중인 은행번호가 일치하지 않으면 
					// 사용자에게 안내 메시지 출력
					if ( Bank.bank_num != choice ) {
						System.out.println(bankName[Bank.bank_num] + "에서 처리 가능합니다.");
						continue;
					}
					// 로그인 성공시 참 
					if (user != null ) {
						System.out.print("입금액 : ");
						// 해당 객체가 Bank의 자식 객체면 재정의된 메소드로 실행된다.
						user.deposit(sc.nextInt());
						System.out.println("잔고 : "+user.money);
					} else { System.out.println("입금 실패 : 정보 오류"); }
					break;
					
					// 출금하기 
				case 3 : 
					System.out.print("계좌번호 : ");
					account = sc.next();
					System.out.print("비밀번호 : ");
					pw = sc.next();
					
					user = Bank.login(account, pw);
							if(user != null ) {
								System.out.print("출금액 : ");
								if (user.withdraw(sc.nextInt())) {
									System.out.println("잔고 : "+user.money);
								} else {	System.out.println("출금 실패 : 잔액 부족");
								}
							} else System.out.println("출금 실패 : 정보 오류 ");
						break;
					// 잔액조회
				case 4 :
					System.out.print("계좌번호 : ");
					account = sc.next();
					System.out.print("비밀번호 : ");
					pw = sc.next();
					user = Bank.login(account, pw);
					if(user != null ) user.show();
					else System.out.println("조회 실패 : 정보 오류 ");
					break;
					
					// 계좌번호 찾기
				case 5 :
					System.out.print("계좌 개설시 등록한 핸드폰 번호 : ");
					phone = sc.nextLine();
					user = Bank.checkPhone(phone);
					if ( user != null ) {
						// 사용자의 은행과 일치하는 은행에서만 계좌번호를 찾을 수 있다. 
						if(Bank.bank_num != choice) {
							System.out.println(bankName[Bank.bank_num] +" 에서 처리 가능합니다.");
							continue;
						}
						System.out.print("비밀번호 : ");
						pw = sc.nextLine();
						
						//만약 핸드폰번호와 비밀번호가 일치하면 중복되지 않는 새로운 계좌번호를 생성해준다.
						if(user.pw.equals(pw)) {
							while(true) {
								account = "" + (r.nextInt(90000)+10000);
								if(Bank.checkDup(account) == null ) {break;}
							}
							user.account = account;
							System.out.println(user.name+"님의 새로운 계좌번호 : "+account);
						} else { System.out.println(" ** 정보 오류 ** "); }
					}
					break;
				}
			}
		}
	}
}

BANK 클래스

package bank;

public class Bank {
	
	// 모든 Bank객체에서 공유하는 static 변수 (클래스 변수)
	static Bank[][] arrBank = new Bank[3][100]; // 각 3개의 은행에서 은행별 고객수 100명
	static int[] arCnt = new int[arrBank.length]; // 각 은행별 고객수 만큼
	// 객체
	// 돈
	int money;
	String name;
	String account;
	String phone;
	String pw;

	// 검색된 객체의 은행번호 
	// 은행이 3개이기 때문에 들어갈 수 있는 번호는 0~2이다. (0,1,2)
	static int bank_num = -1;
	public Bank() {	}

	// 중복검사
	static Bank checkDup(String account) {
		// 외부에서 계좌번호를 전달받고 전체 사용자의 계좌번호와 비교한다.
		// 중복이 없다면 b에 null이 담기고, 중복이 있다면 해당 객체가 b에 담긴다.
		Bank b = null;
		// 이전 bank_num을 초기화 
		bank_num = -1;
		
		for(int i = 0; i < arrBank.length; i++ ) {
			// 은행 갯수 만큼 반복
			for(int j = 0; j < arCnt[i]; j++ ) {
				if(arrBank[i][j].account.equals(account)) {
					// 각 고객의 계좌번호와 외부에서 전달된 계좌번호 비교 
					// 이미 있는 계좌번호라면 이 영역으로 들어옴 
					
					// 검색된 고객의 은행 번호 bank_num에 저장
					bank_num = i;
					
					// 검색된 객체 b에 저장
					b = arrBank[i][j];
					
					// 계좌번호는 중복이 없으므로 더 이상 반복할 필요가 없다. 
					break;
				}
			}
		}
		return b;
	}
	
	// 핸드폰번호 검사
	static Bank checkPhone(String phone) {
		// 위의 중복검사와 기능은 똑같다. accoun를 phone으로만 변경함
		Bank b = null;
		bank_num =-1;
		for(int i =0; i<arrBank.length; i++ ) {
			for(int j = 0; j < arCnt[i]; j++ ) {
				if(arrBank[i][j].phone.equals(phone)) {
					bank_num = i;
					b = arrBank[i][j];
					break;
				}
			}
		}
		return b;
	}
	// 로그인
	static Bank login(String account, String pw) {
		// 외부에서 전달한 계좌번호와 비번 중 
		// 계좌번호 먼저 checkDup(String account)에 전달하고 b에 null이 담겼다면 없는 계좌번호라는 뜻
		Bank b = checkDup(account);
		if(b != null ) {
			// 계좌번호를 찾았다면 해당 객체의 비번과 외부에서 전달된 비번 비교 
			if(!b.pw.equals(pw)) b = null; // 비번이 일치하지 않으면 b에 다시 null이 담긴다.
		}
		// 계좌번호와 비번이 일치하면 b 객체에는 해당 객체가 담겨 있다.
		// 그 외 모든 상황에서는 null 이 담겨있다.
		return b;
	}
	
	// 메소드
	// 입금 , 출금, 잔액조회
	void deposit(int bal) { // 입금
		if (bal < 1) {
			throw new ArithmeticException();
		}
		money += bal;
	}

	boolean withdraw(int bal) { // 출금
		boolean check = false;
		if (!(this.money - bal < 0)) {
			this.money -= bal;
			check = true;
		}
		return check;
	}

	void show() { // 잔액조회
		System.out.println("-------------잔액 조회-------------");
		System.out.println("현재 통장 잔액은 " + this.money + "원 입니다.");
		System.out.println("-------------END----------------");
	}

	public static void main(String[] args) {
// 확인
		Bank bk = new Bank();
		try {
			bk.deposit(0);
		} catch (ArithmeticException e) {
			System.out.println("입금하려는 금액이 1보다 작을 수 없습니다.");
		}
		bk.show();

		try {
			bk.withdraw(15000);
			System.out.println(bk.money + "원이 남았습니다.");
		} catch (ArithmeticException e) {
			System.out.println("출금 잔액이 부족합니다.");
		}
		bk.show();

	}
}

 

kookmin class

package bank;

public class Kookmin extends Bank {
 
	public Kookmin() {
		
	}
	// 입금시 수수료 50%
	@Override
	void deposit(int money) {
		money *= 0.5;
		super.deposit(money);
		
	}
	
}

Shinhan Class

package bank;

public class Shinhan extends Bank {
	public Shinhan() {
		// TODO Auto-generated constructor stub
	}
	
	// 출금시 수수료 50%
	@Override
	boolean withdraw(int money) {
//		boolean check = false;
//		if(this.money >= money *1.5 ) {
//			this.money -= money * 1.5;
//			check = true;
//		}
		// 출금 수수료가 50%이기 때문에 출금할 금액에 1.5배를 부모의 withdraw로 전달한다.
		money *= 1.5;
		return super.withdraw(money);
	}
	
	
}

Woori Class

package bank;

public class Woori extends Bank{
	public Woori() {
		// TODO Auto-generated constructor stub
	}
	// 잔액 조회시 재산 반토막
	@Override
	void show() {
		this.money *= 0.5;
		 super.show();
	}
}
반응형

댓글