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 |