상세 컨텐츠

본문 제목

[TIL#12] 내배캠 Chapter 2 프로그래밍 기초] 개인프로젝트 part.2

내배캠/작업물

by DK9 2023. 10. 23. 21:02

본문

<어제 검색해서 찾은 것들>

 : 없을 무

 

<데일리 루틴>

내배캠 공부

밥 잘 먹기

운동 (간만에 간다. 바벨들 다 뒤졌다. 그렇게 내가 뒤졌다.)

 

1. 최초 설계

 많은 문제를 내포하고 있지만 요약하면 요구사항을 오역했다.

  • 요구사항의 오역
    • 과제 기본 요구사항을 오역했다. 메뉴 클래스'이름', '설명' 필드 값 / 메뉴 클래스를 상품 클래스에 상속하여 메뉴클래스에는 '이름', '설명', '가격' 필드 값이 존재하기만 하면 되는데 오역하여 데이터를 입력하려고 했다. 해당 설계를 이용하여 구현할 수도 있겠지만, 설계 당시의 내 실력에 맞지 않는 설계였다. 설계와 나의 실력을 조율하는 것에만 설계를 4번을 갈아엎었다.
    • 불필요한 클래스들이 많았다. 제출본에 존재하는 클래스는 7개이지만, 최초 설계본은 10개의 클래스를 가지고 있다. 이 역시 제출본을 완성하고 보니 설계 당시 지식과 경험의 부족함에 따른 불필요한 설계 부분이라고 생각된다.
    • 멋도 모르고 한 설계임을 감안해서 보자.

2. 제출본

 제출본을 클래스별로 복기해 보겠다. 글자색깔 별로 매칭해서 읽으면 된다. 몇 개만 예시로 적용하겠다.

 1) Menu 클래스

가장 기초가 되는 메뉴 클래스이다. Menu라는 클래스타입은 문자열 타입namescript를 필드 값으로 가진다(=로 이루어진다)고 정의하고 있다.

 

 2) Goods 클래스

 마찬가지로 기초가 되는 상품 클래스이다. Goods라는 클래스타입은 Menu클래스 타입을 상속(extends)받았다. 그리고 double 타입의 price 를 필드 값으로 가진다. 그리고 Goods라는 클래스를 생성할 때는 입력 값(=매개변수)으로 문자열 name, script, double price가 필요하다. 각각의 매개변수들은 이(=this.) 클래스의 필드 값인 name, script, price에 대입(=저장=return)된다. 사진 상에 기재되지 않은 namescriptMenu클래스 타입을 상속받았기 때문에 Goods클래스가 자동으로 가지고 있다.

 상속이란 개념은 쉽게 말해 상속해 준 클래스(=부모)특징을 기반으로(필드 값, 메서드 등등) 상속받은 클래스(=자식)형성(추가, 수정)하는 것이다.

 

 3) MB 클래스

 편의와 연습을 위해 만든 MB 클래스이다. 완성하고 생각해 보니 불필요한 부분이다. 문자 출력하는 것들의 모음집이다.

 

 4) JangBag 클래스

 주문한 상품들을 담아두는 JangBag 장바구니다. 필드 값 name과 price 이외에 JangBag을 생성하고 받은 데이터들을 가져가서 사용할 수 있는 getter 메서드를 가지고 있다.

  • getter는 외부에서 해당 객체의 필드 값을 가져다 사용할 수 있도록 만든다.
  • 메서드 이름의 규칙은 get + 필드의 이름(첫 글자는 대문자)이다.
  • 사용하는 방법은 인스턴스 메서드 호출(도트연산자)과 동일하다.

 

 5) KioskInput 클래스

 입력받는 기능'만' 구현한 KioskInput클래스다. 매개변수는 Scanner를 통해 입력 값을 받도록 되어있다. 모두 숫자를 사용하기에 데이터 타입 또한 int로 만들었다. 사용하려는 곳에 객체화시켜서 메서드를 이용하도록 한다.

 

 6) MenuBorad 클래스

 

 Goods타입의 ArrayList 배열들을(= meats, rices 등) 저장해 놓고 int menuNum에 상응하는 배열을 호출하는 MD메서드를 가진 MenuBorad 클래스이다. 그리고 각 항목마다 번호를 매기고 싶었지만, 그냥 꼼수로 해결했다. int menuNum과 배열들을 매핑한 로직은 다음과 같다.

 

 

 

다음은 소스코드 Logic을 실행시키기 위한 Main클래스이다.

 

 7) Logic 클래스

