Back-end/Java

Java - ATM Project

HOONY_612 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 (오버라이딩한 자식 클래스) 이다. 

이것을 할 경우, 오버라이딩을 시도해도 오류가 발생하진 않지만 오버라이딩이 적용되지는 않는다.

그러나 대부분 이 방법을 사용하는 것을 지양한다고한다.

반응형