토이 - 스마트 스토어 - 1

MeteorLee·2022년 12월 12일
0

Toy_SmartStore

목록 보기
1/2
post-thumbnail

📁 프로젝트 시작

깃허브 주소

토이 프로젝트 개요

시작

부트 캠프 훈련을 받은지 6주차에 접어들었고 나름 자바는 잘 다룬다는 생각을 가진 상황에서 토이프로젝트를 시작했다. 물론 이런 생각은 코드 3줄 쓰자마자 '어? 음... 이걸 어떻게 해야할까?'라는 생각이 수십 번도 더 들었던 것 같다. 너무 처음부터 완벽하게 잘 만들어야지라는 생각에 시작 못하다가 그냥 일단 한줄이라도 쓰자 라는 생각으로 시작했기에 미비한 부분이 너무 많았다.

개인적으로 이번에 활용하지 못한게 아쉽다. 협업에서 사용한다 라는 생각이 강했던 걸까 버젼을 관리하는 것이 git인데 중간에 한번 엎었던 거를 생각하면 git으로 했다면 어땟을까 싶다. 다음번에 프로젝트를 하게 된다면 무조건 git을 이용해서 작업을 해야겠다.

이름

클래스, 변수, 메서드... 모든 것의 이름을 정하는 일은 쉽지 않다. 누가 봐도 한 번에 아 이런 뜻을 담고 있구나라는 생각을 하게 만드는 이름 짓기란 너무나도 어려웠다. 사실 이번 토이 프로젝트를 하면서 가장 많이 고민한 부분 중에 하나일 것이다.
물론 지금도 잘 한다고 말은 못하겠다. (이름 대신 지어주는 AI가 발명되면 좋겠다)


📝 프로젝트 요구 사항

주제

스마트스토어 운영진을 위한 고객 분류 프로그램 개발

✅ 기능

  • 고객 정보를 입력 받아 추가 삭제 변경이 가능다.
  • 고객 명단을 분류 기준에 따라 분류할 수 있다.
  • 고객 명단을 분류 그룹, 분류 기준에 따라 오름차순 내림차순으로 정렬 가능하다.

✅ 분류 기준

  • 분류기준은 총 이용시간과 결제금액으로 정의하고 각 그룹이 되기 위한 최소 이용시간과 결제금액은 해당 프로그램을 사용하는 운영진에게 입력받는 형태입니다.
    • General
    • VIP
    • VVIP

✅ 조건

  • 고객 일련번호
    • 자동 생성
  • 고객 이름
    • 알파벳
    • 3글자 이상
  • 고객 아이디
    • 알파벳 / 숫자 / _ 가능
    • 5글자 ~ 12글자
    • 첫 글자로 숫자나 _가 올 순 없음
  • 고객이 스마트스토어를 이용시간 → 분류기준
    • 10, 20, 30시간 …
  • 고객이 스마트스토어에서 구매한 총 결제금액 → 분류기준
    • 100,000원, 200,000원 …

✅ 유의 사항

  • 해당 프로젝트는 클래스 및 메소드 설계를 직접 해보는 것이 목적이므로 List, Set, Map과 같은 컬렉션 프레임워크의 사용은 금지 (Arrays는 제외)
  • 프로그램이 어떤 이유에서든지 중간에 멈추지 않게 만들어야함

프로젝트 설계

🤔 처음 생각한 설계

✍🏻 클래스 구성

  • 처음 생각한 클래스들은 고객(Customer),고객 명단(Customers), 그룹(Group), 그룹 명단(Groups), 그룹 분류기준(Parameter), GroupType(enum), Menu, CustomerMenu, ParameterMenu, SummaryMenu 이다.
  • Customers와 Groups들은 각각 Customer와 Group를 속성으로 가지는 has-a 관계이다.
  • CustomerMenu, ParameterMenu, SummaryMenu들은 Menu를 상속받는 is-a 관계이다.

상위 패키지를 설정하고 아마 이때부터 Customers, Groups, Menu들을 싱글톤 패턴으로 구성하고자 생각했다.

초기 구성

