웹_프론트_백엔드/단과

[단과_JAVA] 2020.02.18

shine94 2020. 2. 18. 22:53

1. instanceof
 : 객체의 타입 비교 
   객체 instanceof 클래스타입
   
   "안녕" instanceof String  : true
   10 instanceof Double      : false 
   user instanceof Shinhan  : true  --> 신한은행 객체

package objCompare;

public class Obj {
	public static void main(String[] args) {
		System.out.println("안녕" instanceof String);
		System.out.println(new Double(10.58) instanceof Double);
	}
}

   

 

2. 오늘 실습코드
1) 은행!
** ATM 메인메소드 **

package day25;

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

public class ATM {
	public static void main(String[] args) {

		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 = "", temp = "", 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) {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;}
					}
					//위의 반복문을 탈출했다면 account에는 중복이 없는 계좌번호가 담겨있다.
					//해당 은행 객체에 계좌번호 및 정보를 넣어준다.
					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);
					System.out.println("계좌번호는 반드시 기억하세요!");
					//사용자가 선택한 은행의 고객 수 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("입금액 : ");
						/*if(user instanceof Shinhan) {
							Shinhan s = (Shinhan) user;
						}*/
						
						//해당 객체가 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.balance();
					}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 day25;

public class Bank {
	
	//모든 Bank객체에서 공유하는 static변수(클래스 변수)
	static Bank[][] arrBank = new Bank[3][100];	//3개의 은행, 은행별 고객수는 100명
	static int[] arCnt = new int[arrBank.length];	//각 은행별 고객수
	
	String name;
	String account;
	String phone;
	String pw;
	int money;
	
	//검색된 객체의 은행번호
	//은행이 3개이기 때문에 들어갈 수 있는 번호는 0~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; 
					break;
				}
			}
		}
		return b;
	}
	
	//핸드폰번호 검사
	static Bank checkPhone(String phone) {
		//위의 중복검사와 기능은 똑같다. account를 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 money) {
		//객체 돈에 입금액 넣기
		this.money += money;
	}
	//출금
	boolean withdraw(int money) {
		boolean check = false;
		if(!(this.money - money < 0)) {
			//잔액이 부족하지 않다면 출금 가능
			this.money -= money;
			check = true;
		}
		return check;
	}
	//잔액조회
	void balance() {
		System.out.println("계좌번호 : " + this.account);
		System.out.println("예금주 : " + this.name);
		System.out.println("현재 잔액 : " + this.money + "원");
	}
}


** Shinhan 클래스 **

package day25;

public class Shinhan extends Bank{
	//입금시 수수료 10%
	@Override
	void deposit(int money) {
		this.money += money * 0.9;
	}
}


** Kookmin 클래스 **

package day25;

public class Kookmin extends Bank{
	//출금시 수수료 50%
	@Override
	 boolean withdraw(int money) {
		boolean check = false;
		if(this.money >= money * 1.5) {
			this.money -= money * 1.5;
			check = true;
		}
		return check;
	}
}


** Woori 클래스 **

package day25;

public class Woori extends Bank{
	//잔액 조회시 재산 반토막
	@Override
	void balance() {
		super.balance();
		this.money *= 0.5;
	}
}

'웹_프론트_백엔드 > 단과' 카테고리의 다른 글

[단과_JAVA] 2020.02.19  (0) 2020.02.19
[단과_C] 2020.02.18  (0) 2020.02.19
[단과_C] 2020.02.17  (0) 2020.02.17
[단과_JAVA] 2020.02.17  (0) 2020.02.17
[단과_C] 2020.02.14  (0) 2020.02.15