실습(정리)
- 은행 프로그램
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;
........
}
![](https://blog.kakaocdn.net/dn/bvVswC/btrvbe3glJA/ocOYHFYABm78MCizvpTAXK/img.png)
- 입금하기
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;
........
}
![](https://blog.kakaocdn.net/dn/cmd8ZZ/btrvqjCr4lR/a0IJYzlrbvql0k5aHZBau1/img.png)
- 출금하기
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;
........
}
![](https://blog.kakaocdn.net/dn/2yshE/btrvqax85Ui/eJR65E7gJ7kuLgspe5xLd1/img.png)
- 잔액조회
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;
........
}
![](https://blog.kakaocdn.net/dn/STEGB/btrvpaZ8hdx/kiYaIkz9QkhKIVeztSC5p0/img.png)
- 계좌번호 찾기
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;
........
}
![](https://blog.kakaocdn.net/dn/mbBXG/btrvbeIZ1zZ/QNLj8o7gzgnKMCCkLKxDFK/img.png)
'웹 개발 > 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 |