[우테코] 프리코스 3주차 미션 - 자판기

6613 단어 우테코우테코

2주차 피드백
1. 기능목록을 너무 상세히 적지 않는다
- 예외상황 기록
- 수정해나가면서 추가
2. 매직넘버 등 상수 처리
3. 축약 x
4. 함수 라인에 대한 기준
- 주석 및 공백도 라인이다..
5. 객체에 메시지를 보내라
6. 필드(인스턴스)의 수를 줄이기 위해 노력한다
7. 비즈니스 로직과 UI를 분리해라

2주차 피드백에서 궁금했던 내용들이 나와 속이 좀 시원했다...
기능목록을 어떻게 쓰는지 궁금했었는데 나름 괜찮게? 한 것 같다
근데 예시를 보아도 도메인안의 패키지별로 나눠서 기능목록 작성한 것들이 이뻐보인다.. 뭐가 더 좋은지 궁금하다
또 비즈니스와 UI 로직 분리도 알게되었다!
이번 미션은 좀 더 큼직한 미션으로 클래스간의 연결이 목표다
그리고 미션 요구사항보다 좀 더 극단적인 연습을 해보려고 노력했다
(객체지향생활체조원칙, 들여쓰기 1이하로 해보자, 함수길이 8이하로 해보자, 필드 수 1개 이하 등등)


🚀 기능 요구사항

반환되는 동전이 최소한이 되는 자판기를 구현한다.

  • 자판기가 보유하고 있는 금액으로 동전을 무작위로 생성한다.
    • 투입 금액으로는 동전을 생성하지 않는다.
  • 잔돈을 돌려줄 때 현재 보유한 최소 개수의 동전으로 잔돈을 돌려준다.
  • 지폐를 잔돈으로 반환하는 경우는 없다고 가정한다.
  • 상품명, 가격, 수량을 입력하여 상품을 추가할 수 있다.
    • 상품 가격은 100원부터 시작하며, 10원으로 나누어떨어져야 한다.
  • 사용자가 투입한 금액으로 상품을 구매할 수 있다.
  • 남은 금액이 상품의 최저 가격보다 적거나, 모든 상품이 소진된 경우 바로 잔돈을 돌려준다.
  • 잔돈을 반환할 수 없는 경우 잔돈으로 반환할 수 있는 금액만 반환한다.
    • 반환되지 않은 금액은 자판기에 남는다.
  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 해당 부분부터 다시 입력을 받는다.
  • 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다.

✍🏻 입출력 요구사항

⌨️ 입력

  • 상품명, 가격, 수량은 쉼표로, 개별 상품은 대괄호([])로 묶어 세미콜론(;)으로 구분한다.
[콜라,1500,20];[사이다,1000,10]

🖥 출력

  • 자판기가 보유한 동전
500원 - 0개
100원 - 4개
50원 - 1개
10원 - 0개
  • 잔돈은 반환된 동전만 출력한다.
100원 - 4개
50원 - 1개
  • 예외 상황 시 에러 문구를 출력해야 한다. 단, 에러 문구는 [ERROR]로 시작해야 한다.
[ERROR] 금액은 숫자여야 합니다.

💻 프로그래밍 실행 결과 예시

자판기가 보유하고 있는 금액을 입력해 주세요.
450

자판기가 보유한 동전
500원 - 0개
100원 - 4개
50원 - 1개
10원 - 0개

상품명과 가격, 수량을 입력해 주세요.
[콜라,1500,20];[사이다,1000,10]

투입 금액을 입력해 주세요.
3000

투입 금액: 3000원
구매할 상품명을 입력해 주세요.
콜라

투입 금액: 1500원
구매할 상품명을 입력해 주세요.
사이다

투입 금액: 500원
잔돈
100원 - 4개
50원 - 1개

