본문 바로가기
프로젝트/MegabyteSchool

[Java] ToyProject - SmartStore

by 엑츄얼리 2022. 11. 26.

프로젝트 요약

1. 모든 고객의 사이트에서 머문 시간 및 사용 금액을 저장해놓고

    머문 시간 및 사용 금액을 통해 고객에게 등급을 부여한다.

2. 등급을 기반으로 분류된 고객의 정보들을 다시 이름, 머문 시간, 사용 금액을 통해

    오름차순|내림차순으로 정렬하여 화면에 출력한다.

 

 

세부 설명

초기화면

초기화면은 위와 같다.

1. 등급 분류 기준 (Classification Parameter)

1. Classification Parameter 선택 시 화면

  등급 분류 기준을 담은 싱글톤 객체는 Groups이며,

  Groups객체 하위에 Group[]을 기반으로 등급 분류 기준이 관리

  Group 객체는 필드로 [등급 분류, [머문 시간, 사용 금액]]을 소유

 

  1. Set Parameter
    초기에는 어떤 기준도 없는 상태로, 새로운 등급 분류 기준을 추가
    등급 분류 종류는 enum을 통해 관리하며, 등록된 등급은 1. Set Parameter를 통해 수정 불가
    만약, enum의 모든 등급 분류가 등록되었다면, 상위의 화면으로 복귀
  2. View Parameter
    단순히 현재 등록된 등급 분류 기준을 화면에 출력
    (현재 등록된이란, enum을 통해 관리되는 등급 분류 중, Group[]에 할당된 등급만을 의미)

  3. Update Parameter
    1. Set Parameter에서 등록한 등급 분류 기준 중 하나를 선택하여 세부 사항을 수정
    만약 등록된 등급 분류 기준이 없다면, 상위의 화면으로 복귀

  4. Back
    초기화면으로 복귀

2. Customer Data (고객 정보)

2. Customer Data 선택 시 화면

  모든 고객의 정보를 담은 싱글톤 객체 Customers와

  Customers 객체 하위의 Customer[]를 기반으로 고객 정보가 관리
  Customer 객체는 필드로 [시리얼번호, 이름, 아이디, 소모 시간, 사용 금액]을 소유

  1. Add Customer Data
    새로운 고객을 추가하기 위해 [이름, 아이디, 소모 시간, 사용 금액]을 입력 받음
    시리얼 번호는 Customer Class 하위의 static 형태의 변수에 의해 자동 생성

  2. View Customer Data
    모든 고객의 정보를 등록 순서대로 출력

  3. Update Customer Data
    모든 고객의 정보를 출력 후, 그중 수정을 원하는 고객을 선택
    선택된 Customer 객체를 출력 후
    1. Add Customer Data와 유사한 방식으로 입력받고 이를 저장

  4. Delete Customer Data
    모든 고객의 정보를 출력 후, 그 중 삭제를 원하는 고객을 선택
    Customer[] 에서 해당 index 삭제 후, null 공백이 생기지 않게 하기 위해
    해당 index이후의 유효한 data들을 앞으로 한 칸씩 당김

3. Summary

3. Summary 선택 시 화면

모든 고객을 등록된 등급 분류 기준으로 분류한 정보를 담을 싱글톤 객체 ClassifiedCustomersGroup과

해당 객체 내부에 등급 분류 기준으로 분류된 고객의 정보를 담는 배열 ClassifiedCustomers[]을 통해 정렬

 

먼저 해당 항목을 선택한 즉시 모든 고객의 정보를 그룹을 기준으로 분류한다.

(등록된 등급 분류 기준의 개수만큼 ClassifiedCustomers[] 는 유효한 index를 갖는다.)

  1. Summary
    앞서 언급한 시작과 동시에 그룹별로 분류된 고객의 정보를 출력

    (2.~4. 는 입력 직전에 DESCENDING과 ASCENDING을 선택하고 이를 기반으로 정렬)
  2. Summary (Sorted By Name)
    그룹별로 분류된 고객의 정보를 이름을 기준으로 정렬

  3. Summary(Sorted By Spent Time)
    그룹별로 분류된 고객의 정보를 소모 시간을 기준으로 정렬

  4. Summary(Sorted By Total Payment)
    그룹별로 분류된 고객의 정보를 사용 금액을 기준으로 정렬

 

 

