프로그래밍 3주차) 키오스크 과제 [도전기능 Level 1] / TIL day 18

하리비·2025년 3월 14일
2

📝 TIL

목록 보기
7/11
post-thumbnail

📖 개요


📌 시스템 환경

  • Java: 17
  • JDK: 17.0.1
  • IDE: IntelliJ

📌 요구사항

✔️ 필수기능

필수기능단계별요구사항
Level 1메뉴 출력하기, Scanner로 입력 받기 ( + 숫자 0 입력시 프로그램 종료 )
Level 2MenuItem 클래스 생성 (이름, 가격, 설명), List<MenuItem> 활용해 메뉴 목록 저장 + 출력
Level 3Kiosk 클래스 생성, start()로 프로그램 흐름 관리 ( + 메뉴 선택 기능 구현 )
Level 4Menu 클래스 생성, MenuItem을 카테고리별로 나누기
Level 5캡슐화 , Getter, Setter 활용하여 데이터 접근 및 수정

✔️ 도전기능

도전기능단계별요구사항
Level 1장바구니에 담기 (목록 + 금액 출력), 주문 완료 시 장바구니 초기화
Level 2Enum, 람다 & 스트림을 활용한 주문 및 장바구니 관리

📌 Git Hub 링크 & ReadMe



📖 구현한 기능


📌 실행예시


✔️ 카테고리별 메뉴 출력

  • 전체 메뉴를 카테고리별로 나누어 구성했고, 숫자 입력과 뒤로가기(0)번을 통해 필요한 카테고리로 쉽게 이동할 수있다.

✔️ 장바구니 기능

  • 선택한 메뉴를 장바구니에 추가할 수 있고, 장바구니에 담긴 아이템 리스트와 현재 장바구니의 총 금액을 확인할 수 있도록 했다.

✔️ 주문하기

  • 장바구니에 추가한 아이템들을 9번을 통해 주문할 수 있다.
  • 주문 완료시 내가 주문한 아이템들과 총 금액을 알 수 있다. (주문 완료 시 장바구니는 초기화)


📖 고민했던 부분


📌 요구사항을 잘 지키고 있는가?

  • 지난 과제 해설을 들으면서, 내가 과제의 요구사항을 준수하며 코딩했는지 다시 돌아보게 됐다. 레벨이 올라갈수록 요구사항을 제대로 지키는 게 중요하다는 걸 깨달았고, 이번에는 level 5까지의 필수 기능이 있는 만큼, 요구사항을 요약해 체크리스트처럼 정리하고 신경 쓰면서 구현하려고 했다.

📌 클래스 간의 관계

  • 레벨이 올라갈 때마다 새로운 클래스가 추가되고, 기존에 만든 객체를 이동해야 하거나 클래스간의 관계를 변경하면서 계속 혼란스러웠고 객체의 위치까지 헷갈리기 시작했다. 그래서 최대한 클래스 다이어그램을 그리면서 진행하려고 노력했다.

📌 객체의 위치

  • 가장 고민했던 건 메뉴 아이템 객체가 최종적으로 어디에 위치해야 하는지였다. 대분류-소분류 개념으로 접근하다 보니 상하 관계로만 생각하게 됐고, 나름 배운 개념을 활용해보겠다고 extends(상속)도 시도해봤다. 하지만 튜터님 피드백을 듣고 나서 내가 정반대로 접근했다는 걸 깨달았다.
  • 마지막으로 요구사항을 다시 한 번 확인해보니, 메뉴는 메인에서 관리했어야 하는 듯 하지만.. 제출일 전날 병가로 출석하지 못했던 터라 이 부분을 적용하지 못한 게 아쉬움으로 남는다...🥹

📌 리스트 사용 방식

  • 처음엔 메뉴 아이템을 카테고리별로 담은 리스트 3개카테고리 이름만 담은 리스트를 따로 만들었는데, 사실상 이 둘이 따로 존재할 필요가 없고 서로 연결되어야 하는데 이 부분 해결이 제일 헷갈렸던것 같다.
  • 튜터님께서 전체 메뉴 리스트 하나면 충분하다고 하셨고, 리스트 하나를 이용해서 카테고리를 필터링하기 위해 MenuItem 클래스에서 카테고리 속성을 추가하고, 객체에 하나씩 입력해 보기도 했다. (이건 아니라는 생각이 들었다..) 최종적으로는 Menu 클래스에 속성과 생성자를 추가하고, Kiosk에서 Menu 객체를 생성하는 방식으로 진행했다.


📋 트러블 슈팅


❶ List 관리

▪️ 문제

  • 객체들을 이리저리 이동하며 List의 관리 주체를 바꾸다보니 코드가 꼬였다.
  • 처음 내가 원한 건 "리스트 안에 리스트 안에 리스트" 처럼 계층적으로 데이터를 관리하는 방식이었는데, 이 방식은 효율적이지 않았다. (그러나 여기에 집착하느라 시간을 많이 낭비했다) 원하던 데이터 구조를 만드려면 다른 자료구조(HashMap, Enum)를 활용하면 되려나..? 싶었으나 아직 미숙한 관계로 사용하지 않기로 결정했다.

▪️ 해결방법

  • kiosk에서 menus(전체메뉴 리스트)를 사용하고, menu 객체 생성을 통해 카테고리 별로 필터링하기로 했다.


❷ 메서드 관리