Main

  • customer
    • Customer
    • Customers (싱글톤)
  • group
    • Group
    • Groups (싱글톤)
    • GroupType
    • Parameter
  • menu
    • Menu
    • CustomerMenu (싱글톤)
    • ParameterMenu (싱글톤)
    • SummaryMenu (싱글톤)

✍🏻 클래스 정의하기

  • 일단 클래스들이 가진 속성이나 이런 것들을 생각 나는 데로 적어서 구성해 봤다.

Customer
속성 : 일련번호, 이름, 아이디, 이용시간, 사용금액, 그룹
메서드 : 일련번호, 이름, 아이디, 이용시간, 사용금액 변경

Customers
속성 : 고객 배열, 현재 배열 크기, 실제 고개 명단 크기
메서드 : 배열에서 고객 추가, 고객 삭제, 고객 반환

Group
속성 : GroupType, Parameter
메서드 : Parameter변경

Groups
속성 : 그룹 배열, 그룹 크기
메서드 : 그룹 반환

GroupType
속성 : 이름, String
메서드 : 이름 반환

Parameter
속성 : 고객 이용 시간, 고객 이용 금액
메서드 : 속성 변경, 반환

Menu
속성 :
메서드 : finalRun(), 번호 입력 부분, 각 메뉴 호출

CustomerMenu
속성 :
메서드 : 고객 정보 추가, 보기, 변경, 삭제

ParameterMenu
속성 :
메서드 : 분류 기준 생성, 보기, 변경

SummaryMenu
속성 :
메서드 : 이름순, 시간순, 금액순, 번호순 요약 보기, 오름차순 내림차순 정하기

🤔 대부분 배열 - 객체 로 정의하고 객체 부분에서 수정을 하고 배열 부분에서는 추가 삭제 등을 맡았다. 그리고 이런 모든 것들을 컨트롤 하는 부분은 Menu부분에서 다루기로 하였다. 메뉴 부분에서 특정 메서드를 호출하여 배열과 객체를 다루는 것이 맞다고 생각하였다.


🤔🤔🤔 프로젝트 구현

모든 구현 부분을 작성하기에는 조금 무리가 있어 내가 중요하다고 생각하는 부분이나 구현하면서 생각 나는 부분을 작성하기로 함

📁 customer

customer패키지인데 사실 강의 중에 강사님과 같이 만든 부분이 대부분인데 그래도 한번 더 강의를 들으면서 작성해 보았다.

📄 Customer

고객 일련번호가 자동 생성이였기에 int static으로 따로 생성하여 String으로 변환하기로 했다.

protected static int GENERATOR = 0; // private으로 해도 되는데 실수했다.

public Customer(){
	GENERATOR++; // 자동생성
	this.customerNumber = String.format("%04d",GENERATOR); // 0001과 같이 표현하고자 함
    }

📄 Customers

고객 명단인데 우리는 배열[]로 만들기로 약속하였기에 크기를 변경하는 부분이 중요하였다.

protected int size; // 고객 명단 실제 크기
protected int capacity; // 배열 크기
    
public void grow() { // 배열 2배로 키우기
        Customer[] temp = new Customer[size];
        for (int i = 0; i < size; i++) {
            temp[i] = customers[i];
        }

        capacity *= 2;

        Customer[] newCustomers = new Customer[capacity];
        for (int i = 0; i < Math.min(size, capacity); i++) {
            newCustomers[i] = temp[i];
        }

        customers = newCustomers;
    }

public void add(Customer customer) { // 고객 추가
        if (customer == null) return;

        if (size < capacity) { // 고객 명단 크기와 배열 크기 확인
            customers[size] = customer;
            size++;
        } else {
            grow(); // doubling 2배로 키워줌
            add(customer);
        }

    }

📁 group

구현할 부분이 적은 편이었고 중간에 menu를 만들다가 생각나서 만든 메서드가 중요했다.

📄 Group

특별한 것은 없었고 GroupType은 정해져 있어 final로 선언했더니 생성자 부분에서 GroupType을 따로 초기화 해줘야 했다.

private final GroupType groupType;

