ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - ATM Project
    Back-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 (오버라이딩한 자식 클래스) 이다. 

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

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

    반응형

    댓글

Designed by Tistory.