본문 바로가기

웹 개발/Java

[Web_JAVA] 21

실습(정리)

- 은행 프로그램

1. 부모 클래스(Bank.java) 작성하기

※ 작성 위치

package bank; 

public class Bank {
    // 작성
}

 

 

- 필요한 변수 선언하기

// 모든 은행의 고객을 관리하는 DB
// ex) 3곳의 은행별로 100명의 회원이 존재한다.
// 다른 은행의 정보도 공유해야한다.(ex - 블록체인)
// 그러므로 정적변수를 사용해야 한다.(객체 간 공유)
public static Bank[][] banks = new Bank[3][100];
 
// 각 은행 별 고객 수
// 길동 - n명, 신한 - n명, 국민 - n명 이므로 일차원 배열을 사용한다.
public static int[] arCount = new int[banks.length];

// 예금주, 계좌번호, 핸드폰번호, 비밀번호, 잔액
// 접근자는 private으로 설정
private String name;
private String account;
private String phone;
private String pw;
private int money;

 

 

※ 생성자 생성하기

// 기본 생성자
public Bank() {;}

// 초기화 생성자
public Bank(String name, String account, String phone, String pw, int money) {
	super();
	this.name = name;
	this.account = account;
	this.phone = phone;
	this.pw = pw;
	this.money = money; 
}

 

 

※ getter, setter

public String getName() {
	return name;
}

public void setName(String name) {
	this.name = name;
} 

public String getAccount() {
	return account;
}

public void setAccount(String account) {
	this.account = account;
}

public String getPhone() {
	return phone;
}

public void setPhone(String phone) {
	this.phone = phone;
}

public String getPw() {
	return pw;
}

public void setPw(String pw) {
	this.pw = pw;
}

public int getMoney() {
	return money;
}

public void setMoney(int money) {
	this.money = money;
}

 

 

- 입금하기

public void deposit(int money) {
	this.money += money; 
}

 

 

- 출금하기

public void whithdraw(int money) {
	this.money -= money;
}

 

 

- 잔액조회

public int getBalance() {
    return this.money;
}

 

 

- 계좌번호 중복 검사

public static Bank checkAccount(String account) {
	Bank user = null;
	for (int i = 0; i < banks.length; i++) {
		int j = 0;
		 
		// arCount[i] : i번째에 있는 고객의 수만큼 반복한다.(i : 은행 수)
		for (j = 0; j < arCount[i]; j++) {
			
			// if문에 들어왔다면 어떤 고객인지 알고 있다는 의미이다.
			if(banks[i][j].account.equals(account)) {
				user = banks[i][j];  // 고객 정보를 user 변수에 담아준다.
				break;  // 찾으면 종료한다.(if문을 감싸고 있는 for문만 종료된다.)
			}
		}
		if(j != arCount[i]) {break;}  // 제일 바깥의 for문도 종료시킨다.
	}
	return user;
}

 

 

- 핸드폰 중복 검사

public static Bank checkPhone(String phone) {
	Bank user = null;
	for (int i = 0; i < banks.length; i++) {
		int j = 0;
		for (j = 0; j < arCount[i]; j++) {
			if(banks[i][j].phone.equals(phone)) {
				user = banks[i][j];
				break;
			}
		}
		if(j != arCount[i]) {break;}
	}
	return user; 
}

 

 

- 로그인(계좌번호, 비밀번호)

※ 계좌번호만으로 은행을 알 수 있는 프로그램으로 작성하기 때문에 은행 정보는 입력할 필요가 없다.

public static Bank login(String account, String pw) {
	Bank user = checkAccount(account);
	if(user != null) {
		if(user.pw.equals(pw)) {
			return user;
		}
	}
	return null;
}

 

 

 

2. 자식 클래스 작성하기

- Kookmin.java

package bank;

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

 

 

- Gildong.java

package bank;

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

 

 

- Shinhan.java

package bank;

public class Shinhan extends Bank{
	
	// 잔액 조회 시 재산 절반 감소
	@Override
	public int getBalance() {
		this.setMoney(this.getMoney() / 2); 
		return super.getBalance();
	}
	 
}

 

 

 

3. ATM.java에서 실행하기

- 필요한 변수 선언

String msg = "1. 길동은행\n2. 국민은행\n3. 신한은행\n4. 나가기";
String menu = "1. 계좌개설\n2. 입금하기\n3. 출금하기\n4. 잔액조회\n5. 계좌번호 찾기\n6. 은행 선택";

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