기능 목록

  • 자판기 보유하고 있는 금액을 입력받는다
    • 금액이 숫자인지 확인한다
    • 금액이 10으로 나눠떨어지는지 확인한다
  • 금액을 입력받으면 금액에 맞게 동전을 무작위로 생성한다
    • 무작위로 생성될 수 있는 코인의 조합을 계산한다
    • 최적의 동전 조합을 계산한다
    • 동전 조합을 담은 리스트를 반환한다
  • 자판기는 10, 50, 100, 500원 동전을 갖는다
    • 총 금액에서 해당 동전의 금액만큼 몇개가 카운트될 수 있는지 계산한다
    • 총 금액에서 해당 동전의 금액보다 낮아질 때까지 금액을 차감한다
    • 코인을 하나씩 꺼내올 수 있도록 한다
    • 투입금액으로는 동전을 생성하지 않는다(추가적인 동전 생성은 없음, 고정)
  • 자판기가 보유한 동전 개수를 보여준다
  • 상품명과 가격, 수량을 입력받는다
    • 상품명, 가격, 수량은 쉼표(,)로 구분한다
    • 개별 상품은 대괄호([])로 묶어 세미콜론(;)으로 구분한다
    • 상품 가격은 100원부터 시작하는지 확인한다
    • 상품 가격은 10원으로 나눠떨어지는지 확인한다
  • 사용자에게 투입 금액을 입력받는다
    • 금액이 숫자인지 확인한다
    • 금액이 10으로 나눠떨어지는지 확인한다
  • 투입 금액(현재 남은 금액)을 출력한다
  • 사용자에게 상품을 입력받는다
    • 사용자가 상품을 구매하면 수량을 차감한다
    • 사용자가 상품을 구매하면 금액을 가격만큼 차감한다
  • 현재 남은 금액이 상품 최저 가격보다 적거나 모든 상품이 소진되면 잔돈을 반환한다
    • 현재 남은 금액이 상품 최저 가격보다 적은지 확인한다
    • 모든 상품이 소진됐는지 확인한다
    • 잔돈이 1000원이 넘을 경우(상품이 모두 소진될 경우) 1000원 이하로 낮춘다 (지폐를 잔돈으로 반환하는 경우 x)
    • 잔돈은 자판기에 남은 최소 동전 개수로 반환한다
  • 사용자는 반복해서 물건을 구입할 수 있다
    • 일치하는 상품명이 있는지 체크한다
    • 상품명이 빈칸인지 확인한다
    • 모두 소진된 상품을 선택하는지 확인한다
  • 에러가 발생하면 해당 부분부터 다시 입력 받는다
    • 에러가 발생하면 "[ERROR]"로 시작하는 에러 메시지를 출력한다
  • 사용자에게 필요한 안내문구를 출력한다

미션 진행하면서 체크했던 연습

한 메서드에 오직 한 단계의 들여 쓰기만 한다.
else 예약어를 쓰지 않는다.
모든 원시 값과 문자열을 포장한다.
한 줄에 점을 하나만 찍는다.
줄여 쓰지 않는다(축약 금지).
모든 엔티티를 작게 유지한다.
3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.
일급 컬렉션을 쓴다.
getter/setter/프로퍼티를 쓰지 않는다.

함수길이를 10줄이하로
클래스 전체크기 50줄이하로

줄쳐지지 않은 부분은 지켜지지 않은 것 같다...!
쉽게 할 수 있을 줄 알았는데 어떻게 해야할지 막막한 것들이 많았다
앞으로 하나씩 해나가면서 어떻게 하는지 학습해야겠다


배운 것들

  1. 예외처리
    • 예외처리를 비즈니스 로직에 해야한다!
    • 아직 확신은 없다...
  2. 함수, 클래스 분리
    • 위 연습들을 토대로 진행해보니 더 분리를 진행할 수 있었다
  3. stream()
    • 함수형 프로그래밍 사용
    • 아직 익숙하지 않지만 계속 쓰다보면 익숙해질 것
  4. 정규식
    • 정규식을 통해 에러 검증을 할 수 있었다

소감

하면서 좀 어려웠다...그래서 더 열심히 해야겠다는 생각이 들었고
위 연습들을 바탕으로 하나씩 진행하다보니 내가 이런 코드를 만들 수 있다는 것을 느낄 수 있어서 되게 재밌게 할 수 있었다
이제 최종 미션 테스트가 남아있는데 잘 준비해서 합격하고 싶다

좋은 웹페이지 즐겨찾기