본문 바로가기

스파르타코딩클럽(내일배움캠프)

스파르타 코딩 클럽 5주차 2일

728x90

오늘 드디어 은행 관리 프로그램을 완성 시켰다 기능면에서는 한도계좌부터 계좌 자동 생성기능까지 기능을 최대한 구현하였다. 하지만 정작 객체지향에 대한 관점에 대한 적용을 못시킨것 같아서 아쉽다. 3Tier로 기능분배하는거라던지, 상속 이라던지, 추상화, 그리고 요새 핫한 람다까지 적용을 시키지 못해서 아쉬웠다.

 

특히 3Tier로 나누는 방법에 관해서는 아직도 기준이 애매하다. 이것을 나눌때 자기주관이 조금 들어가는 것인지 아니면, 명확한 기준이 있는것인지 아직도 해메고 있다. 이부분에 대해서 명확히 이해하고 싶다. ㅠㅠ

 

은행관리프로그램

 

깃허브 : https://github.com/karlema/bankAcount

노션 : https://bronze-secure-135.notion.site/B-6-Hot-Six-c28804ae4da74becb5172424d107aba9

유투브 : https://drive.google.com/file/d/1mB_sT_SEoahQGC3YiFRfZ8JJ8TLS1oG3/view?usp=sharing

 

B반6조 은행 프로젝트.mp4

 

drive.google.com

후기 및 고찰 : 노션참고

 

김주성

문자열 파싱 알고리즘)

계기 : 협업을 해야 하는데, 입력해야할 변수명이 많아서 빠른디버깅을 위해 문자열 파싱을 하였고, 스페이스를 입력하면 NULL Pointer가 발생하여 공백을 제거의 필요성을 느꼈습니다.

설명 : String변수에 한번에 입력을 받고 부분 공백 제거 후, countTotal로 하나씩 String 인덱스에 접근하면서 콤마가 있으면countComma를 세서 각각의 요소를 구분하고, 각각을 파싱한다.

계좌 자동생성 구조)

완전 자동으로 할까 아니면, 부분 자동 할까 고민했었는데, 너무랜덤이면 실제 계좌랑 차이가 많이 나기 때문에 뒤에 6숫자만 랜덤하게 생성을 하였고, 재형님이 많이 도와주셨습니다.

후기)

이번 프로젝트를 하면서 소스트리 사용법, git pull request, merge하는법을 배웠고, git을 이용한 협업을 제대로 한것이 처음이라 많은것을 배웠다고 생각합니다.

어려웠던점은 문자열 파싱할때 계속 NULL 포인터가 발생해서 디버깅으로 하나하나 찍어보면서 해결했던적이 있습니다. 또한 제가 구조를 담당하게 되었는데 3Tier로 나눠야 된다는것을 발표전날 저녁에 알게 되었고 3Tier라는것도 정확히 몰라서 어떻게 적용해야될지 모르는게 아쉬웠던 점 입니다. 그리고 좀 더 메소드별로 구분하고, setter와 getter를 이용하지 않고 접근해야될것을 인지했습니다.

최종 수정본

Main.java

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main
{
    static boolean isExit = false;
    static boolean isUser = false;
    public static void main(String[] args)
    {
        System.out.println("\n \n");
        System.out.println("---------------------------------------------------------------------------------------------------------------------------------------------------");
        System.out.println("|    88        88    ,ad8888ba,    888888888888   ad88888ba   88  8b        d8      88888888ba          db         888b      88  88      a8P      |");
        System.out.println("|    88        88   d8\"'    `\"8b        88       d8\"     \"8b  88   Y8,    ,8P       88      \"8b        d88b        8888b     88  88    ,88'       |");
        System.out.println("|    88        88  d8'        `8b       88       Y8,          88    `8b  d8'        88      ,8P       d8'`8b       88 `8b    88  88  ,88\"         |");
        System.out.println("|    88aaaaaaaa88  88          88       88       `Y8aaaaa,    88      Y88P          88aaaaaa8P'      d8'  `8b      88  `8b   88  88,d88'          |");
        System.out.println("|    88\"\"\"\"\"\"\"\"88  88          88       88         `\"\"\"\"\"8b,  88      d88b          88\"\"\"\"\"\"8b,     d8YaaaaY8b     88   `8b  88  8888\"88,         |");
        System.out.println("|    88        88  Y8,        ,8P       88               `8b  88    ,8P  Y8,        88      `8b    d8\"\"\"\"\"\"\"\"8b    88    `8b 88  88P   Y8b        |");
        System.out.println("|    88        88   Y8a.    .a8P        88       Y8a     a8P  88   d8'    `8b       88      a8P   d8'        `8b   88     `8888  88     \"88,      |");
        System.out.println("|    88        88    `\"Y8888Y\"'         88        \"Y88888P\"   88  8P        Y8      88888888P\"   d8'          `8b  88      `888  88       Y8b     |");
        System.out.println("---------------------------------------------------------------------------------------------------------------------------------------------------");
        System.out.println("\n \n");

        List<Account> bankList = new ArrayList<>();
        boolean isBack = false;
        isBack = Menu.menu(isExit, bankList);
        while (isBack){
            Menu.menu(isExit, bankList);
        }
    }
}

 