▪️ 문제

  • 최대한 반복되는 코드를 줄이고 메서드를 적극 활용하고 싶었지만, 입출력을 정리하는 것이 어려웠다.
  • 계속 sout을 통해 수기로 출력하는 대신, 출력 기능을 메서드로 분리하고 싶었다. [전체 리스트 → 카테고리별 메뉴 → 특정 메뉴 선택] 과정에서 인덱스를 활용해 데이터를 가져오는 방법이 어려웠다. (menuItemselectMenuNum도 지금 보니 필요가 없다,,,😂)

▪️ 해결방법

  • 메서드들도 분리하고, 향상된 for문과 index값, 리스트의 크기 .size를 활용했다.

💡 배운점

  • 다양한 메서드들을 만들어 분리해 사용하는 것이 코드의 가독성을 높이고 중복 코드를 줄일 수 있다.

  • 나중에 수정할 때도 쉽다.


❸ 장바구니 만들기

▪️ 문제

  • 지난 과제에서 누적 연산을 했던 덕분에 처음엔 수월하게 구현했다. 그러나 착각도 잠시 누적 금액이 이상하게 계산되는 오류가 있었다.
  • 예를 들어 8,000원짜리 메뉴를 2번 담았을 때, 16,000원이 되어야 하는데
    (8,000) + (8,000 + 8,000) = 24,000원이 출력되는 것.
  • 누적합 계산을 위해 += 연산자를 사용했었는데 계속 틀린 값이 나와서 반복문을 계속 뜯어봤다.

▪️ 해결방법

  • totalPrice 값을 List<String>으로 관리하고 있었다. cart 초기화하면서 아무 생각 없이 복붙해서 만들었던 것,, ➡︎ int 타입으로 변경했다.

💡 배운점

  • 생각없이 코드 복붙하지 말자 😇

  • (팀원 분들과 해결했음) 해결이 안될 때는 다른 사람에게 보여주는 것도 나쁘지 않은 것 같다. 계속 이 코드를 봐서인지.. 이상한데 매몰되어 있어서인지 이 간단한 해결방법이 눈에 안들어오는 경우가 많았다.


❹ 메뉴판 금액, 장바구니 금액 차이

▪️ 문제

  • 메뉴판 가격을 감성 카페마냥 4500원 -> 4.5 이런식으로 표기하고 싶어서 double을 사용했다.
  • 장바구니에서는 4500원으로 출력하고 싶어서 int 타입으로 형변환을 했다.
    ➡︎ 세상에 뒷자리 백원단위가 사라지고 있었다.. 할인을 해주고 말았다..

▪️ 해결방법

  • (int)(item.getPrice())*1000; ➡︎ (int)((item.getPrice())*1000);

💡 배운점

  • 괄호 하나로 값이 완전히 달라질 수 있다. (어지간하면 정수형을 사용하자..)


❺ 예외 처리

▪️ 문제

  • 기존에 if로 인덱스 값을 벗어난 숫자에만 예외처리를 해뒀었기 때문에 문자열을 입력하면 프로그램이 멈췄다.
  • 예외처리를 카테고리 선택, 메뉴선택 등으로 기능을 나눴고, 고로 사용자에게 입력받은 숫자가 기능마다 다른 변수에 들어있었기에 수기로 일일히 try-catch를 여러번 작성하기로 했다 ➡︎ 코드가 지저분했다.

▪️ 해결방법

  • 각 메서드에서 직접 try-catch를 쓰는 대신, inputInteger()를 만들어 사용했다.

  • Integer.parseInt ➡︎ String타입의 숫자를 int로 바꿔준다, 이를 시도하며 예외를 잡는다!


❻ 디버깅

▪️ 문제

  • List에서 값을 받아서 사용하거나 다른 클래스에서 가져오고 하다보니 출력이 안되거나 값이 없는 경우 발생, 알고보니 데이터 자체가 넘어오지 않았다(!)

▪️ 해결방법

  • getter를 통해 확인해보기도 하고 list.size()를 찍어보면서 데이터가 어디서 안 들어오는지 일일히 확인했다.

💡 배운점

  • 하나씩 데이터를 찍어보는 습관을 들이자. 돌다리도 두드려보고..


🌟 나의 회고


오타, 형변환, 대소문자 입력 같은 잔실수가 너무 많다.
또 중요한 것은 잔실수들이 야기하는 오류는 꼭 나중에 확인하게 되는데, 수정할때 어느부분에서 실수한건지 찾는게 더 힘든 것 같다. 항상 데이터를 가져오면 찍어보는 습관을 들이자.

아직도 요구사항 그대로! 설계하지 못하는 것 같다. 레벨별로 클래스 다이어그램을 그리는게 나름 도움이 됐다고 생각했었는데.. 그냥 공부자체를 더 해야할 것 같다.

과제를 진행하면서 시간이 여러모로 많이 부족했다.
나는 아직 강의 내용도 다 숙지하지 못한 것 같은데.. 부딪혀보듯 코딩해보는게 맞는건가? 이런 생각도 꽤 자주했다. 지금 과제를 제출하기 직전 느낀 점은, 과제를 하는 과정에서 강의자료를 뒤지고 나랑 비슷한 상황을 찾아 구글링을 하기도 하고 이것저것 시도하다 보니 자연히 체득하는 내용이 더 오래가고 잊어버리지 않을 것 같다.
또한 이번 과제때는 시간때문에 구현하지 못한 부분들이 있어 너무 아쉬웠으므로 다음엔 시간분배를 잘 해야겠다.

0개의 댓글