Java - ATM Project
* 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 (오버라이딩한 자식 클래스) 이다.
이것을 할 경우, 오버라이딩을 시도해도 오류가 발생하진 않지만 오버라이딩이 적용되지는 않는다.
그러나 대부분 이 방법을 사용하는 것을 지양한다고한다.