마지막으로 위의 레고들을 조립해서 만든 Logic 클래스이다. 뜯어보며 살펴보겠다.

 우선 필요한 객체들을 인스턴스화했다. 제일 밑의 totalPrice는 장바구니 안에 보관된 메뉴들의 가격을 더하기 위해 선언했다.

 

 

 Logic클래스에 키오스크 번호 선택과 그에 맞는 분기를 나누는(10) select라는 메서드를 선언하고 JangBag타입의 ArrayList와 MenuBorad클래스 타입의 MD를 선언하고 생성했다. (13) int T는 번호표를 출력하기 위해 선언했고, 주문하기를 완료하면 T를 출력하고 T++;되도록 했다. T관련 부분은 조금 더 밑에 작성했다.

 while문으로 계속 반복되도록 했고 예외사항은 continue를 통해 해당 반복을 끝내고 다시 while문이 반복하도록 설정했다. 더 깔끔하게 하는 방법이 있겠지만 로직이 잘 안 짜여서 조금 무식하게 처리했다.

 (16) kInput1은 메인 화면에서 상품군을 선택할 때 입력하는 입력 숫 값이다. (17) 번 줄에서 Goods 타입의 ArrayList menuList를 생성하고 여기에 MenuBorad MD의 MD메서드를 대입했다. MD메서드의 매개변수는 kInput1에서 1을 뺀 int이다. MD메서드는 위쪽 6)에 기술해 놨다. 즉 6)의 매개변수 menuNum = kInput1-1이다.

 (18) kInput1 = 5 초과이면 메인 화면에 없는 번호이기에 예외처리(=해당 반복을 끝내고 다시 while)했다.

 

 

 (23) kInput = 4 일 때는 결제하는 부분이다. 후술 할 부분에 있는(24) jangBags에 저장한 값들을 forEach를 통하여 jangBag라는 별칭으로 하나씩 꺼내고 .get~~()로 사용하고 sout한다. 그리고 (26) 그 값들 중 price는 출력하지 않고 totalPrice에 따로 대입해서 합산하도록 했다. 여기서 getName, getPrice 이 부분은 위에 JangBag파트에 기술해 놨다.

 

 

 꺼내온 가격들을 합산한 totalPrice를 출력한다. (35) kinputP는 결제를 완료하기 위한 입력값을 받는다. 1번을 누르면 결제하기인데 결제하기를 했을 때 totalPrice가 0이라면 결제를 실행하지 않고 반복문을 종료하고 새로 시작한다.

 그런 상황이 아니라면 주문이 진행되고 T로 주문 번호를 출력하고 T++하고 해당 반복문을 종료하고 다시 반복문을 실행한다.

2번은 결제를 하지 않겠다는 선택지라서 주문한 메뉴들의 가격을 합산해 놓은 totalPrice를 초기화하고 if문을 종료하고

 

 

 하단부의 continue로 다시 while문을 실행한다.

 

 

 (56) 5번은 장바구니를 비우는 기능이다. 장바구니를 비우겠냐는 출력문을 내는 메서드 clear를 실행해 준다,

 (58) kinputJ는 제거와 관련된 입력 값이다. 1번은 장바구니를 비우는 입력이기에 (60)에서 배열 인스턴스 jangBags를 비워버린다. 2번은 그냥 continue 하고 나머지도 예외처리한다.

 

 

 주문할 메뉴를 고르는 부분이다. (17) 번 줄에서 호출된 menuList의 값들을 (74) forEach를 통하여 menu라는 별칭으로 하나씩 꺼내 사용하고 출력한다. 그리고 (77) 번 줄에서 메뉴 고르는 번호 값 kInput2를 생성한다. 이 부분은 위의 kInput1에 따라 각각 호출되는 menuList들의 항목 길이에 따라 선택지가 만들어지고 그 항목 길이는 각기 다르다. 따라서 선택지 범위를 벗어나는 예외처리를 하기 위해 menuList.size를 사용했다.

 

 

 마지막 부분이다. 대부분 위에 기술했던 것들과 동일하다. (86) 번 줄의 kInput3은 장바구니 추가에 1.예 2.아니오 를 진행하기 위한 부분이다.

 1번을 누르면 JangBag타입의 ArrayList jangBags에 새로운 JangBag타입을 생성하고 입력값으로 menuList에서 주문하려던 메뉴의 name, price를 가져온다.

2. 실행 결과

메인 화면

 : 1 or 2or 3 선택 시 

각 메뉴 선택 시

2번 선택 시 >>> 바로 메인 화면

1번 선택 시

 

주문 취소

 

 

3. 느낀 점

  • 오류처리
    • 계속 순환되게끔 하는 것으로 처리.
    • break와 continue 확실히 숙지하기.
    • 다른 방법 찾으면 적용해 보기
  • 장바구니 세팅하기
    • 계산 취소할 때 최종금액 저장 부분을 0으로 초기화하면 된다.
    • 방법은 다양하다. 시야를 조금 더 넓고 느슨하게
  • getter와 setter, Class와 객체 좀 더 확실하게.


<TMI. 운동 시간을 줄이기 위해 운동 프로그램을 바꿨다.>

관련글 더보기