From b3834d0a5f255a598c9d4bdef8f4e7b7833e322d Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 05:55:40 +0900 Subject: [PATCH 01/23] =?UTF-8?q?feat:=20=EB=A6=AC=EB=93=9C=EB=AF=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 92 +++++-------------------------------------------------- 1 file changed, 7 insertions(+), 85 deletions(-) diff --git a/README.md b/README.md index 86699576c..86b6b15b3 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,21 @@ # 미션 - 자판기 -## 🔍 진행방식 - -- 미션은 **기능 요구사항, 프로그래밍 요구사항, 과제 진행 요구사항** 세 가지로 구성되어 있다. -- 세 개의 요구사항을 만족하기 위해 노력한다. 특히 기능을 구현하기 전에 기능 목록을 만들고, 기능 단위로 커밋 하는 방식으로 진행한다. -- 기능 요구사항에 기재되지 않은 내용은 스스로 판단하여 구현한다. - -## ✉️ 미션 제출 방법 - -- 미션 구현을 완료한 후 GitHub을 통해 제출해야 한다. - - GitHub을 활용한 제출 방법은 [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고해 제출한다. -- GitHub에 미션을 제출한 후 [우아한테크코스 지원 플랫폼](https://apply.techcourse.co.kr) 에 접속하여 프리코스 과제를 제출한다. - - 자세한 방법은 [링크](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse#제출-가이드) 를 참고한다. - - **Pull Request만 보내고, 지원 플랫폼에서 과제를 제출하지 않으면 최종 제출하지 않은 것으로 처리되니 주의한다.** - -## ✔️ 과제 제출 전 체크리스트 - 0점 방지 - -- 터미널에서 `java -version`을 실행해 자바 8인지 확인한다. 또는 Eclipse, IntelliJ IDEA와 같은 IDE의 자바 8로 실행하는지 확인한다. -- 터미널에서 맥 또는 리눅스 사용자의 경우 `./gradlew clean test`, 윈도우 사용자의 경우 `gradlew.bat clean test` 명령을 실행했을 때 모든 테스트가 아래와 같이 통과하는지 확인한다. - -``` -BUILD SUCCESSFUL in 0s -``` - ---- - +반환되는 동전이 최소한이 되는 자판기를 구현한다. ## 🚀 기능 요구사항 -반환되는 동전이 최소한이 되는 자판기를 구현한다. - 자판기가 보유하고 있는 금액으로 동전을 무작위로 생성한다. - 투입 금액으로는 동전을 생성하지 않는다. - 잔돈을 돌려줄 때 현재 보유한 최소 개수의 동전으로 잔돈을 돌려준다. - 지폐를 잔돈으로 반환하는 경우는 없다고 가정한다. - 상품명, 가격, 수량을 입력하여 상품을 추가할 수 있다. - - 상품 가격은 100원부터 시작하며, 10원으로 나누어떨어져야 한다. + - 상품 가격은 100원부터 시작한다. + - 상품 가격은 10원으로 나누어떨어져야 한다. - 사용자가 투입한 금액으로 상품을 구매할 수 있다. - 남은 금액이 상품의 최저 가격보다 적거나, 모든 상품이 소진된 경우 바로 잔돈을 돌려준다. - 잔돈을 반환할 수 없는 경우 잔돈으로 반환할 수 있는 금액만 반환한다. - 반환되지 않은 금액은 자판기에 남는다. - 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 해당 부분부터 다시 입력을 받는다. -- 아래의 프로그래밍 실행 결과 예시와 동일하게 입력과 출력이 이루어져야 한다. ### ✍🏻 입출력 요구사항 @@ -108,60 +83,7 @@ BUILD SUCCESSFUL in 0s 50원 - 1개 ``` ---- - -## 🎱 프로그래밍 요구사항 - -- 프로그램을 실행하는 시작점은 `Application`의 `main()`이다. -- JDK 8 버전에서 실행 가능해야 한다. **JDK 8에서 정상 동작하지 않을 경우 0점 처리**한다. -- 자바 코드 컨벤션을 지키면서 프로그래밍한다. - - https://naver.github.io/hackday-conventions-java -- indent(인덴트, 들여쓰기) depth를 3이 넘지 않도록 구현한다. 2까지만 허용한다. - - 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다. - - 힌트: indent(인덴트, 들여쓰기) depth를 줄이는 좋은 방법은 함수(또는 메소드)를 분리하면 된다. -- 3항 연산자를 쓰지 않는다. -- 함수(또는 메소드)의 길이가 15라인을 넘어가지 않도록 구현한다. - - 함수(또는 메소드)가 한 가지 일만 잘 하도록 구현한다. -- else 예약어를 쓰지 않는다. - - 힌트: if 조건절에서 값을 return하는 방식으로 구현하면 else를 사용하지 않아도 된다. - - else를 쓰지 말라고 하니 switch/case로 구현하는 경우가 있는데 switch/case도 허용하지 않는다. -- 프로그래밍 요구사항에서 별도로 변경 불가 안내가 없는 경우 파일 수정과 패키지 이동을 자유롭게 할 수 있다. - -### 프로그래밍 요구사항 - Coin - -- Coin 클래스를 활용해 구현해야 한다. -- 필드(인스턴스 변수)인 `amount`의 접근 제어자 private을 변경할 수 없다. - -```java -public enum Coin { - COIN_500(500), - COIN_100(100), - COIN_50(50), - COIN_10(10); - - private final int amount; - - Coin(final int amount) { - this.amount = amount; - } - - // 추가 기능 구현 -} -``` - -### 프로그래밍 요구사항 - Randoms, Console - -- JDK에서 기본 제공하는 Random, Scanner API 대신 `camp.nextstep.edu.missionutils`에서 제공하는 `Randoms`, `Console` API를 활용해 구현해야 한다. - - Random 값 추출은 `camp.nextstep.edu.missionutils.Randoms`의 `pickNumberInList()`를 활용한다. - - 사용자가 입력하는 값은 `camp.nextstep.edu.missionutils.Console`의 `readLine()`을 활용한다. -- 프로그램 구현을 완료했을 때 `src/test/java` 디렉터리의 `ApplicationTest`에 있는 모든 테스트 케이스가 성공해야 한다. **테스트가 실패할 경우 0점 처리한다.** - ---- - -## 📈 과제 진행 요구사항 - -- 미션은 [java-vendingmachine-precourse](https://github.com/woowacourse/java-vendingmachine-precourse) 저장소를 Fork/Clone해 시작한다. -- **기능을 구현하기 전에 java-vendingmachine-precourse/docs/README.md 파일에 구현할 기능 목록을 정리**해 추가한다. -- **Git의 커밋 단위는 앞 단계에서 README.md 파일에 정리한 기능 목록 단위**로 추가한다. - - [AngularJS Commit Message Conventions](https://gist.github.com/stephenparish/9941e89d80e2bc58a153) 참고해 commit log를 남긴다. -- 과제 진행 및 제출 방법은 [프리코스 과제 제출 문서](https://github.com/woowacourse/woowacourse-docs/tree/master/precourse) 를 참고한다. +## 진행 시간 +- 11:40~12:10 +- 2:15~2:30 +- 4:35~ \ No newline at end of file From d6032eb9f876776d8aeb0fa119e5a52f34128470 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 05:55:53 +0900 Subject: [PATCH 02/23] =?UTF-8?q?feat:=20getter=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/{ => model}/Coin.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) rename src/main/java/vendingmachine/{ => model}/Coin.java (68%) diff --git a/src/main/java/vendingmachine/Coin.java b/src/main/java/vendingmachine/model/Coin.java similarity index 68% rename from src/main/java/vendingmachine/Coin.java rename to src/main/java/vendingmachine/model/Coin.java index c76293fbc..6779e7d40 100644 --- a/src/main/java/vendingmachine/Coin.java +++ b/src/main/java/vendingmachine/model/Coin.java @@ -1,4 +1,4 @@ -package vendingmachine; +package vendingmachine.model; public enum Coin { COIN_500(500), @@ -12,5 +12,7 @@ public enum Coin { this.amount = amount; } - // 추가 기능 구현 + public int getAmount() { + return amount; + } } From 58ddf68d38ff224fa2cdf1b58973b860794247db Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 05:56:05 +0900 Subject: [PATCH 03/23] =?UTF-8?q?feat:=20CoinController=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vendingmachine/controller/CoinController.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/vendingmachine/controller/CoinController.java diff --git a/src/main/java/vendingmachine/controller/CoinController.java b/src/main/java/vendingmachine/controller/CoinController.java new file mode 100644 index 000000000..761818c76 --- /dev/null +++ b/src/main/java/vendingmachine/controller/CoinController.java @@ -0,0 +1,14 @@ +package vendingmachine.controller; + +import static vendingmachine.view.InputView.input; +import static vendingmachine.view.OutputView.printHavingMoneyMessage; + +import vendingmachine.model.Coin; + +public class CoinController { + + public void initMoney() { + printHavingMoneyMessage(); + + } +} From 4b44d916effaf43e44cb5ef975a8ff2c07302619 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 05:56:30 +0900 Subject: [PATCH 04/23] =?UTF-8?q?feat:=20InputView,=20OutputView=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/view/InputView.java | 10 ++++++++++ src/main/java/vendingmachine/view/OutputView.java | 13 +++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 src/main/java/vendingmachine/view/InputView.java create mode 100644 src/main/java/vendingmachine/view/OutputView.java diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java new file mode 100644 index 000000000..c949af24e --- /dev/null +++ b/src/main/java/vendingmachine/view/InputView.java @@ -0,0 +1,10 @@ +package vendingmachine.view; + +import static camp.nextstep.edu.missionutils.Console.readLine; + +public class InputView { + + public static String input() { + return readLine(); + } +} diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java new file mode 100644 index 000000000..4eefd9a33 --- /dev/null +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -0,0 +1,13 @@ +package vendingmachine.view; + +public class OutputView { + + private static final String HAVING_MONEY_MESSAGE = "자판기가 보유하고 있는 금액을 입력해 주세요."; + private static final String HAVING_COIN_MESSAGE = "\n자판기가 보유한 동전"; + private static final String STOCK_MESSAGE = "\n상품명과 가격, 수량을 입력해 주세요."; + private static final String PURCHASING_MONEY_MESSAGE = "\n투입 금액을 입력해 주세요."; + + public static void printHavingMoneyMessage() { + System.out.println(HAVING_MONEY_MESSAGE); + } +} From d30e905b9c14d711f677b20f80a7428886094d33 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 05:56:46 +0900 Subject: [PATCH 05/23] =?UTF-8?q?feat:=20Coins=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/model/Coins.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/vendingmachine/model/Coins.java diff --git a/src/main/java/vendingmachine/model/Coins.java b/src/main/java/vendingmachine/model/Coins.java new file mode 100644 index 000000000..b53316965 --- /dev/null +++ b/src/main/java/vendingmachine/model/Coins.java @@ -0,0 +1,25 @@ +package vendingmachine.model; + +import static camp.nextstep.edu.missionutils.Randoms.pickNumberInList; + +import java.util.ArrayList; +import java.util.List; + +public class Coins { + + int size = Coin.values().length; + + private int[] Coins = new int[size]; + + public void initCoins(int total) { + Coin[] coinType = Coin.values(); + while(total > 0) { + for(int i = 0; i < size; i++) { + int possibleCoin = total / coinType[i].getAmount(); + if(possibleCoin > 1) { + Coins[i] += pickNumberInList(); + } + } + } + } +} From f23db6ce099d229e14e324b370d28e06bb004f4c Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 20:17:54 +0900 Subject: [PATCH 06/23] =?UTF-8?q?feat:=20=EB=B3=B4=EC=9C=A0=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EB=A7=8C=ED=81=BC=20=EB=8F=99=EC=A0=84=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CoinController.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/main/java/vendingmachine/controller/CoinController.java b/src/main/java/vendingmachine/controller/CoinController.java index 761818c76..ba96563a8 100644 --- a/src/main/java/vendingmachine/controller/CoinController.java +++ b/src/main/java/vendingmachine/controller/CoinController.java @@ -1,14 +1,61 @@ package vendingmachine.controller; +import static camp.nextstep.edu.missionutils.Randoms.pickNumberInList; import static vendingmachine.view.InputView.input; +import static vendingmachine.view.OutputView.printCoins; import static vendingmachine.view.OutputView.printHavingMoneyMessage; +import java.util.ArrayList; +import java.util.List; import vendingmachine.model.Coin; public class CoinController { + private static final int size = Coin.values().length; + private static int[] coins = new int[size]; + public void initMoney() { printHavingMoneyMessage(); + initCoins(Integer.parseInt(input())); + } + + public void initCoins(int total) { + Coin[] coinType = Coin.values(); + int index = 0; + while (total > 0) { + //동전 합이 total이 될 때까지 loop + //0부터 size까지를 왔다갔다할 인덱스 + int coinPrice = coinType[index].getAmount(); + //현재 index에 해당하는 동전의 액면가 + int possibleCoin = total / coinPrice; + //현재 index의 동전의 최대 개수 + List numberRange = makeNumberRange(possibleCoin); + //pickNumberInList의 매개변수 타입에 맞게 0부터 possibleCoin까지의 모든 수를 넣은 List + if (possibleCoin > 0) { + //가능한 코인 개수가 있으면 + int pickedNumber = pickNumberInList(numberRange); + //랜덤 돌려서 + coins[index] += pickedNumber; + //코인 개수에 추가 + total -= coinPrice * pickedNumber; + //while문 조건에 반영하기 위해 동전개수 * 액면가를 total에서 제해줌 + } + index++; + if (index == size) { + //모든 종류의 코인 다 돌았으면 + index = 0; + //Index 초기화 + } + } + //보유 금액만큼 동전 생성 후 출력 + printCoins(coins); + } + private static List makeNumberRange(int possibleCoin) { + List numberRange = new ArrayList<>(); + for (int i = 0; i <= possibleCoin; i++) { + numberRange.add(i); + } + return numberRange; } } From 3e26a3d68450a0c54041629fde9b59bb7661e933 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 20:18:06 +0900 Subject: [PATCH 07/23] =?UTF-8?q?feat:=20Coins=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/model/Coins.java | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 src/main/java/vendingmachine/model/Coins.java diff --git a/src/main/java/vendingmachine/model/Coins.java b/src/main/java/vendingmachine/model/Coins.java deleted file mode 100644 index b53316965..000000000 --- a/src/main/java/vendingmachine/model/Coins.java +++ /dev/null @@ -1,25 +0,0 @@ -package vendingmachine.model; - -import static camp.nextstep.edu.missionutils.Randoms.pickNumberInList; - -import java.util.ArrayList; -import java.util.List; - -public class Coins { - - int size = Coin.values().length; - - private int[] Coins = new int[size]; - - public void initCoins(int total) { - Coin[] coinType = Coin.values(); - while(total > 0) { - for(int i = 0; i < size; i++) { - int possibleCoin = total / coinType[i].getAmount(); - if(possibleCoin > 1) { - Coins[i] += pickNumberInList(); - } - } - } - } -} From e2e0cb8f30d0d4d5166d6554209aaa64010a5547 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 20:18:06 +0900 Subject: [PATCH 08/23] =?UTF-8?q?remove:=20Coins=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/model/Coins.java | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 src/main/java/vendingmachine/model/Coins.java diff --git a/src/main/java/vendingmachine/model/Coins.java b/src/main/java/vendingmachine/model/Coins.java deleted file mode 100644 index b53316965..000000000 --- a/src/main/java/vendingmachine/model/Coins.java +++ /dev/null @@ -1,25 +0,0 @@ -package vendingmachine.model; - -import static camp.nextstep.edu.missionutils.Randoms.pickNumberInList; - -import java.util.ArrayList; -import java.util.List; - -public class Coins { - - int size = Coin.values().length; - - private int[] Coins = new int[size]; - - public void initCoins(int total) { - Coin[] coinType = Coin.values(); - while(total > 0) { - for(int i = 0; i < size; i++) { - int possibleCoin = total / coinType[i].getAmount(); - if(possibleCoin > 1) { - Coins[i] += pickNumberInList(); - } - } - } - } -} From 9fa0c915abba3872704b577bbbad79b6ec33c05c Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 20:18:48 +0900 Subject: [PATCH 09/23] =?UTF-8?q?feat:=20=EB=B3=B4=EC=9C=A0=20=EC=BD=94?= =?UTF-8?q?=EC=9D=B8=20=EC=B6=9C=EB=A0=A5=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/view/OutputView.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java index 4eefd9a33..60c626a66 100644 --- a/src/main/java/vendingmachine/view/OutputView.java +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -1,13 +1,28 @@ package vendingmachine.view; +import vendingmachine.model.Coin; + public class OutputView { private static final String HAVING_MONEY_MESSAGE = "자판기가 보유하고 있는 금액을 입력해 주세요."; private static final String HAVING_COIN_MESSAGE = "\n자판기가 보유한 동전"; private static final String STOCK_MESSAGE = "\n상품명과 가격, 수량을 입력해 주세요."; private static final String PURCHASING_MONEY_MESSAGE = "\n투입 금액을 입력해 주세요."; + private static final String printForm = "%d원 - %d개"; + public static void printHavingMoneyMessage() { System.out.println(HAVING_MONEY_MESSAGE); } + + public static void printHavingCoinMessage() { + System.out.println(HAVING_COIN_MESSAGE); + } + + public static void printCoins(int[] coins) { + for (int i = 0; i < coins.length; i++) { + System.out.println(String.format(printForm, Coin.values()[i].getAmount(), coins[i])); + } + + } } From 70d42b8c5639bc8d398e5bd1c05d32fe62ac8ac9 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 20:20:23 +0900 Subject: [PATCH 10/23] =?UTF-8?q?feat:=20main=EC=97=90=EC=84=9C=20controll?= =?UTF-8?q?er=20=EC=9D=B8=EC=8A=A4=ED=84=B4=EC=8A=A4=20=EC=B4=88=EA=B8=B0?= =?UTF-8?q?=ED=99=94=20=EB=B0=8F=20=EB=B3=B4=EC=9C=A0=20=EB=8F=99=EC=A0=84?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/Application.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/vendingmachine/Application.java b/src/main/java/vendingmachine/Application.java index 9d3be447b..46525bb50 100644 --- a/src/main/java/vendingmachine/Application.java +++ b/src/main/java/vendingmachine/Application.java @@ -1,7 +1,10 @@ package vendingmachine; +import vendingmachine.controller.CoinController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + CoinController coinController = new CoinController(); + coinController.initMoney(); } } From e9ab128c13fff43a2ba4155ef84b2b81adb66886 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 21:53:49 +0900 Subject: [PATCH 11/23] =?UTF-8?q?feat:=20=ED=94=84=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EB=9E=A8=20=ED=9D=90=EB=A6=84=20=EC=A1=B0=EC=A0=95=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/Application.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/vendingmachine/Application.java b/src/main/java/vendingmachine/Application.java index 46525bb50..f635ec366 100644 --- a/src/main/java/vendingmachine/Application.java +++ b/src/main/java/vendingmachine/Application.java @@ -1,10 +1,21 @@ package vendingmachine; import vendingmachine.controller.CoinController; +import vendingmachine.controller.MoneyController; +import vendingmachine.controller.OrderController; +import vendingmachine.controller.ProductController; +import vendingmachine.model.Products; public class Application { public static void main(String[] args) { CoinController coinController = new CoinController(); - coinController.initMoney(); + ProductController productController = new ProductController(); + MoneyController moneyController = new MoneyController(); + OrderController orderController = new OrderController(); + + int[] coins = coinController.initMoney(); + Products products = productController.initStock(); + int money = moneyController.receiveMoney(); + orderController.makeOrder(products, money); } } From d477652f63631b3627f7bfde272bc09c616859c8 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 21:54:12 +0900 Subject: [PATCH 12/23] =?UTF-8?q?feat:=20return=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/vendingmachine/controller/CoinController.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/vendingmachine/controller/CoinController.java b/src/main/java/vendingmachine/controller/CoinController.java index ba96563a8..33bab4fb9 100644 --- a/src/main/java/vendingmachine/controller/CoinController.java +++ b/src/main/java/vendingmachine/controller/CoinController.java @@ -1,7 +1,7 @@ package vendingmachine.controller; import static camp.nextstep.edu.missionutils.Randoms.pickNumberInList; -import static vendingmachine.view.InputView.input; +import static vendingmachine.view.InputView.inputInteger; import static vendingmachine.view.OutputView.printCoins; import static vendingmachine.view.OutputView.printHavingMoneyMessage; @@ -14,12 +14,12 @@ public class CoinController { private static final int size = Coin.values().length; private static int[] coins = new int[size]; - public void initMoney() { + public int[] initMoney() { printHavingMoneyMessage(); - initCoins(Integer.parseInt(input())); + return initCoins(inputInteger()); } - public void initCoins(int total) { + private int[] initCoins(int total) { Coin[] coinType = Coin.values(); int index = 0; while (total > 0) { @@ -49,6 +49,7 @@ public void initCoins(int total) { } //보유 금액만큼 동전 생성 후 출력 printCoins(coins); + return coins; } private static List makeNumberRange(int possibleCoin) { From 9c838dfdda60ee9eae89223d96ef26e483c2cc4c Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 21:54:23 +0900 Subject: [PATCH 13/23] =?UTF-8?q?feat:=20int=20=EB=B3=80=ED=99=98=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/view/InputView.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java index c949af24e..ecff4dbb8 100644 --- a/src/main/java/vendingmachine/view/InputView.java +++ b/src/main/java/vendingmachine/view/InputView.java @@ -4,6 +4,10 @@ public class InputView { + public static int inputInteger() { + return Integer.parseInt(input()); + } + public static String input() { return readLine(); } From 046517418da177dc787b4da8dc7c1274c023ac04 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 21:54:35 +0900 Subject: [PATCH 14/23] =?UTF-8?q?feat:=20=EC=B6=9C=EB=A0=A5=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/view/OutputView.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java index 60c626a66..9e7e70b9f 100644 --- a/src/main/java/vendingmachine/view/OutputView.java +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -6,23 +6,26 @@ public class OutputView { private static final String HAVING_MONEY_MESSAGE = "자판기가 보유하고 있는 금액을 입력해 주세요."; private static final String HAVING_COIN_MESSAGE = "\n자판기가 보유한 동전"; - private static final String STOCK_MESSAGE = "\n상품명과 가격, 수량을 입력해 주세요."; + private static final String ORDER_MESSAGE = "\n상품명과 가격, 수량을 입력해 주세요."; private static final String PURCHASING_MONEY_MESSAGE = "\n투입 금액을 입력해 주세요."; private static final String printForm = "%d원 - %d개"; - public static void printHavingMoneyMessage() { System.out.println(HAVING_MONEY_MESSAGE); } - public static void printHavingCoinMessage() { - System.out.println(HAVING_COIN_MESSAGE); - } - public static void printCoins(int[] coins) { + System.out.println(HAVING_COIN_MESSAGE); for (int i = 0; i < coins.length; i++) { System.out.println(String.format(printForm, Coin.values()[i].getAmount(), coins[i])); } + } + + public static void printOrderMessage() { + System.out.println(ORDER_MESSAGE); + } + public static void printPurchasingMoneyMessage() { + System.out.println(PURCHASING_MONEY_MESSAGE); } } From a09f743e679ac75a0004c6fa513c1381e3d17af1 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 21:54:49 +0900 Subject: [PATCH 15/23] =?UTF-8?q?feat:=20=ED=88=AC=EC=9E=85=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=20=EC=9E=85=EB=A0=A5=20=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vendingmachine/controller/MoneyController.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/vendingmachine/controller/MoneyController.java diff --git a/src/main/java/vendingmachine/controller/MoneyController.java b/src/main/java/vendingmachine/controller/MoneyController.java new file mode 100644 index 000000000..07e458f79 --- /dev/null +++ b/src/main/java/vendingmachine/controller/MoneyController.java @@ -0,0 +1,12 @@ +package vendingmachine.controller; + +import static vendingmachine.view.InputView.inputInteger; +import static vendingmachine.view.OutputView.printPurchasingMoneyMessage; + +public class MoneyController { + + public int receiveMoney() { + printPurchasingMoneyMessage(); + return inputInteger(); + } +} From 60ffbb192e940fad056ddf9b8db6290ac425c832 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 21:55:05 +0900 Subject: [PATCH 16/23] =?UTF-8?q?feat:=20=EC=9E=AC=EA=B3=A0=20=EC=83=81?= =?UTF-8?q?=ED=92=88=EC=9D=98=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EB=8B=B4?= =?UTF-8?q?=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/vendingmachine/model/Product.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/main/java/vendingmachine/model/Product.java diff --git a/src/main/java/vendingmachine/model/Product.java b/src/main/java/vendingmachine/model/Product.java new file mode 100644 index 000000000..b746cade9 --- /dev/null +++ b/src/main/java/vendingmachine/model/Product.java @@ -0,0 +1,30 @@ +package vendingmachine.model; + +public class Product { + + private String name; + private int price; + private int stock; + + public Product(String name, int price, int stock) { + this.name = name; + this.price = price; + this.stock = stock; + } + + public String getName() { + return name; + } + + public int getPrice() { + return price; + } + + public int getStock() { + return stock; + } + + public void reduceStock() { + this.stock -= 1; + } +} From 027e16b4a6580ef49c713f4819deed5e322c2f70 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 21:55:16 +0900 Subject: [PATCH 17/23] =?UTF-8?q?feat:=20=EC=9E=AC=EA=B3=A0=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EC=A7=91=ED=95=A9=20=EA=B4=80=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=ED=81=B4=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/vendingmachine/model/Products.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/vendingmachine/model/Products.java diff --git a/src/main/java/vendingmachine/model/Products.java b/src/main/java/vendingmachine/model/Products.java new file mode 100644 index 000000000..c0e19bab3 --- /dev/null +++ b/src/main/java/vendingmachine/model/Products.java @@ -0,0 +1,21 @@ +package vendingmachine.model; + +import java.util.List; + +public class Products { + + private List products; + + public Products(List productList) { + this.products = productList; + } + + public List getProducts() { + return products; + } + + public Product getProductByName(String name) { + return products.stream().filter(product -> product.getName().equals(name)).findFirst() + .orElse(null); + } +} From 2e708f5c894b2d35c4fddcab4c92eee0a53318af Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 21:55:30 +0900 Subject: [PATCH 18/23] =?UTF-8?q?feat:=20=EC=9E=AC=EA=B3=A0=20=EC=83=81?= =?UTF-8?q?=ED=92=88=20=EC=A7=91=ED=95=A9=20controller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProductController.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/vendingmachine/controller/ProductController.java diff --git a/src/main/java/vendingmachine/controller/ProductController.java b/src/main/java/vendingmachine/controller/ProductController.java new file mode 100644 index 000000000..e2b87f186 --- /dev/null +++ b/src/main/java/vendingmachine/controller/ProductController.java @@ -0,0 +1,37 @@ +package vendingmachine.controller; + +import static vendingmachine.view.InputView.input; +import static vendingmachine.view.OutputView.printOrderMessage; + +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; +import vendingmachine.model.Product; +import vendingmachine.model.Products; + +public class ProductController { + + public Products initStock() { + printOrderMessage(); + return makeProductList(); + } + + private Products makeProductList() { + String stockInput = input(); + StringTokenizer semicolonSt = new StringTokenizer(stockInput, ";"); + List products = new ArrayList<>(); + return processProductInput(semicolonSt, products); + } + + private Products processProductInput(StringTokenizer semicolonSt, List productList) { + while (semicolonSt.hasMoreTokens()) { + String processingInput = semicolonSt.nextToken(); + processingInput = processingInput.replace("[", "").replace("]", ""); + String name = processingInput.split(",")[0]; + int price = Integer.parseInt(processingInput.split(",")[1]); + int stock = Integer.parseInt(processingInput.split(",")[2]); + productList.add(new Product(name, price, stock)); + } + return new Products(productList); + } +} From bb6a2330bcdea8064bce14486f2bf6aa88ef6ef1 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Tue, 26 Nov 2024 21:55:47 +0900 Subject: [PATCH 19/23] =?UTF-8?q?feat:=20=EC=A3=BC=EB=AC=B8=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20controller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vendingmachine/controller/OrderController.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/vendingmachine/controller/OrderController.java diff --git a/src/main/java/vendingmachine/controller/OrderController.java b/src/main/java/vendingmachine/controller/OrderController.java new file mode 100644 index 000000000..33ed408bd --- /dev/null +++ b/src/main/java/vendingmachine/controller/OrderController.java @@ -0,0 +1,13 @@ +package vendingmachine.controller; + +import static vendingmachine.view.InputView.input; + +import vendingmachine.model.Products; + +public class OrderController { + + public void makeOrder(Products products, int money) { + String purchasingItemName = input(); +// Product purchasingItem = + } +} From 89b32e233507134cb763b0b266de43568d2f7448 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Wed, 27 Nov 2024 02:10:13 +0900 Subject: [PATCH 20/23] =?UTF-8?q?feat:=20=EC=9D=BC=EC=A0=95=20=EC=A1=B0?= =?UTF-8?q?=EA=B1=B4=20=ED=95=98=EC=97=90=EC=84=9C=20=EC=A3=BC=EB=AC=B8=20?= =?UTF-8?q?=EA=B3=84=EC=86=8D=20=EB=B0=98=EB=B3=B5=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/OrderController.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/vendingmachine/controller/OrderController.java b/src/main/java/vendingmachine/controller/OrderController.java index 33ed408bd..b81a743f8 100644 --- a/src/main/java/vendingmachine/controller/OrderController.java +++ b/src/main/java/vendingmachine/controller/OrderController.java @@ -1,13 +1,30 @@ package vendingmachine.controller; +import static vendingmachine.controller.ProductController.minPrice; +import static vendingmachine.controller.ProductController.validateEmptyStock; +import static vendingmachine.model.Products.getProductByName; import static vendingmachine.view.InputView.input; +import static vendingmachine.view.OutputView.printPurchasingItemMessage; +import static vendingmachine.view.OutputView.printPurchasingMoney; +import vendingmachine.model.Product; import vendingmachine.model.Products; public class OrderController { - public void makeOrder(Products products, int money) { - String purchasingItemName = input(); -// Product purchasingItem = + public void makeOrder(Products products, int purchasingMoney) { + while (validateEmptyStock(products) && purchasingMoney > minPrice(products)) { + printPurchasingMoney(purchasingMoney); + //투입금액(남은금액) 출력 + printPurchasingItemMessage(); + String purchasingItemName = input(); + Product purchasingItem = getProductByName(purchasingItemName); + purchasingMoney -= purchasingItem.getPrice(); + } + giveChange(); + } + + public void giveChange() { + } } From 565f5657be2a1f1e26cb4b40ec169eeb2e231853 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Wed, 27 Nov 2024 02:10:36 +0900 Subject: [PATCH 21/23] =?UTF-8?q?feat:=20=ED=88=AC=EC=9E=85=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EA=B3=BC=20=EC=95=88=EB=82=B4=EB=AC=B8=EA=B5=AC=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=20=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vendingmachine/controller/ProductController.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/vendingmachine/controller/ProductController.java b/src/main/java/vendingmachine/controller/ProductController.java index e2b87f186..37a027d0d 100644 --- a/src/main/java/vendingmachine/controller/ProductController.java +++ b/src/main/java/vendingmachine/controller/ProductController.java @@ -34,4 +34,14 @@ private Products processProductInput(StringTokenizer semicolonSt, List } return new Products(productList); } + + public static boolean validateEmptyStock(Products products) { + //재고가 하나라도 있으면 진행 가능 + return products.getProducts().stream().anyMatch(product -> product.getStock() > 0); + } + + public static int minPrice(Products products) { + return products.getProducts().stream().mapToInt(Product::getPrice).min() + .orElse(Integer.MAX_VALUE); + } } From 81e10ce21582ea11336c1f96db382757c3cfc007 Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Wed, 27 Nov 2024 02:10:36 +0900 Subject: [PATCH 22/23] =?UTF-8?q?feat:=20=EC=9E=AC=EA=B3=A0=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=ED=99=95=EC=9D=B8,=20=EA=B0=80=EA=B2=A9=20?= =?UTF-8?q?=EC=A4=91=20=EC=B5=9C=EC=86=8C=EA=B0=92=20=ED=99=95=EC=9D=B8=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vendingmachine/controller/ProductController.java | 10 ++++++++++ src/main/java/vendingmachine/view/OutputView.java | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/java/vendingmachine/controller/ProductController.java b/src/main/java/vendingmachine/controller/ProductController.java index e2b87f186..37a027d0d 100644 --- a/src/main/java/vendingmachine/controller/ProductController.java +++ b/src/main/java/vendingmachine/controller/ProductController.java @@ -34,4 +34,14 @@ private Products processProductInput(StringTokenizer semicolonSt, List } return new Products(productList); } + + public static boolean validateEmptyStock(Products products) { + //재고가 하나라도 있으면 진행 가능 + return products.getProducts().stream().anyMatch(product -> product.getStock() > 0); + } + + public static int minPrice(Products products) { + return products.getProducts().stream().mapToInt(Product::getPrice).min() + .orElse(Integer.MAX_VALUE); + } } diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java index 9e7e70b9f..29c94d708 100644 --- a/src/main/java/vendingmachine/view/OutputView.java +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -8,6 +8,8 @@ public class OutputView { private static final String HAVING_COIN_MESSAGE = "\n자판기가 보유한 동전"; private static final String ORDER_MESSAGE = "\n상품명과 가격, 수량을 입력해 주세요."; private static final String PURCHASING_MONEY_MESSAGE = "\n투입 금액을 입력해 주세요."; + private static final String PURCHASING_MONEY = "\n투입 금액: %d원"; + private static final String PURCHASING_ITEM_MASSAGE = "구매할 상품명을 입력해 주세요."; private static final String printForm = "%d원 - %d개"; public static void printHavingMoneyMessage() { @@ -28,4 +30,12 @@ public static void printOrderMessage() { public static void printPurchasingMoneyMessage() { System.out.println(PURCHASING_MONEY_MESSAGE); } + + public static void printPurchasingMoney(int money) { + System.out.println(String.format(PURCHASING_MONEY, money)); + } + + public static void printPurchasingItemMessage() { + System.out.println(PURCHASING_ITEM_MASSAGE); + } } From bc44def39d85deed2845192ef1dfddd71cd57c3e Mon Sep 17 00:00:00 2001 From: woojin cheon Date: Wed, 27 Nov 2024 02:12:09 +0900 Subject: [PATCH 23/23] =?UTF-8?q?feat:=20=EB=A6=AC=EB=93=9C=EB=AF=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 86b6b15b3..6dfeaf59b 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,22 @@ # 미션 - 자판기 반환되는 동전이 최소한이 되는 자판기를 구현한다. -## 🚀 기능 요구사항 +## 🚀 기능 요구사항 - 자판기가 보유하고 있는 금액으로 동전을 무작위로 생성한다. - - 투입 금액으로는 동전을 생성하지 않는다. + - 투입 금액으로는 동전을 생성하지 않는다. - 잔돈을 돌려줄 때 현재 보유한 최소 개수의 동전으로 잔돈을 돌려준다. - 지폐를 잔돈으로 반환하는 경우는 없다고 가정한다. - 상품명, 가격, 수량을 입력하여 상품을 추가할 수 있다. - - 상품 가격은 100원부터 시작한다. - - 상품 가격은 10원으로 나누어떨어져야 한다. + - 상품 가격은 100원부터 시작한다. + - 상품 가격은 10원으로 나누어떨어져야 한다. - 사용자가 투입한 금액으로 상품을 구매할 수 있다. - 남은 금액이 상품의 최저 가격보다 적거나, 모든 상품이 소진된 경우 바로 잔돈을 돌려준다. - 잔돈을 반환할 수 없는 경우 잔돈으로 반환할 수 있는 금액만 반환한다. - - 반환되지 않은 금액은 자판기에 남는다. -- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 해당 부분부터 다시 입력을 받는다. + - 반환되지 않은 금액은 자판기에 남는다. +- 사용자가 잘못된 값을 입력할 경우 `IllegalArgumentException`를 발생시키고, "[ERROR]"로 시작하는 에러 메시지를 출력 후 해당 부분부터 다시 입력을 + 받는다. ### ✍🏻 입출력 요구사항 @@ -81,9 +82,4 @@ 잔돈 100원 - 4개 50원 - 1개 -``` - -## 진행 시간 -- 11:40~12:10 -- 2:15~2:30 -- 4:35~ \ No newline at end of file +``` \ No newline at end of file