ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - ATM Project업그레이드 버전
    Back-end/Java 2021. 7. 24. 20:25
    반응형

     

     

    이번에는 예전에 했던 ATM프로젝트가 생각보다 지저분하여 다시 조금 정리하면서 코딩해봤다.

    바뀐 점은 은행 고객 데이터들을 Map변수에 넣고 썼다. 그리고 필요없는 메소드는 삭제하는 방향으로 했다.

    인터페이스에 추가기능을 넣는 것은 어렵지 않기때문에 뻈다. 그리고 기본에 집중하여 코딩을 진행하였다.

     

    일단 메인 코드이다.

    <MyAtm.java>

            while (true)
            {
                int bank_index = getBank_index(chk_bank, scanner);
                if (bank_index > 2 || bank_index < 0)
                    break ;
                MyInform myInform = MakeBank(bank_index);
                while (true)
                {
                    int work_index = getBank_index(chk_work, scanner);
                    if (work_index == 6)
                        break ;
                    switch (work_index) {
                        case 1 : //계좌 개설. ACCOUNT,NAME,PASSWORD,PHONE필요. MONEY는 초기화 "0"
                            User user = createUser(scanner, random);
                            myInform.CreateUser(user);
                            break ;
                        case 2 : //계좌 조회. NAME, PASSWORD입력 후 ACCOUNT출력. 없으면 "error"
                            User getUser1 = GetUserByName(scanner, myInform);
                            PrintAccount(getUser1);
                            break ;
                        case 3 : //잔고 조회. ACCOUNT, PASSWORD필요. MONEY 출력.
                            User getUser2 = GetUserByAccount(scanner, myInform);
                            PrintMoney(getUser2);
                            break ;
                        case 4 : //입금. ACCOUNT, PASSWORD필요. MONEY에 더하고 출력.
                            User getUser3 = GetUserByAccount(scanner, myInform);
                            PlusMoney(scanner, myInform, getUser3);
                            break ;
                        case 5 : //출금. ACCOUNT, PASSWORD필요. MONEY에 빼고 남은 돈 출력. 남은 돈 -일 경우 "error"
                            User getUser4 = GetUserByAccount(scanner, myInform);
                            MinusMoney(scanner, myInform, getUser4);
                            break ;
                    }
                }
            }

    <MyAtm.java>

    총 5가지 기능을 구현하였다. 계좌 개설, 계좌번호 조회, 잔고 조회, 입금 및 출금이다.

    기능에 대해서 설명하기 전 전체적인 코드 구조를 설명하겠다.

     

    국민은행(0), 신한은행(1), 우리은행(2)로 되어진 입력을 받는다. 그리고 그에 맞게 각 은행에 정보가 저장될 수 있도록

    MyInform이라는 객체를 생성해주고 그 안에 Map변수내에 User라는 객체를 저장한다.

    프로그램이 돌아가는 동안은 Static변수를 이용하여 각 은행에 객체들을 저장해놓고 가져다 쓰는 방식으로 설계하였다.

     

    이제 각 기능에 대하여 살펴보자.

     

    1. 계좌 개설

    계좌 개설기능은 우리가 직접 입력하여 User객체를 생성하여 각 은행의 Store함수에 들어간다.

    <MyAtm.java>

        private static User createUser(Scanner scanner, Random random) {
            System.out.print("이름을 입력하세요 : ");
            String name = scanner.next();
            System.out.print("비밀번호를 입력하세요 : ");
            String password = scanner.next();
            System.out.print("전화번호를 입력하세요(-제외) : ");
            int phone = scanner.nextInt();
            int account = random.nextInt(90000) + 100000;
            int money = 0;
            User user = new User(password,name,money,phone,account);
            return user;
        }

    예를 들어 국민은행을 선택했을 때 코드를 가져오겠다.

    <Kookmin.java>

    public class KookminInform implements MyInform {
    
    private static Map<String, User> kookminStore = new HashMap<>();   
       
       @Override
        public void CreateUser(User user) {
            kookminStore.put(user.getName(),user);
            kookminStoreAcc.put(user.getAccount(),user);
            kookminStoreMon.put(user.getAccount(),0);
            System.out.println("계좌번호는 " + user.getAccount() + "입니다.");
        }   
     }

    위의 코드와 같이 MyInform이라는 인터페이스를 kookminInform로 구현하여 CreatUser함수를 이용하여 kookminStore라는 변수에 넣어 저장해준다.

     

    2. 계좌 조회

    계좌 조회 기능은 앞에서 저장했던 정보를 이름을 이용하여 찾아오는 기능을 구현했다.

    GetByUser함수를 이용하여 User객체를 찾고 PrintAccount로 정보를 출력해준다.

    <MyAtm.java>

     
     private static User GetUserByName(Scanner scanner, MyInform myInform) {
            System.out.print("이름을 입력하세요 : ");
            String name = scanner.next();
            System.out.print("비밀번호를 입력하세요 : ");
            String password = scanner.next();
            User user = myInform.GetUser(name,password);
            return user;
        }
    
    
    
    private static void PrintAccount(User getUser) {
            if (getUser == null)
                System.out.println("존재하지 않은 회원입니다.");
            else
                System.out.println("계좌번호는 " + getUser.getAccount() + " 입니다.");
        }

    <Kookmin.java>

     

        @Override
        public User GetUser(int account, String password) {
            User user = kookminStoreAcc.get(account);
            if (kookminStoreMon.get(account) != user.getMoney())
                user.setMoney(kookminStoreMon.get(account));
            if (user.getPassword().equals(password))
                return user;
            else
                return null;
        }

    이렇게 Getuser가 객체를 반환하고 메인코드에서 출력해주는 형식이다.

    근데 여기서 중요한 것은 GetUser가 2개가 있다는 것이다. 오버로딩을 적용해보았다. 헷갈리지 말길 바란다.

    public interface MyInform {
        int MinusMoney(User user,int money);
        int PlusMoney(User user,int money);
        User GetUser(String name,String password);
        User GetUser(int account, String password);
        void CreateUser(User user);
    }

     

    3. 잔고 조회

    잔고 조회도 위의 코드랑 비슷하지만 지금 데이터 관리를 Map<String, User>형식으로 하고있다.

    그래서 4,5번 기능을 사용할 경우 User내의 데이터를 바꾸기가 애매해졌다. 그래서 Map<Integer, Integer>를 한 개 더만들어 Key는 Account로 Value는 Money로 하여 따로 관리하기로 하였다. 나중에 DB를 관리하여 실행하면 쉽게 바꿀 수 있을 것이다.

     

    4. 입금, 출금

    입금 및 출금 기능은 비슷한 기능이기에 묶어서 설명하겠다.

     

    <MyAtm.java>

        private static void PlusMoney(Scanner scanner, MyInform myInform, User getUser3) {
            System.out.print("액수를 입력해주세요(입금) : ");
            int money = scanner.nextInt();
            int fmoney = myInform.PlusMoney(getUser3,money);
            System.out.println("잔액은 " + fmoney + " 입니다.");
        }
    
        private static void MinusMoney(Scanner scanner, MyInform myInform, User getUser4) {
            System.out.print("액수를 입력해주세요(출금) : ");
            int money = scanner.nextInt();
            int fmoney = myInform.MinusMoney(getUser4,money);
            System.out.println("잔액은 " + fmoney + " 입니다.");
        }

    이와 같이 코드를 구성하고 입력받은 금액을 각 은행에 넘겨 로직을 처리한다.

    입금은 많이 넣어도 가능하지만 출금은 잔고에있는 금액이상은 출금을 할 수 없다. 그러므로 따로 처리해줬다.

     

    <Kookmin.java>

        @Override
        public int PlusMoney(User user,int money) {
            int tmp = kookminStoreMon.get(user.getAccount()) + money;
            kookminStoreMon.put(user.getAccount(),tmp);
            return kookminStoreMon.get(user.getAccount());
        }
    
        @Override
        public int MinusMoney(User user, int money) {
            int tmp = kookminStoreMon.get(user.getAccount()) - money;
            if (tmp < 0)
                System.out.println("잔액이 부족합니다.");
            else
                kookminStoreMon.put(user.getAccount(),tmp);
            return kookminStoreMon.get(user.getAccount());
        }

     

     

    이렇게 하루 동안 저번에 했던 ATM기능들을 재구성하여 작성해봤다.

    확실히 2달 전 코드보다 깔끔해졌다는 느낌이 든다. 그러나 여기 추가해야될 기능들은 DB와의 연동 및 예외 처리를 해줘야한다. 이 기능들에 대해서는 공부가 조금 더 필요하다고 생각하여 어설프게 작성하지 않았다.

    2달 뒤 한 번더 이 프로젝트를 해볼 생각이다. 그땐 얼마나 더 짜임새 있는 코드를 짤 수 있을지 궁금하다.

    반응형

    'Back-end > Java' 카테고리의 다른 글

    Java - JDBC란?  (0) 2021.08.05
    Java - Entity, DTO, VO란?  (0) 2021.08.02
    JSP/Servlet 개념  (0) 2021.06.02
    Java - Chatting Project  (0) 2021.05.30
    Java - ATM Project  (0) 2021.05.27

    댓글

Designed by Tistory.