웹개발 수업/JAVA

웹개발_JAVA 11

gugigugi92 2023. 2. 1. 11:39
package bank;
//*은행 프로그램 실습
//
//은행은 3개를 선언한다.
//모든 은행 고객을 관리하는 DB를 2차원 배열로 선언한다.
//모든 은행은 출금, 입금, 잔액조회, 계좌개설, 계좌번호 중복검사, 로그인, 핸드폰 번호 중복검사 서비스가 있다.
//화면쪽 메뉴는 "계좌개설, 입금하기, 출금하기, 잔액조회, 계좌번호 찾기(새로운 계좌발금, 해드폰 번호로 서비스 이용가능), 나가기"로 구성되어 있다.
//
//은행
//   예금주
//   계좌번호(중복 없음)
//   핸드폰번호(중복 없음)
//   비밀번호
//   통장잔고
//
//신한
//   입금 시 수수료 50%
//국민
//   출금 시 수수료 50%
//카카오
//   잔액조회 재산 반토막
//
//은행은 3개를 선언한다.
//모든 은행 고객을 관리하는 DB를 2차원 배열로 선언한다.
//모든 은행은 출금, 입금, 잔액조회, 계좌개설, 계좌번호 중복검사, 로그인(계좌번호, 비밀번호), 핸드폰 번호 중복검사 서비스가 있다.
//화면쪽 메뉴는 "계좌개설, 입금하기, 출금하기, 잔액조회, 계좌번호 찾기(새로운 계좌발급, 핸드폰 번호로 서비스 이용가능), 나가기"로 구성되어 있다.
//계좌번호는 Random클래스를 사용하여 6자리로 설정한다.
//계좌를 개설한 은행에서만 입금 서비스를 이용할 수 있다(instanceof)
//각 은행별 인원 수를 담을 3칸 배열 선언(계좌 개설 시 신규 고객이 들어갈 열 번호)
//각 은행별 객체 3개를 담을 3칸 배열 선언(계좌 개설 시 고객이 선택한 은행 객체)
import java.util.Random;
import java.util.Scanner;