public Group() {
        this.groupType = null; // 없으면 오류가 발생함
        this.parameter = null;
}

📄 Groups

처음 작성한 내용보다 menu패키지를 만들면서 많은 변화가 있었는데 제일 큰 변화는 group[]배열에 4개의 group를 만들고 시작한 점이다. 처음에는 위의 Customers처럼 '프로그램 실행 중에 만들어서 넣어야지' 생각했는데 코딩하는 과정 중에서 group를 한번만 만들어서 넣어야 하니 메소드를 따로 만들고 한번만 사용하는 상황을 다루는 것이 껄끄러워서 변경하였다. 그러다 보니 '애초에 group의 종류가 GroupType 갯수만큼 정해져 있기에 처음 Groups가 만들어 질 때 넣는 것이 맞지 않을까?' 하고 생각하게 되어 적용했다.

public static Groups getInstance() { // 싱글톤 패턴
        if (allGroups == null) {
            allGroups = new Groups();
            int i = 0;
            for (GroupType groupType : GroupType.values()) { // 미리 만들기
                allGroups.groups[i] = new Group(groupType, null);
                i++;
            }
        }
        return allGroups;
    }

이 부분은 Customers에 만들까 아니면 Groups에 만들까 약간 고민했던 부분인데 만들어진 고객 인스턴스가 어떤 그룹인지 확인하기 위해 만든 부분이다. 어떤 그룹인지 체크를 하는 부분에서 뒤에서 부터 즉 더 상위 그룹인지 체크하는 것이 중요했기에 for i 에서 증감식이 i--되도록 체크하는 부분으로 만들었다. 뒤에서 부터 체크하는 for문을 작성은 많이 해봤지만 처음 적용해 보는 거라 기억에 많이 남을 것 같다.

	public Group checkCustomerGroup(Customer customer) {
        for (int i = size - 1; i >= 0; i--) { // vvip -> vip -> 이런 순서로 체크하기
            Parameter param = this.groups[i].getParameter();
            if (param != null)
                if ((customer.getTime() >= param.getMinimumSpentTime()) &&
                        (customer.getTotalMoney() >= param.getMinimumTotalPay()))
                    return this.groups[i];
        }
        return null;
    }

📄 GroupType, Parameter

기본적인 내용만 구현

📁 menu

가장 많이 시간을 쏟은 부분이고 아직도 수정해야 할 것들이 많다고 생각한다.
최대한 중복된 부분을 하나의 메서드로 만들려고 노력하며 코딩을 진행하였다.

📄 Menu

각 메뉴들의 상위클래스 이므로 하위 클래스에서 중복되는 메서드를 최대한 많이 만드는 것을 목표로 했다.
사실 많이 할려고 노력했지만 많이 만들지는 못하고 exception부분과 입력 부분만 만들었다.

	protected void NonFormatException(){
        System.out.print("잘못된 형식의 입력입니다.\n");
    }

    protected void EmptyException(){
        System.out.println("공백은 입력하실 수 없습니다.\n");
    }

    protected void OutOfRangeException(){
        System.out.print("잘못된 범위의 숫자를 입력하셨습니다.\n\n");
    }


	protected int inputNumber(int max, int min){
        while (true) {
            try {
                System.out.print("번호를 입력해 주세요 : ");
                String inputString = bf.readLine();
                inputString = inputString.strip();

                if (inputString.equals("")) {
                    EmptyException();
                    continue;
                }

                int input = Integer.parseInt(inputString);

                if (input < min || input > max) {
                    OutOfRangeException();
                    continue;
                }
                return input;

            } catch (NumberFormatException e){
                System.out.println("숫자를 입력해 주세요.");
            } catch (Exception e) {
                System.out.println("예상치 못한 오류입니다.");
            }
        }

    }

좀 더 많은 메서드를 만들어서 하위 클래스가 상속하게 만들었다면 좋았을 것 같아서 아쉽다. 이 부분은 다음에 한번 고칠려고 한다.

📄 CustomerMenu