배운 점

1. 배열로 생성하여 사용할 객체는 SingleTon으로 사용하면 안 된다는 것 학습했다.

SingleTon 클래스인 Customers를 상속받는 ClassifiedCustomers도 무작정 SingleTon이라 생각해서 난관을 겪었다.

두 객체 모두 Customer[]를 포함하고 있기 때문에 상속을 사용하였으나,

ClassifiedCustomersGroup에서 다시 ClassifiedCustomers[]로 사용하기 때문에

ClassifiedCustomers[]를 SingleTon으로 사용 시 배열의 모든 index가 하나의 객체를 공유한다.

 

2. 그룹화된 객체를 상속할 때의 관계에 대해 이해했다.

대분류를 대분류로 묶는 경우,

예를 들어 대학교 ⊃ 학과(ClassifiedCustomers) ⊃ 대학생(Customer)과 같은 경우이므로
이를 통해 설명하면

하나의 대학교는 학과들을, 하나의 학과는 대학생들을 포함한다. 

(다시 말해 특정 대학생들의 모임의 이름을 학과라고 지칭 가능하다.)

학과와 대학생들(Customers)은 같은 역할을 수행하므로

학과는 대학생들(Customers)를 상속받을 수 있다.

대학교와 학과들(ClassifiedCustomersGroup)은 같은 역할을 수행하므로

대학교를 나타내는 클래스가 존재한다면 이는 학과를 상속받을 수 있다.

 

3. 숙련도가 낮은 정규표현식에 대한 이해를 높였다.

다양한 방식의 정규표현식을 통한 입력값 유효성 검증을 통해 정규표현식을 한 층 더 깊게 이해했다.

(?!)

(?!)을 통한 대소문자 구별 X

괄호 안의 ^를 통한 특정 문자 입력 방지

 

외에도 등장 횟수를 나타내는 기호 없이 사용 시 (ex. [a-z][a-z][a-z])

이는 순서대로 문자 하나와 대응됨을 이해했다.

위의 예시의 경우 (abc, qwe, ret)만 Pattern.matches를 통해 matching이 가능하다.

 

4. Comparator 를 제대로 이해했다.

C++ 기준 간단히 아래와 같이 구현하는데,

bool cmp (int i, int j)
return i > j;

return 값이 i > j 일 때는 내림차순, j > i 일 때는 오름차순이라고 당연하게 받아들였었다.

Java에서는 이를 Comparator<>를 통해 구현하는데 C++과는 반대로

i > j일 때는 오름차순, j > i 일 때는 내림차순이였다.

반대로만 생각해서 사용해왔었는데,

Comparator<> cmp = new Comparator<>(){
    @Override
    public int compare(String String1, String String2){
    	return String1.compareTo(String2);
    }
}

위와 같이 String1.compareTo(String2)를 사용하는데 갑자기 혼란이 찾아왔고 간단한 방식으로 이해하기로 했다. (

위의 i > j 는 i - j > 0, j > i 는 j - i > 0 이다. 다시 String1.compareTo(String2)는 String1 - String2이다.

즉, String1 - String2 > 0 는 i - j > 0과 같고, 다시 i > j와 같으므로 오름차순,

     String2 - String 1 > 0 는 j - i > 0과 같고, 다시 j > i와 같으므로 내림차순으로 이해할 수 있다.

 

 

결론

최근에 나름 자바 공부를 열심히 했어서 자신 있었다. 그래서 한 번에 끝내기로 마음먹고 구현을 시작했고 결과적으로 12시간 가까이 걸렸다.

최대한 객체지향적 관점에서 구현하려고 노력했는데, 그러다 보니 객체와 메서드를 생성하는데 고민을 많이 했다.

정확하게 '이건 객체지향적으로 구현한 프로그램이다' 라고 말은 못 하겠지만

이전보다는 더 나아진 기분이 든다.

추가로 예외처리를 무식하게 처리했다고 생각돼서 이 부분을 추가로 학습해서

객체지향적 관점과 에러 처리가 깔끔하게 구현된 프로그램을 개발하기 위해 더 노력해야겠다.

 

 

완성 프로그램

cmd에서 위와같은 명령어를 통해 실행
SmartStore.jar
0.03MB

 

 

 

댓글