Register.java

import java.util.List;
import java.util.regex.Pattern;

public class Register {
    public String CastString;
    public String accountNumber = null;
    public String name;
    public String pwd;
    public int money;
    public String bankName;
    public boolean limit;
    public String prefix = "356-1100-";

    public void parceChar(List<Account> bankList) {
        int countComma = 0;
        int countTotal = 0;
        int first = 0;
        int flag = 0;
        int last = 0;
        CastString = CastString.replaceAll(" ", "");
        while (true) {
            try {
                if (CastString != null) {
                    countTotal++;
                }

                if (flag == 0) {
                    switch (countComma) {
                        case 1: {
                            if (CastString.toCharArray()[first] == '*') {
                                String tempaccountNumber = "";
                                for (int i = 0; i < 6; i++) {
                                    tempaccountNumber += String.valueOf((int) (Math.random() * 10));
                                }
                                accountNumber = prefix + tempaccountNumber;
                            } else {
                                accountNumber = CastString.substring(first, countTotal - 1);
                                String pattern = "^(\\d{3,6})-?(\\d{2,6})-?(\\d{6,9})$";
                                boolean accountPattern = Pattern.matches(pattern, accountNumber);
                                if (!accountPattern) {
                                    System.out.println("형식에 맞지 않는 계좌번호입니다.\n");
                                    System.out.println("✨ (3~6자리 숫자)-(2~6자리 숫자)-(6~9자리 숫자) 형식으로 입력해주세요");
                                    return;
                                }
                                int count = 0;
                                for (Account acnt : bankList) {
                                    if (accountNumber.equals(bankList.get(count).accountNumber)) {
                                        System.out.println("동일한 계좌번호가 있습니다.");
                                        return;
                                    }
                                    count++;
                                }
                            }
                            System.out.println("✨ 새로 등록된 계좌의 번호는 " + accountNumber + " 입니다.");

                            first = countTotal;
                            flag = 1;
                            break;
                        }
                        case 2: {
                            name = CastString.substring(first, countTotal - 1);
//                            System.out.println(name);
                            first = countTotal;
                            flag = 1;
                            break;
                        }
                        case 3: {
                            pwd = CastString.substring(first, countTotal - 1);
//                            System.out.println(pwd);
                            first = countTotal;
                            flag = 1;
                            break;
                        }
                        case 4: {
                            money = Integer.parseInt(CastString.substring(first, countTotal - 1));
//                            System.out.println(money);
                            first = countTotal;
                            flag = 1;
                            break;
                        }
                        case 5: {

                            // 콤마 앞
                            bankName = CastString.substring(first, countTotal - 1);
//                            System.out.println(bankName);
                            first = countTotal;

                            if (CastString.toCharArray()[first] == '1') {
                                limit = true;
                            } else {
                                limit = false;
                            }
                            // 콤마 뒤

                            last = 1;
                            flag = 1;
                            break;
                        }
                    }
                }

                if (CastString.toCharArray()[countTotal] == ',') {
                    countComma++;
                    flag = 0;
                }

                if (last == 1) break;
            } catch (Exception e) {
                System.out.println("잘못된 입력입니다.");
                return;
            }
        }
        Account ac = new Account(accountNumber, name, pwd, money, bankName, limit);
        bankList.add(ac);
        if (!limit) {
            System.out.println("✨ 계좌번호 : " + accountNumber + " 이름 : " + name + ", 비밀번호 : " + pwd + ", 입금금액 : " + money + ", 은행명 : " + bankName);
        } else {
            System.out.println("✨ 계좌번호(한도제한) : " + accountNumber + " 이름 : " + name + ", 비밀번호 : " + pwd + ", 입금금액 : " + money + ", 은행명 : " + bankName);
        }

    }

    public Register() {

    }
}

 

HOT 6조 KPT 회고

1. Keep(좋았거나 계속 유지했으면 하는 부분)

  • 다 함께 코드 설계에 참여한 것
  • 충돌 없이 원활하게 협업한 것
  • 개인 브랜치에서 작업한 것
  • 구현할 기능을 미리 정해두고 작업을 진행
  • 변수명을 미리 결정

2. Problem(불편하거나 개선하고 싶은 부분)

  • 코드 작성 중에 추가된 기능
  • 메소드, 리턴 타입, 매개 변수를 정하지 않았다.
  • 3-Tier 구조로 설계하지 않은 점
  • git merge 시 main에 잘못 병합한 점
  • 코드 리뷰가 부족했었던 점
  • 플로우차트 부재

3. Try(Problem 해결책)

  • 설계 단계에서 시간을 충분히 들여 의논을 거쳐 좀 더 자세하게 설계해야 한다.
  • 변수명과 마찬가지로 작업 전에 의논을 해서 미리 정의해뒀어야 했다.
  • 3 계층 구조에 대해 조금 더 알아보고 적용 방법을 찾아본다.
  • develop 브랜치를 만들어서 main과의 역할을 분리한다.
  • 정해진 시간에 작업의 진행(변경) 상황을 조원들과 공유하는 시간을 늘린다.
  • miro 등의 플로우차트 생성 프로그램을 이용하여 현재 상황과 설계할 때 활용
728x90