고객 정보를 만들거나 수정시에 그 고객이 존재하는 기준에 따라 어떤 그룹의 속성을 가지는 지를 정하는 부분이 중요했고 이를 Groups에 checkCustomerGroup()에서 확인하게 되었다.


customer.setGroup(allGroups.checkCustomerGroup(customer)); // 그룹확인
allCustomers.add(customer); // 고객 정보 추가

첫번째로 만든 메뉴라서 그런지 상당히 좋지 못한 코드가 몰려있는데 중복되는 코드가 그냥 딱봐도 넘쳐나고 이전 메뉴에서 만든 메소드를 상속해서 사용할 부분도 또 구현해 놨다. 굉장히 잘 못한 클래스 부분이라서 다시보니 좀 심하다.

private void setCustomerTotalMoney(Customer customer){
        while (true) {
            try {
                System.out.print("\n\n고객 사용 금액을 입력해주세요 : ");

                String inputString = bf.readLine().strip();
                if (inputString.equals("")) {
                    EmptyException();
                    continue;
                }

                int money = Integer.parseInt(inputString);

                if (money < 0) {
                    OutOfRangeException();
                    continue;
                }

                customer.setTotalMoney(money);
                break;

            } catch (Exception e) {
                System.out.println("예상치 못한 오류 입니다.");
            }
        }
    }

    private void setCustomerTime(Customer customer){
        while (true) {
            try {
                System.out.print("\n\n고객 쇼핑 시간을 입력해주세요 : ");

                String inputString = bf.readLine().strip();

                if (inputString == null || inputString.equals("")) {
                    EmptyException();
                    continue;
                }

                int time = Integer.parseInt(inputString);

                if (time < 0) {
                    OutOfRangeException();
                    continue;
                }

                customer.setTime(time);
                break;

            } catch (Exception e) {
                System.out.println("예상치 못한 오류 입니다.");
            }
        }
    }

출력문 제외하고 똑같은 메서드인데 따로 구현하는 최악을 보여줬다. 이런 부분은 무조건 고쳐야 한다는 생각이 강하게 든다.

while(true)로 해결할 수 있을것 같기도 한데 일단 while(flag)식으로 구현했는데 고칠 수 있지 않을까 라고 많이 생각 했던 부분이다. 사실 2개나 3개의 메서드로 만들까도 많이 생각했다.

while (flag) {
                System.out.print("\n1. 고객 이름\n" +
                        "2. 고객 아이디\n" +
                        "3. 고객 사용 금액\n" +
                        "4. 고객 쇼핑 시간\n" +
                        "5. 뒤로가기\n\n");

                int choice = inputNumber(5, 1);
                switch (choice) {
                    case 1:
                        setCustomerName(customer);
                        continue;
                    case 2:
                        setCustomerId(customer);
                        continue;
                    case 3:
                        setCustomerTotalMoney(customer);
                        continue;
                    case 4:
                        setCustomerTime(customer);
                        continue;
                    case 5:
                        flag = false; //주석 처리
                        break; // 아래의 문장들 메서드로 만들어 호출하고 return?
                }
                Group group = allGroups.checkCustomerGroup(customer);

                if (group == null) {
                    customer.setGroup(null);
                    continue;
                }
                if (!group.equals(customer.getGroup())) {
                    customer.setGroup(group);
                }
            }
            customer.setGroup(allGroups.checkCustomerGroup(customer));
            allCustomers.add(customer); 

📄 ParameterMenu

각 Group의 Parameter가 변경되면 모든 고객 정보들을 검증하는 방식으로 구현해야겠다고 생각하고 만들었다.

	public void reGrouping(){
        for (int i = 0; i < allCustomers.size(); i++) {
            Group group = groups.checkCustomerGroup(allCustomers.get(i));
            allCustomers.get(i).setGroup(group);            
        }
    }

생각한 대로 코딩했고 생각한 대로 움직여줘서 상당히 만족스러웠다.