int bankNum = 0;  // msg 선택
int choice = 0;  // menu 선택
int lengthOfAccount = 0;  // 계좌번호 길이를 담아줄 변수

String account = "";  // 문자열을 연결하기 위해 ""로 초기화
String name = null;
String phone = null;
String pw = null;
int money = 0;

boolean condition1 = false;
boolean condition2 = false;

 

 

- 반복문 진행

// menu에서 6을 선택하기 전까지는 반복문을 벗어나면 안된다.(= while문이 2개 필요하다.)
while(true) {
	System.out.println(msg);
	bankNum = sc.nextInt();
	if(bankNum == 4) {break;}  // msg 반복문 종료
	
	while(true) {
		System.out.println(menu); 
		choice = sc.nextInt();
		if(choice == 6) {break;}  // menu 반복문 종료

		.........

	}

}

 

 

- 계좌개설

switch(choice) {
	case 1:
		// 6자리 랜덤 계좌번호(000000 ~ 999999)
		// 기존 고객의 계좌번호화 중복이 없는 번호로 개설해야 한다.
		// 1번 선택 시 매번 초기화되어야 한다.

		Bank[] arBank = {new Gildong(), new Kookmin(), new Shinhan()};  // 은행
		user = arBank[bankNum - 1];
		
		// 계좌번호 생성 후 중복 확인이므로 do~while문을 사용한다.
		do {  // 계좌번호 생성 및 중복검사
			account = "";  // 이전의 계좌번호에 누적되지 않게 하기 위해 매번 초기화를 진행한다.
			account += r.nextInt(1000000);
					
			lengthOfAccount = 6 - account.length();

			for (int i = 0; i < lengthOfAccount; i++) {
				account = "0" + account;  // ex) account가 3이면 앞에 0을 3번 붙여준다.(000333)
			}
			
		} while(Bank.checkAccount(account) != null);   // 중복되는 계좌번호가 없다면
		
		System.out.print("예금주 : ");
		name = sc.next();
		
		// 핸드폰번호를 입력받은 후 중복 확인이므로 do~while문을 사용한다.
		do {  // 핸드폰번호 입력받기 및 중복검사
			condition1 = false;
			condition2 = false;  // 이전의 상태를 초기화하기 위해 do~while문 안에서 false로 초기화해준다.

			System.out.println("핸드폰 번호를 입력해주세요\n예)01012345678");
			phone = sc.next();
			
			// 입력한 핸드폰 번호가 11자리가 아닐 때 true
			condition1 = phone.length() != 11;
			
			for (int i = 0; i < phone.length() && !condition2; i++) {
				
				// 각각의 문자를 정수로 변환
				int num = phone.charAt(i) - 48;  // ex) 0은 48번 이기 때문에 정수로 바꾸려면 48을 빼준다.
				
				// num이 0~9 범위가 아닐 때 true
				condition2 = num < 0 || num > 9;  // condition2이 true이면 for문 탈출
		
			}
			
		} while (condition1 || condition2 || Bank.checkPhone(phone) != null);
		
		// 비밀번호를 입력받은 후 확인이므로 do~while문을 사용한다.
		do {  // 비밀번호 생성
			System.out.print("비밀번호 : ");
			pw = sc.next();
			condition1 = pw.length() != 4;  // pw는 4자리로 설정했기 때문
			
			for (int i = 0; i < pw.length() && !condition2; i++) {
				int num = pw.charAt(i) - 48;
				condition2 = num < 0 || num > 9;
			}
			
		} while (condition1 || condition2);
		
		// 생성된 정보를 담아준다.
		user.setAccount(account);
		user.setName(name);
		user.setPhone(phone);
		user.setPw(pw);
		
		Bank.banks[bankNum - 1][Bank.arCount[bankNum - 1]] = user;  // 계좌를 개설한 고객의 정보를 담아준다.
		Bank.arCount[bankNum - 1]++;  // 계좌 개설 후 해당 은행의 고객 수를 증가시킨다.
		
		System.out.println("계좌 개설 완료");
		System.out.println(name + "님의 계좌번호 : " + account);
		System.out.println("※ 계좌번호는 다시 알려드리기 어렵습니다.\n분실 시 계좌번호가 변경되오니 참고해주세요.");
		
		// [테스트] 가입된 고객의 이름 출력
//		for (int i = 0; i < Bank.arCount[bankNum - 1]; i++) {
//			System.out.println(Bank.banks[bankNum - 1][i].getName());
//		}
		break;
  		........
}

 

