⚙️ Backend/JAVA
JAVA1 - Bank 은행 프로그램 예제 풀이
반응형
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();
}
}
반응형
'⚙️ Backend > JAVA' 카테고리의 다른 글
JAVA - 예외처리, API, 인터페이스, 오브젝트 클래스, (0) | 2021.01.25 |
---|---|
개발 용어 - 라이브러리, 프레임 워크, 아키텍처, 플랫폼 이란? (0) | 2021.01.25 |
JAVA (자바) - 람다식, 타겟 타입과 함수적 인터페이스 (0) | 2020.12.14 |
JAVA (자바) - 람다식 기본 문법(2) (0) | 2020.12.14 |
JAVA(자바) - 람다식이란? (0) | 2020.12.14 |
댓글