기존에 존재하는 Parameter의 인스턴스를 바꿔주는 방식보다 그냥 Parameter 인스턴스를 하나 더 만들어서 Group 객체의 parameter속성의 참조값을 변경하는 방식을 선택했다. 이유는 처음 Group를 생성할 때 GroupType은 4개를 생성했는데 parameter는 null로 초기화했기 때문인데 이유는 만약 parameter의 속성 time과 money를 0으로 초기화 한다면 GENERAL 그룹의 기준을 0 0으로 잡고 싶거나 아니면 GENERAL그룹을 없애고 싶은 경우가 구분이 안가기 때문이다.

처음에는 실수로 parameter가 0일 때 그룹이 없다고 가정하고 만들었다가 수정했다.

Parameter parameter = new Parameter(); // 새로운 parameter생성

            while (true) {

                showParameterMenu();
                int paramChoice = inputNumber(3, 1);

                if (paramChoice == 1) {
                    setParameterTime(parameter);
                    continue;
                }
                if (paramChoice == 2) {
                    setParameterMoney(parameter);
                    continue;
                }
                if (paramChoice == 3) {
                    break;
                }
            }

            group.setParameter(parameter); // 참조값을 변경함
            // 이전 parameter 인스턴스는 가비지 콜렉터가 수거해줄 것임
            reGrouping();

📄 SummaryMenu

상당히 고통을 많이 받았던 메뉴임. 처음에 Customers를 싱글톤으로 만들었는데 내가 구상한 메뉴를 구현하는 방식에 맞지 않았기에 문제가 컷음.
크기가 GroupType과 같은 Customers[]를 만들어서 각각의 Customer를 넣는 방식으로 구현하고자 했는데 처음 Customers를 싱글톤으로 만들었기에 문제가 생겼음. 다른 방법으로 구현하고자 하다가 포기하고 결국 Customers[]를 상속한 SummaryCustomers를 하나 더 만듬. (만든 이유는 나중에 수정하고 삭제하기 위해서)

일단 모든 고객 정보들을 Group에 따라 SummaryCustomers에 넣은 다음 각각의 정렬 방식으로 배열을 다시 정리한 다음에 이를 출력하는 방식을 선택했음

각 고객 정보의 그룹의 Parameter가 null인 경우를 어떻게 해서든 하나의 for문에 넣고 싶었는데 불가능해서 따로 구현한게 아쉬운 부분임

Group에 따른 분배

	private Customers[] classifyAllCustomer(Customer[] summaryList){
        summaryCustomersList = new Customers[GroupType.values().length];
        for (int i = 0; i < GroupType.values().length; i++) {
            summaryCustomersList[i] = new SummaryCustomers();
        }

        for (int i = 0; i < summaryList.length; i++) {

            Customer customer = summaryList[i];
            Group customerGroup = customer.getGroup();

            if (customerGroup == null) {
                summaryCustomersList[0].add(customer);
                continue;
            }
            for (int j = 1; j < allGroups.getSize(); j++) { // 확인 부분
                if (customerGroup.getGroupType().equals(allGroups.get(j).getGroupType())) {
                    summaryCustomersList[j].add(customer);
                } 
            }
        }
        return summaryCustomersList;
    }

Customers를 싱글톤 패턴으로 만든 것이 좀 실수가 커서 코딩할 때 이게 맞나? 라는 생각을 많이함.

개인적으로 잘 구현했다고 생각하는 부분인데 정렬방식, 오름차순 내림차순인지 2개를 입력받아서 정렬을 하는 메서드를 하나의 부분에서 잘 구현했다고 생각함