public class ATM {
   public static void main(String[] args) {
      String[] bankNames = {"신한은행", "국민은행", "카카오뱅크"};
      Bank[][] arrBank = new Bank[3][100];
      int[] arCount = new int[3];
      final int ACCOUNT_LENGTH = 6;
      
      String message = "1. 신한은행\n2. 국민은행\n3. 카카오뱅크\n4. 나가기";
      String menu = "1. 계좌개설\n2. 입금하기\n3. 출금하기\n4. 잔액조회\n5. 계좌번호 찾기\n6. 은행 선택 메뉴로 돌아가기";
      Scanner sc = new Scanner(System.in);
      Random random = new Random();
      String account = "", password = null, phoneNumber = null;
      Bank user = null;
      int money = 0;
      
      int i = 0, choice = 0;
      
      
      while(true) { 
         System.out.println(message);
         i = sc.nextInt();
         
         if(i == 4) {break;}
         
         i--;
         
         while(true) {
            Bank[] banks = {new Shinhan(), new Kookmin(), new Kakao()};
            
            System.out.println(menu);
            choice = sc.nextInt();
            
            if(choice == 6) {break;}
            
            switch(choice) {
            case 1: // 계좌개설
               if(arCount[i] == 100) {System.out.println("더 이상 계좌를 개설할 수 없는 은행입니다."); break;}
               
               user = banks[i];
               
               account = "";
               
               while(true) {
   //               계좌번호가 0부터 시작 가능
   //               for (int j = 0; j < ACCOUNT_LENGTH; j++) {
   //                  account += random.nextInt(10);
   //               }
                  
   //               계좌번호가 1부터 시작 가능
   //               100000 ~ 999999 -> 0 ~ 899999
                  account += random.nextInt(900000) + 100000;
                  account = i + 1 + account;
                  
                  if(Bank.checkAccount(arrBank, arCount, account) == null) {
                     break;
                  }
               }
               
               user.setAccount(account);
               
               System.out.print("예금주: ");
               user.setName(sc.next());
               
               while(true) {
                  System.out.print("비밀번호[4자리]: ");
                  password = sc.next();
                  
                  if(password.length() == 4) {break;}
               }
               
               user.setPassword(password);
               
               while(true) {
                  System.out.print("핸드폰 번호['-' 제외]");
                  phoneNumber = sc.next();
                  phoneNumber = phoneNumber.replaceAll("-", "");
                  if(phoneNumber.length() == 11 && Bank.checkPhoneNumber(arrBank, arCount, phoneNumber) == null) {break;}
               }
               
               user.setPhoneNumber(phoneNumber);
               
               arrBank[i][arCount[i]] = user;
               arCount[i]++;
               
               System.out.println(bankNames[i] + ", 환영한다.");
               System.out.println("너의 계좌번호: "+ account);
               
               break;
            case 2: // 입금하기
               System.out.print("계좌번호: ");
               account = sc.next();
               
               System.out.print("비밀번호: ");
               password = sc.next();
               
               // 저장소와 고객수, 입력받은 계좌번호와 비밀번호를 전달하면
               // 로그인 검사를 통해 로그인 성공 시 회원 객체를 전달해준다.
               user = Bank.login(arrBank, arCount, account, password);
               if(user != null) {
                  if(user.getAccount().charAt(0) - 48 == i + 1) {
                     System.out.print("입금액: ");
                     money = sc.nextInt();
                     if(money <= 0) {
                        System.out.println("다시 입력해주세요.");
                        break;
                     }
                     
                     user.deposit(money);
                  }else {
                     System.out.println("개설한 은행에서만 입금이 가능합니다.");
                  }
                  
                  
//                  boolean flag = false;
////                  고객의 은행이 무슨 은행인지, 지금 선택한 은행이 무슨 은행인지
//                  if(user instanceof Shinhan) {
//                     if(i == 0) {
//                        flag = true;
//                     }
//                  }else if(user instanceof Kookmin) {
//                     if(i == 1) {
//                        flag = true;
//                     }
//                  }else {
//                     if(i == 2) {
//                        flag = true;
//                     }
//                  }
//                  if(flag) {
//                     System.out.print("입금액: ");
//                     money = sc.nextInt();
//                     if(money <= 0) {
//                        System.out.println("다시 입력해주세요.");
//                        break;
//                     }
//                     
//                     user.deposit(돈);
//                  }else {
//                     System.out.println("개설한 은행에서만 입금이 가능합니다.");
//                  }
               }
               
               break;
            case 3: // 출금하기
               System.out.print("계좌번호: ");
               account = sc.next();
               
               System.out.print("비밀번호: ");
               password = sc.next();
               
               user = Bank.login(arrBank, arCount, account, password);
               
               if(user != null) {
                  System.out.print("출금액: ");
                  money = sc.nextInt();
                  if(user.getMoney() < (user instanceof Kookmin ? money * 1.5 : money)) {
                     System.out.println("잔액 부족");
                     break;
                  }
                  user.withdraw(money);
               }
               break;
            case 4: // 잔액조회
               System.out.print("계좌번호: ");
               account = sc.next();
               
               System.out.print("비밀번호: ");
               password = sc.next();
               
               user = Bank.login(arrBank, arCount, account, password);
               
               if(user != null) {
                  System.out.println("현재 잔액: " + user.showBalance() + "원");
               }
               
               break;
            case 5: // 계좌번호 찾기
               System.out.print("핸드폰 번호: ");
               phoneNumber = sc.next();
               
               user = Bank.checkPhoneNumber(arrBank, arCount, phoneNumber);
               
               if(user != null) {
                  System.out.print("비밀번호: ");
                  password = sc.next();

                  if(user.getPassword().equals(password)) {
                     
                     while(true) {
         //               계좌번호가 0부터 시작 가능
         //               for (int j = 0; j < ACCOUNT_LENGTH; j++) {
         //                  account += random.nextInt(10);
         //               }
                        
         //               계좌번호가 1부터 시작 가능
         //               100000 ~ 999999 -> 0 ~ 899999
                        account += random.nextInt(900000) + 100000;
                        
                        if(Bank.checkAccount(arrBank, arCount, account) == null) {
                           break;
                        }
                     }
                     user.setAccount(account);
                     System.out.println("다시는 잃어버리지 마세요.");
                     System.out.println("너의 계좌번호: " + account);
                  }
               }
               break;
            }
         }
      }
   }
}

 

package bank;

public class Bank {

   private String name;  // 예금주
   private String account; // 계좌번호
   private String phoneNumber; // 핸드폰번호
   private String password; // 비밀번호
   protected int money; // 통장
   
