<어제 검색해서 찾은 것들>
: 없을 무
<데일리 루틴>
내배캠 공부
밥 잘 먹기
운동 (간만에 간다. 바벨들 다 뒤졌다. 그렇게 내가 뒤졌다.)
많은 문제를 내포하고 있지만 요약하면 요구사항을 오역했다.
제출본을 클래스별로 복기해 보겠다. 글자색깔 별로 매칭해서 읽으면 된다. 몇 개만 예시로 적용하겠다.
가장 기초가 되는 메뉴 클래스이다. Menu라는 클래스타입은 문자열 타입의 name과 script를 필드 값으로 가진다(=로 이루어진다)고 정의하고 있다.
마찬가지로 기초가 되는 상품 클래스이다. Goods라는 클래스타입은 Menu클래스 타입을 상속(extends)받았다. 그리고 double 타입의 price 를 필드 값으로 가진다. 그리고 Goods라는 클래스를 생성할 때는 입력 값(=매개변수)으로 문자열 name, script, double price가 필요하다. 각각의 매개변수들은 이(=this.) 클래스의 필드 값인 name, script, price에 대입(=저장=return)된다. 사진 상에 기재되지 않은 name과 script는 Menu클래스 타입을 상속받았기 때문에 Goods클래스가 자동으로 가지고 있다.
상속이란 개념은 쉽게 말해 상속해 준 클래스(=부모)의 특징을 기반으로(필드 값, 메서드 등등) 상속받은 클래스(=자식)를 형성(추가, 수정)하는 것이다.
편의와 연습을 위해 만든 MB 클래스이다. 완성하고 생각해 보니 불필요한 부분이다. 문자 출력하는 것들의 모음집이다.
주문한 상품들을 담아두는 JangBag 장바구니다. 필드 값 name과 price 이외에 JangBag을 생성하고 받은 데이터들을 가져가서 사용할 수 있는 getter 메서드를 가지고 있다.
입력받는 기능'만' 구현한 KioskInput클래스다. 매개변수는 Scanner를 통해 입력 값을 받도록 되어있다. 모두 숫자를 사용하기에 데이터 타입 또한 int로 만들었다. 사용하려는 곳에 객체화시켜서 메서드를 이용하도록 한다.
Goods타입의 ArrayList 배열들을(= meats, rices 등) 저장해 놓고 int menuNum에 상응하는 배열을 호출하는 MD메서드를 가진 MenuBorad 클래스이다. 그리고 각 항목마다 번호를 매기고 싶었지만, 그냥 꼼수로 해결했다. int menuNum과 배열들을 매핑한 로직은 다음과 같다.
다음은 소스코드 Logic을 실행시키기 위한 Main클래스이다.
마지막으로 위의 레고들을 조립해서 만든 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를 가져온다.
메인 화면
: 1 or 2or 3 선택 시
각 메뉴 선택 시
2번 선택 시 >>> 바로 메인 화면
1번 선택 시
주문 취소
<TMI. 운동 시간을 줄이기 위해 운동 프로그램을 바꿨다.>
[TIL#10-2 내배캠 Chapter 2 프로그래밍 기초] 개인프로젝트 part.1 (0) | 2023.10.18 |
---|---|
[TIL#10-1 내배캠 Chapter 2 프로그래밍 기초] 숙제2 (1) | 2023.10.18 |
[TIL#7 내배캠 Chapter 2 프로그래밍 기초] 숙제1 심화 학습 (1) | 2023.10.15 |
[TIL#6-2 내배캠 Chapter 2 프로그래밍 기초] 숙제1 (0) | 2023.10.13 |