결과(계좌개설)
 

 

- 입금하기

switch(choice) { 
	case 1:
		........
	case 2:  // 입금하기
		System.out.print("계좌번호 : ");
        account = sc.next();
        
        System.out.print("비밀번호 : ");
        pw = sc.next();
        
        user = Bank.login(account, pw);
        
        if(user != null) { //로그인 성공
           System.out.print("입금액 : ");
           money = sc.nextInt();
           
           if(money <= 0) {
              System.out.println("다시 시도해주세요");
              continue;
           }
           
           user.deposit(money);  // 입금하기 메소드
           System.out.println(user.getName() + "님의 현재 잔액 : " + user.getMoney() + "원");
           break;
        }
        System.out.println("계좌번호 또는 비밀번호를 다시 확인해주세요.");
        break;
		........
}

 

결과(길동은행 - 입금하기)

 

 

- 출금하기

switch(choice) {
	case 1: 
		........
	case 2:
		........
	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("출금액 : ");
	        money = sc.nextInt();
		               
	        if(money <= 0) {
	            System.out.println("다시 시도해주세요");
	            continue;
		    }
		               
		    if(user.getMoney() < money * (bankNum == 2 ? 1.5 : 1.0)) {  // bankNum == 2 : 출금 시 수수료 50%인 은행
	            System.out.println("잔액이 부족합니다.");
	            continue;
		    }
		               
		    user.withdraw(money);  // 출금하기 메소드
		    System.out.println(user.getName() + "님의 현재 잔액 : " + user.getMoney() + "원");
		    break;
	    }
	    System.out.println("계좌번호 또는 비밀번호를 다시 확인해주세요.");
	    break;
		........
}

 

결과(국민은행 - 출금하기)

 

 

- 잔액조회

switch(choice) {
	case 1:
		........
	case 2:
		........
	case 3:
		........ 
	case 4:
		System.out.print("계좌번호 : ");
		account = sc.next();
		            
		System.out.print("비밀번호 : ");
		pw = sc.next();
		            
		user = Bank.login(account, pw);  // 로그인 메소드
		            
		if(user != null) { //로그인 성공
			System.out.println(user.getName() + "님의 현재 잔액 : " + user.getBalance() + "원");
			break;
		}
		System.out.println("계좌번호 또는 비밀번호를 다시 확인해주세요.");
		break;
		........
}

 

결과(신한은행 - 잔액조회)

 

 

- 계좌번호 찾기

switch(choice) { 
	case 1:
		........
	case 2:
		........
	case 3:
		........
	case 4:
		........
	case 5:
		System.out.print("핸드폰 번호 : ");
		phone = sc.next();
		            
		System.out.print("비밀번호 : ");
		pw = sc.next();
		            
		user = Bank.checkPhone(phone);  // 핸드폰번호 일치 확인
		if(user.getPw().equals(pw)) {  // 일치한다면
		
			// 계좌번호 새로 생성
			do {
				account = "";
				account += r.nextInt(1000000);
		
				lengthOfAccount = 6 - account.length();
		                  
				for (int i = 0; i < lengthOfAccount; i++) {
					account = "0" + account;
				}
		                  
			} while(Bank.checkAccount(account) != null);
		               
			user.setAccount(account);  // 새로 생성한 계좌번호를 해당 고객의 계좌번호로 변경(저장)한다.
			System.out.println("*********계좌 변경 완료*********");
			System.out.println(user.getName() + "님의 계좌번호 : " + account);
			System.out.println("※ 계좌번호는 다시 알려드리기 어렵습니다.\n분실 시 계좌번호가 변경되오니 참고해주세요.");
			break;
		}
		System.out.println("계좌번호 또는 비밀번호를 다시 확인해주세요.");
		break;
		........
}

 

결과(계좌번호 찾기)

 

 

 

'웹 개발 > Java' 카테고리의 다른 글

[Web_JAVA] 23  (0) 2022.03.09
[Web_JAVA] 22  (0) 2022.03.08
[Web_JAVA] 20  (0) 2022.03.06
[Web_JAVA] 19  (0) 2022.03.05
[Web_JAVA] 18  (0) 2022.03.04