   public Bank() {;}

   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 getPhoneNumber() {
      return phoneNumber;
   }

   public void setPhoneNumber(String phoneNumber) {
      this.phoneNumber = phoneNumber;
   }

   public String getPassword() {
      return password;
   }

   public void setPassword(String password) {
      this.password = password;
   }

   public int getMoney() {
      return money;
   }

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

//   *static
//   계좌번호 중복검사
   public final static Bank checkAccount(Bank[][] arrBank, int[] arCount, String account) {
	   Bank bank = null;
      
      for (int i = 0; i < arrBank.length; i++) { // 은행 행 
         int j = 0; // j는 아래 포문 밖에서도 써야하기때문에 여기 위치
         for (j = 0; j < arCount[i]; j++) { //고객, 행의 열
            if(arrBank[i][j].getAccount().equals(account)) { // 두개가 같으면
               bank = arrBank[i][j]; //뱅크에 arrBank 정보를 담는다.
               break; // 첫번째 for문 탈출
            }
         }
         if(j != arCount[i]) {// 
            break; // 두번째 for문 탈출
         }
      }
      
      return bank;
   }
   
   
//   핸드폰번호 중복검사
   public final static Bank checkPhoneNumber(Bank[][] arrBank, int[] arCount, String phoneNumber) {
      Bank bank = null;
      
      for (int i = 0; i < arrBank.length; i++) {
         int j = 0;
         for (j = 0; j < arCount[i]; j++) {
            if(arrBank[i][j].getPhoneNumber().equals(phoneNumber)) {
               bank = arrBank[i][j];
               break;
            }
         }
         if(j != arCount[i]) {
            break;
         }
      }
      
      return bank;
   }
   
//   로그인
   public final static Bank login(Bank[][] arrBank, int[] arCount, String account, String password) {
      
	   Bank user = checkAccount(arrBank, arCount, account);
      if(user != null) { // 계좌번호가 존재하는 번호라면
         if(user.password.equals(password)) { // 고객의 패스워드를 가져와라
            return user;
         }
      }
      return null;
   }
   
   
//   *일반
//   입금
   public void deposit(int money) {
      this.money += money;
   }
   
//   출금
   public void withdraw(int money) {
      this.money -= money;
   }
   
//   잔액조회
   public int showBalance() {
      return money;
   }
   
}
package bank;

public class Kakao extends Bank{
   @Override
   public int showBalance() {
      this.money /= 2;
      return super.showBalance();
   }
}
package bank;

public class Shinhan extends Bank{
   @Override
   public void deposit(int money) {
      money *= 0.5;
      super.deposit(money);
   }
}
package bank;

public class Kookmin extends Bank {

   @Override
   public void withdraw(int money) {
      money *= 1.5;
      super.withdraw(money);
   }
   }


추상 클래스

필드 안에 구현이 안된 메소드가 선언되어 있는 클래스를 추상 클래스라고 한다.
이 때 구현되지 않은 메소드를 추상 메소드라고 부른다.
반드시 재정의를 통해 구현을 해야지만 메모리에 할당되기 때문에
"강제성"을 부여하기 위해서 추상 메소드로 선언한다.

추상 클래스 선언
abstract class 클래스명 {
abstract 리턴타입 메소드명(매개변수,....);
일반 메소드 선언가능. 
}

package abstractTest;

public abstract class Electronics {
	public abstract void on();// 추상 메서드
	public abstract void off(); // 추상 메서드
	public void printProduct() {}// 중괄호가 있으면 구현이 된것
	public final void sos() {System.out.println("긴급전화 119 연락");}
}
package abstractTest;

public class Refrigerator extends Electronics {
	@Override
	public void on() {
		
	}
	@Override
	public void off() {
			
	}
}

 

package abstractTest;

public class washingMuchine extends Electronics{
@Override
public void on() {

}
@Override
public void off() {

}
@Override
public void printProduct() {
super.printProduct();
}
}


인터페이스(틀)
추상 클래스를 고도화시킨 문법, 상수와 추상 메소드만 존재한다.
구현은 지정한 클래스에서 진행하고, 인터페이스를 다른 클래스에 지정할 때에는
implements 키워드를 사용한다.

package interfaceTest;

public interface Animal {
	int eyes =2; // final static이 생략된것
	final static int nose = 1; 
	
	void showHands();//abstract 생략
	abstract void sitDwon();
	void touchNose();
	void waitNow();
	void poop();
}