웹개발 수업/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();
}