-
Java - ATM ProjectBack-end/Java 2021. 5. 27. 14:26반응형
* Scanner 개념
기본 사용법
import java.util.Scanner; //기본적으로 import 문 필요 Scanner scan = new Scanner(System.in); // Scanner 객체 Scan.close();//scan을 끝내줌
Scanner : 읽은 바이트를 문자, 정수 실수, 문자열 등 다양한 타입으로 변환하여 리턴하는 클래스
- System.in : 키보드와 연결된 자바의 표준 입력 스트림이다. 입력되는 키를 바이트로 리턴하는 스트림.
- Next~() 와 NextLine()의 차이점 : 다른것들은모두변수형+ "\n"를반환해주는데NextLine은 "\n"을포함하지않는다.
* Random 개념
기본 사용법
import java.util.Random Random rand = new Random(); int Value1 = rand.nextInt(10) // 0~9까지의 난수발생. int Value2 = rand.nextInt(100) // 0~99까지의 난수발생.
* 주요 변수 설명
static my_inform[][] arrBank = new my_inform[3][100]; //3개의 은행사 고객 100명씩 총 300명의 객체를 담을 수 있는 정적 변수 static int[] bank_count = {0, 0 ,0}; //계좌 개설마다 하나씩 증가. 즉 각 은행사의 계좌 수를 나타냄. int account = 0; int money = 0; String name = "", phone = "", password = ""; my_inform buf; // 다양한 양식에 맞는 검사를 위해서 데이터를 임시적으로 저장하는 공간. Scanner scanner = new Scanner(System.in); //BYTE단위로 읽겠다. Random random = new Random();//난수를 발생시킬 객체 생성.
* my_inform Class
public class my_inform { static my_inform[][] arrBank = new my_inform[3][100]; static int[] bank_count = {0, 0 ,0}; int money; int account; String name; String phone; String password; static my_inform check_phone(String phone, int bank_num) //전화번호가 일치하는지 확인. { my_inform phone_chk = null; int i = 0; while (i < bank_count[bank_num]) { if (arrBank[bank_num][i].phone.equals(phone)) { phone_chk = arrBank[bank_num][i]; break ; } i++; } return (phone_chk); } static my_inform check_account(int account, int bank_num) //계좌가 일치하는지 확인. { my_inform account_chk = null; int i = 0; while (i < bank_count[bank_num]) { if (arrBank[bank_num][i].account == account) { account_chk = arrBank[bank_num][i]; break ; } i++; } return (account_chk); } static my_inform check_password(String password, int bank_num) //비밀번호가 일치하는지 확인. { my_inform password_chk = null; int i = 0; while (i < bank_count[bank_num]) { if (arrBank[bank_num][i].password.equals(password)) { password_chk = arrBank[bank_num][i]; break ; } i++; } return (password_chk); } static int check_money(String name, String password, int bank_num) //이름과 비밀번호가 일치하는지 확인 { int i = 0; while (i < bank_count[bank_num]) { if (arrBank[bank_num][i].name.equals(name) && arrBank[bank_num][i].password.equals(password)) return (arrBank[bank_num][i].money); i++; } return (-1); } static String check_phone_num(String phone, int bank_num) {//전화번호가 숫자인지 확인. 전화번호 길이 확인. int i = 0; while (i < phone.length()) { if (phone.charAt(i) < '0' || phone.charAt(i) > '9') {System.out.println("숫자만 입력하세요."); break ;} if (phone.length() != 11) {System.out.println("휴대폰 번호만 입력하세요. 길이가 다릅니다."); break ;} i++; } if (i == phone.length()) return phone; else return null; } static String check_dup_account(int account, int bank_num) { //계좌 생성 시 일치하는 숫자의 계죄가 존재하는지 확인 int i = 0; while (i < bank_count[bank_num]) { if (arrBank[bank_num][i].account == account) return null; else i++; } return ("a"); } static String chekc_password_format(String password, int bank_num) { //비밀번호가 4자리가 맞는지, 숫자로 이루어져 있는지 확인. int i = 0; while (true) { if (password.length() != 4) return null; if ((password.charAt(i) < '0' || password.charAt(i) > '9') && i < password.length()) return null; i++; if (i == password.length()) break ; } return (password); } int ft_extract(int money, my_inform mine) { //출금하는 로직 if (money > mine.money) System.out.println("잔고가 부족합니다."); else mine.money -= money; return (mine.money); } int ft_create() { //계좌 생성 시 입금하는 금액 return (1000); } void ft_print_money(int money) { //잔고 조회 시 액수를 출력 System.out.println(money + "원"); } }
* 기능 구현
1. 계좌 개설(이름, 전화번호, 비밀번호)
my_inform[] local_bank = {new Kookmin(), new Shinhan(), new Woori()};// bank_num에 맞는 객체 생성. 각 은행마다 하는 기능이 다름. case 1: //계좌개설(random,이름,비밀번호 필요) while (true) //계좌번호 할당 { local_bank[bank_num].account = (random.nextInt(90000) + 100000);// 0 ~ 90000까지의 난수를 발생시키고 + 100000을 해줌. if (my_inform.check_dup_account(local_bank[bank_num].account,bank_num) == null) {System.out.println("중복 계좌가 존재합니다. 다시 입력해주세요.");} else break; } while (true) //이름 할당 { System.out.println("예금주 : "); local_bank[bank_num].name = scanner.next(); if (local_bank[bank_num].name.length() > 4 || local_bank[bank_num].name.length() < 2) {System.out.println("이름이 형식에 맞지 않습니다."); break ;} } while (true) //전화번호 할당 { System.out.print("핸드폰 번호 [ '-' 제외 ] : "); phone = scanner.next(); local_bank[bank_num].phone = my_inform.check_phone_num(phone, bank_num); if (local_bank[bank_num].phone != null) break ; } while (true) // 비밀번호 할당 { System.out.println("비밀번호 : "); local_bank[bank_num].password = scanner.next(); if (my_inform.chekc_password_format(local_bank[bank_num].password, bank_num) != null) break ; else System.out.println("비밀번호를 다시 입력하세요."); } local_bank[bank_num].money = local_bank[bank_num].ft_create(); my_inform.arrBank[bank_num][my_inform.bank_count[bank_num]] = local_bank[bank_num]; my_inform.bank_count[bank_num]++; break ;
2. 계좌 조회(전화번호)
case 2: //계좌조회(핸드폰 번호 필요) while (true) { System.out.print("계좌 개설시 등록한 핸드폰 번호 : "); phone = scanner.next(); buf = my_inform.check_phone(phone, bank_num); if (buf == null) System.out.println("존재하지 않는 계좌입니다."); else { System.out.println(buf.account); break ; } } break ;
3. 잔고 조회(이름, 비밀번호)
case 3: //잔고조회(계좌번호,비밀번호) while (true) { System.out.println("이름 : "); name = scanner.next(); System.out.println("비밀번호 : "); password = scanner.next(); money = my_inform.check_money(name, password, bank_num); if (money == -1) System.out.println("다시 한 번 입력해주세요."); else { local_bank[bank_num].ft_print_money(money); //buf로하면 Null error break ; } } break ;
4. 입금(계좌번호, 비밀번호, 액수)
case 4: //입금(액수,계좌번호,비밀번호) while(true) //계좌번호 확인 { System.out.println("계좌번호 : "); account = scanner.nextInt(); buf = my_inform.check_account(account, bank_num); if (buf == null) System.out.println("존재하지 않는 계좌번호입니다."); else break ; } while (true) //비밀번호 확인 { System.out.println("비밀번호 : "); password = scanner.next(); buf = my_inform.check_password(password, bank_num); if (buf == null) System.out.println("비밀번호가 일치하지 않습니다."); else { System.out.println("입금금액 : "); money = scanner.nextInt(); buf.money += money; break ; } } break ;
5. 출금(계좌번호, 비밀번호, 액수)
case 5: //출금(계좌번호.비밀번호) int temp_money; while(true) //계좌번호 확인 { System.out.println("계좌번호 : "); account = scanner.nextInt(); buf = my_inform.check_account(account, bank_num); if (buf == null) System.out.println("존재하지 않는 계좌번호입니다."); else break ; } while (true) //비밀번호 확인 { System.out.println("비밀번호 : "); password = scanner.next(); buf = my_inform.check_password(password, bank_num); if (buf == null) System.out.println("비밀번호가 일치하지 않습니다."); else { while(true) //출금 가능 금액 확인하고 출금 { System.out.println("출금금액 : "); money = scanner.nextInt(); temp_money = buf.money; buf.money = buf.ft_extract(money, buf); if (buf.money != temp_money) break ; } break ; } } break ;
* 오버라이딩 구현
1. 국민은행 (출금 시 수수료 100원 발생)
2. 신한은행 (계좌 개설 시, 3000원 입금)
3. 우리은행 (잔고 조회 시, 하트모양 표시)
오버라이딩을 할 경우 주의할 점이 몇 가지 있다. 일단은 Static Method는 오버라이딩을 할 수 없다.
즉 함수를 재정의하여 자기 입맛에 따라 사용할 수 없다는 것. 클래스 자체에 단 한번만 메모리에 올라가있기 때문이다.
그래서 오버라이딩이 하고 싶을 경우엔 인스턴스 메소드가 들어있는 클래스를 임의로 하나 선언해주고 그것을 이용하여 사용해야한다. 위의 예를 들어 my_inform.ft_print_money를 하면 오류가 날 것이다. 그래서 buf라는 임의의 인스턴스를 만들고 buf.ft_print_money를 해주어야 한다.
그리고 Static Method를 오버라이딩 할 경우 Hiding이라는 방법으로 한다고 한다.
적어주는 것은 (부모 객체 타입) (변수명) = new (오버라이딩한 자식 클래스) 이다.
이것을 할 경우, 오버라이딩을 시도해도 오류가 발생하진 않지만 오버라이딩이 적용되지는 않는다.
그러나 대부분 이 방법을 사용하는 것을 지양한다고한다.
반응형'Back-end > Java' 카테고리의 다른 글
Java - ATM Project업그레이드 버전 (0) 2021.07.24 JSP/Servlet 개념 (0) 2021.06.02 Java - Chatting Project (0) 2021.05.30 Java개념 - 후반부(접근 제어자, 인터페이스, 다형성, 예외, 참조) (0) 2021.05.19 Java개념 - 전반부( Class, 상속, overriding, 생성자) (0) 2021.04.28