private void arrangeSortType(int orderType, int sortType){
        summaryList = new Customer[allCustomers.size()];
        for (int i = 0; i < allCustomers.size(); i++) {
            summaryList[i] = allCustomers.get(i);
        }

        int index = 1; // 오름차순
        if (sortType == 2) {
            index = -1; // 내림차순
        }
        final int finalIndex = index; // 익명 클래스 내부에서 사용하기에 final


        switch (orderType) {
            case 2:

                Arrays.sort(summaryList, new Comparator<Customer>() { // 람다식으로 바꿀 예정
                    @Override
                    public int compare(Customer o1, Customer o2) {
                        if (o1.getCustomerName().compareTo(o2.getCustomerName()) < 0) return -finalIndex; 
                        else if (o1.getCustomerName().compareTo(o2.getCustomerName()) == 0) {

                            return o1.getCustomerNumber().compareTo(o2.getCustomerNumber()) * finalIndex;
                            // 내림차순의 경우 번호도 역순이 되어야 하기에 넣음
                        }
                        else return finalIndex;
                    }
                });
                break;
            case 3:
                Arrays.sort(summaryList, new Comparator<Customer>() {
                    @Override
                    public int compare(Customer o1, Customer o2) {
                        if (o1.getTime().compareTo(o2.getTime()) < 0) return -finalIndex; 
                        else if (o1.getTime().compareTo(o2.getTime()) == 0) {

                            return o1.getCustomerNumber().compareTo(o2.getCustomerNumber()) * finalIndex;
                        }
                        else return finalIndex;
                    }
                });

                break;
            case 4:
                Arrays.sort(summaryList, new Comparator<Customer>() {
                    @Override
                    public int compare(Customer o1, Customer o2) {
                        if (o1.getTotalMoney().compareTo(o2.getTotalMoney()) < 0) return -finalIndex; 
                        else if (o1.getTotalMoney().compareTo(o2.getTotalMoney()) == 0) {

                            return o1.getCustomerNumber().compareTo(o2.getCustomerNumber()) * finalIndex;
                        }
                        else return finalIndex;
                    }
                });
                break;
        }

    }

📄 Main

메인 클래스 부분은 테스트 부분을 만드는 것에 생각을 좀 많이 했는데

	public static void customerTest(){

        Customer testCustomer1 = new Customer("test1", "test1Id", 10, 5);
        Customer testCustomer2 = new Customer("test2", "test2Id", 5, 20);
        Customer testCustomer3 = new Customer("test3", "test3Id", 30, 50);
        Customer testCustomer4 = new Customer("test4", "test4Id", 60, 70);
        Customer testCustomer5 = new Customer("test5", "test5Id", 40, 10);
        Customer testCustomer6 = new Customer("test6", "test6Id", 20, 40);
        Customers.getInstance().add(testCustomer1);
        Customers.getInstance().add(testCustomer2);
        Customers.getInstance().add(testCustomer3);
        Customers.getInstance().add(testCustomer4);
        Customers.getInstance().add(testCustomer5);
        Customers.getInstance().add(testCustomer6);

    }

    public static void parameterTest(){
        Groups.getInstance().get(1).setParameter(new Parameter(10, 10));
        Groups.getInstance().get(2).setParameter(new Parameter(20, 20));
        Groups.getInstance().get(3).setParameter(new Parameter(50, 50));
        ParameterMenu.getInstance().reGrouping();
    }

    public static final void test(){
        customerTest();
        parameterTest();
    }
    
    public static final void mainRun(){
        System.out.print("=====================================================\n" +
                "               고객 분류 프로그램 v1.0.2 \n" +
                "                 made by MeteorLee\n" +
                "=====================================================\n\n\n");

        run();

    }

    public static final void testRun(){
        System.out.print("=====================================================\n" +
                "               고객 분류 TEST 프로그램 v1.0.2 \n" +
                "                 made by MeteorLee\n" +
                "=====================================================\n\n\n");
        test();
        run();
    }


    public static void main(String[] args) {
        mainRun();
//        testRun();

    }

테스트 방식으로 좋은 방식인지 아닌지 궁금하다. 처음에는 하나의 메서드오 전부다 우겨넣어서 만들었는데 너무 안좋은 것 같아서 각각의 메서드로 나누어서 구현했는데 더 좋은 방식이 있는지 궁금함.


🛑 잘못하거나 고칠점

⛔ 중복코드 줄이기

일단 기억나는 부분만 적더라도 양이 많았는데 코딩할 때 몰랐던 것이 좀 소름이긴 하다.

  • 각 메뉴 출력 부분
  • 고객 정보 속성 입력 받는 부분
  • 그룹 구분 기준 입력 받는 부분 등 많은 상당히 많은 중복이 있었기에 좀 아쉽다.

항상 재사용성을 생각하면서 코딩을 해야하는 것도 알고 그렇게 생각하고 코딩을 했음에도 아직은 코딩을 할 때 바로바로 생각도 안나고 나중에 돌아봐야 다시 생각나는 상황이라 많은 연습이 필요할 것 같다.

⛔ 메서드로 나누기

가독성이 많이 떨어지는 코드가 많았던 것 같음 특히 for + if의 여러개로 구성된 메서드가 좀 많았기에 쪼개서 구현했으면 어땟을까 라는 생각을 많이 하게됨.

⛔ 접근 제어자 관리

사실 인텔리 제이가 없었다면 말도 안되게 힘들었을 것 같은 부분이다. static, public, protected, private 를 생각을 잘 하고 만들어야 한다는 것을 많이 느꼇다. 조금만 코딩해도 빨간줄이 막 찍찍 생기는 것을 보고 그냥 아무생각 없이 private를 남발한다는 것을 많이 느꼇다. 그리고 final부분은 그냥 인텔리 제이에서 알려주지 않았다면 거의 쓰지도 못했을 부분이기에 한번 선언하고 바뀌지 않는 부분을 final을 채워넣으면서 다시 생각하게 되었다.

⛔ 싱글톤

Customers를 싱글톤으로 만들면 안됬나 생각이 좀 크게 들었음. 출력부분에서 그냥 Customers의 배열을


😀 만족한 점

  • ✔ 구현
    그래도 일단 모든 부분을 구현하는데에 성공했고 생각한 방향으로 구현한 것에 만족함. 내가 고민해서 생각한 방식으로 구현을 시도하고 이를 완성시켜가는 과정을 처음해봤는데 꽤나 만족스러운 결과물이 나왔음.

  • ✔ 중복코드 구현
    Menu의 입력부분을 활용한거는 처음부터 생각한 것처럼 되서 만족스러웠음. 그리고 SummaryMenu의 arrangeSortType() 메서드로 3개의 출력을 담당하게 되어 굉장히 만족스러웠음.

  • ✔ 이름
    나름 이름을 잘 지었다고 생각한다. 뭐 나의 생각일 뿐이다. 강사님 코딩을 봤을 때 고쳐야 할 부분도 많다고 생각하는데 그래도 혼자 생각한 것 치고는 나름 괜찮지 않을까 라는 자기만족을 해본다.

🤔 생각나는 것들

완성

처음부터 끝까지 하나의 프로젝트를 완성해보는 것이 처음이었기에 배우는 부분이 굉장히 많았음. 특히 프로그램을 시작했을 때 하나의 메인에서 다른 클래스들의 메서드를 호출하는 그런 프로그램이 돌아가게 만드는 구성에대해 배운것이 만족스러웠음. 한번 다시 프로젝트를 수정하는 작업을 할 생각이 있고 아마 이번주 내에 할 것 같음. 제일 중요한 것은 중복된 코드 하나의 메서드 처리 하는 것이 중요하다고 생각함.

중간 기록

중간 중간 git과 블로그 등을 통해서 나의 생각이나 그때그때 떠올랏던 것들을 정리하지 못한게 아쉬운 부분임. 내가 왜 이런 생각을 해서 이런 코딩을 했는지에 대해 다시 돌아보면 생각 안나는 부분들이 좀 많았음. 그리고 주석을 좀 적극적으로 활용해야 했을 것 같음. 이것까지 써야하나 이러다가 결국 주석을 하나도 안달게 되었는데 나를 위해서라도 주석을 좀 달아야겠음

마무리

마무리 지으면서 이런저런 놓치는 부분들을 채워넣으면서 생각이 드는 부분은 내가 많이 부족하다는 것이였다. '처음 만들때부터 조금만 더 신경써서 만들었다면' 이라는 생각을 진짜 엄청 많이하면서 만들었다. 객체 지향적 사고 방식을 하는 것이 너무나도 중요하다는 생각이 많이 들었다. 내가 이번 프로젝트에서 느꼇던 부족한 점들이라도 채워넣을 수 있게 노력해야겠다.

profile
코딩 시작

0개의 댓글