From 3c87e6ca1b7bea45dd77b0468f123d99a8d16099 Mon Sep 17 00:00:00 2001 From: HongYeseul Date: Wed, 22 Nov 2023 15:13:00 +0900 Subject: [PATCH 1/9] =?UTF-8?q?:art:=20style():=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=EC=A0=9D=ED=8A=B8=EC=97=90=20=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=EC=A1=B0=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/Application.java | 5 ++++- .../java/vendingmachine/controller/MainController.java | 8 ++++++++ src/main/java/vendingmachine/{ => model}/Coin.java | 2 +- src/main/java/vendingmachine/view/InputView.java | 4 ++++ src/main/java/vendingmachine/view/OutputView.java | 4 ++++ 5 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 src/main/java/vendingmachine/controller/MainController.java rename src/main/java/vendingmachine/{ => model}/Coin.java (88%) 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/Application.java b/src/main/java/vendingmachine/Application.java index 9d3be447b..5513270f7 100644 --- a/src/main/java/vendingmachine/Application.java +++ b/src/main/java/vendingmachine/Application.java @@ -1,7 +1,10 @@ package vendingmachine; +import vendingmachine.controller.MainController; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + MainController mainController = new MainController(); + mainController.run(); } } diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java new file mode 100644 index 000000000..2cbeed06d --- /dev/null +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -0,0 +1,8 @@ +package vendingmachine.controller; + +public class MainController { + + public void run(){ + + } +} diff --git a/src/main/java/vendingmachine/Coin.java b/src/main/java/vendingmachine/model/Coin.java similarity index 88% rename from src/main/java/vendingmachine/Coin.java rename to src/main/java/vendingmachine/model/Coin.java index c76293fbc..011cb3c62 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), diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java new file mode 100644 index 000000000..126e50dbd --- /dev/null +++ b/src/main/java/vendingmachine/view/InputView.java @@ -0,0 +1,4 @@ +package vendingmachine.view; + +public class InputView { +} diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java new file mode 100644 index 000000000..2a53e8a58 --- /dev/null +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -0,0 +1,4 @@ +package vendingmachine.view; + +public class OutputView { +} From e82d14ea7126e109c842826dcca5a4e4bff85cb6 Mon Sep 17 00:00:00 2001 From: HongYeseul Date: Wed, 22 Nov 2023 16:03:03 +0900 Subject: [PATCH 2/9] =?UTF-8?q?:sparkles:=20feat(VendingMachine):=20?= =?UTF-8?q?=EC=9E=90=ED=8C=90=EA=B8=B0=EA=B0=80=20=EB=B3=B4=EC=9C=A0?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EC=9E=88=EB=8A=94=20=EA=B8=88=EC=95=A1=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=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 --- .../controller/MainController.java | 24 +++++++++++++++++++ .../controller/VendingMachineController.java | 13 ++++++++++ .../controller/handler/RetryHandler.java | 17 +++++++++++++ .../handler/RetryHandlerController.java | 5 ++++ src/main/java/vendingmachine/model/Coins.java | 11 +++++++++ .../vendingmachine/model/VendingMachine.java | 10 ++++++++ .../java/vendingmachine/view/InputView.java | 13 ++++++++++ .../java/vendingmachine/view/OutputView.java | 14 +++++++++++ .../view/constants/ErrorMessage.java | 7 ++++++ .../view/constants/Message.java | 6 +++++ .../view/constants/OutputMessage.java | 5 ++++ .../vendingmachine/view/constants/Regex.java | 5 ++++ .../view/validate/InputValidator.java | 17 +++++++++++++ 13 files changed, 147 insertions(+) create mode 100644 src/main/java/vendingmachine/controller/VendingMachineController.java create mode 100644 src/main/java/vendingmachine/controller/handler/RetryHandler.java create mode 100644 src/main/java/vendingmachine/controller/handler/RetryHandlerController.java create mode 100644 src/main/java/vendingmachine/model/Coins.java create mode 100644 src/main/java/vendingmachine/model/VendingMachine.java create mode 100644 src/main/java/vendingmachine/view/constants/ErrorMessage.java create mode 100644 src/main/java/vendingmachine/view/constants/Message.java create mode 100644 src/main/java/vendingmachine/view/constants/OutputMessage.java create mode 100644 src/main/java/vendingmachine/view/constants/Regex.java create mode 100644 src/main/java/vendingmachine/view/validate/InputValidator.java diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java index 2cbeed06d..ccd97098c 100644 --- a/src/main/java/vendingmachine/controller/MainController.java +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -1,8 +1,32 @@ package vendingmachine.controller; +import vendingmachine.model.VendingMachine; +import vendingmachine.view.InputView; +import vendingmachine.view.OutputView; + +import javax.xml.bind.ValidationEvent; + +import static vendingmachine.view.InputView.readTotalMoney; +import static vendingmachine.view.OutputView.askMachineTotalMoney; + public class MainController { + VendingMachineController vendingMachineController = new VendingMachineController(); public void run(){ + VendingMachine vendingMachine = askTotalMoney(); } + + private VendingMachine askTotalMoney(){ + while (true){ + try { + askMachineTotalMoney(); + return new VendingMachine(InputView.readTotalMoney()); + } catch (IllegalArgumentException exception) { + OutputView.errorMessage(exception.getMessage()); + } + } + } + + } diff --git a/src/main/java/vendingmachine/controller/VendingMachineController.java b/src/main/java/vendingmachine/controller/VendingMachineController.java new file mode 100644 index 000000000..cbc2e2476 --- /dev/null +++ b/src/main/java/vendingmachine/controller/VendingMachineController.java @@ -0,0 +1,13 @@ +package vendingmachine.controller; + +import vendingmachine.controller.handler.RetryHandler; +import vendingmachine.model.VendingMachine; +import vendingmachine.view.InputView; + +public class VendingMachineController extends RetryHandler { + + @Override + public VendingMachine doProcess() { + return new VendingMachine(InputView.readTotalMoney()); + } +} diff --git a/src/main/java/vendingmachine/controller/handler/RetryHandler.java b/src/main/java/vendingmachine/controller/handler/RetryHandler.java new file mode 100644 index 000000000..c0fefcf19 --- /dev/null +++ b/src/main/java/vendingmachine/controller/handler/RetryHandler.java @@ -0,0 +1,17 @@ +package vendingmachine.controller.handler; + +import vendingmachine.view.OutputView; + +public abstract class RetryHandler implements RetryHandlerController { + @Override + public E process() { + try { + return doProcess(); + } catch (IllegalArgumentException exception) { + OutputView.errorMessage(exception.getMessage()); + return process(); + } + } + + protected abstract E doProcess(); +} diff --git a/src/main/java/vendingmachine/controller/handler/RetryHandlerController.java b/src/main/java/vendingmachine/controller/handler/RetryHandlerController.java new file mode 100644 index 000000000..1f07025f1 --- /dev/null +++ b/src/main/java/vendingmachine/controller/handler/RetryHandlerController.java @@ -0,0 +1,5 @@ +package vendingmachine.controller.handler; + +public interface RetryHandlerController { + E process(); +} diff --git a/src/main/java/vendingmachine/model/Coins.java b/src/main/java/vendingmachine/model/Coins.java new file mode 100644 index 000000000..ffd1c730c --- /dev/null +++ b/src/main/java/vendingmachine/model/Coins.java @@ -0,0 +1,11 @@ +package vendingmachine.model; + +import java.util.HashMap; + +public class Coins { + private HashMap coins; + + public Coins(int totalMoney){ + + } +} diff --git a/src/main/java/vendingmachine/model/VendingMachine.java b/src/main/java/vendingmachine/model/VendingMachine.java new file mode 100644 index 000000000..3aa91791e --- /dev/null +++ b/src/main/java/vendingmachine/model/VendingMachine.java @@ -0,0 +1,10 @@ +package vendingmachine.model; + +public class VendingMachine { + private Coins moneyBox; + + + public VendingMachine(int totalMoney) { + + } +} diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java index 126e50dbd..e68505fe1 100644 --- a/src/main/java/vendingmachine/view/InputView.java +++ b/src/main/java/vendingmachine/view/InputView.java @@ -1,4 +1,17 @@ package vendingmachine.view; +import camp.nextstep.edu.missionutils.Console; + +import static vendingmachine.view.validate.InputValidator.checkNumericInput; + public class InputView { + public static String readLine(){ + return Console.readLine(); + } + + public static int readTotalMoney(){ + String totalMoney = readLine(); + checkNumericInput(totalMoney); + return Integer.parseInt(totalMoney); + } } diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java index 2a53e8a58..e3ac58db2 100644 --- a/src/main/java/vendingmachine/view/OutputView.java +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -1,4 +1,18 @@ package vendingmachine.view; +import static vendingmachine.view.constants.ErrorMessage.ERROR_TAG; +import static vendingmachine.view.constants.OutputMessage.ASK_TOTAL_MONEY_OF_VENDING_MACHINE; + public class OutputView { + public static void askMachineTotalMoney(){ + print(ASK_TOTAL_MONEY_OF_VENDING_MACHINE); + } + + private static void print(String message){ + System.out.println(message); + } + + public static void errorMessage(String errorMessage) { + System.out.println(ERROR_TAG + errorMessage); + } } diff --git a/src/main/java/vendingmachine/view/constants/ErrorMessage.java b/src/main/java/vendingmachine/view/constants/ErrorMessage.java new file mode 100644 index 000000000..e1ac99ada --- /dev/null +++ b/src/main/java/vendingmachine/view/constants/ErrorMessage.java @@ -0,0 +1,7 @@ +package vendingmachine.view.constants; + +public class ErrorMessage { + public static final String ERROR_TAG = "[ERROR] "; + + public static final String INVALID_VENDING_MACHINE_TOTAL_MONEY = "금액은 숫자여야 합니다."; +} diff --git a/src/main/java/vendingmachine/view/constants/Message.java b/src/main/java/vendingmachine/view/constants/Message.java new file mode 100644 index 000000000..7d6e82274 --- /dev/null +++ b/src/main/java/vendingmachine/view/constants/Message.java @@ -0,0 +1,6 @@ +package vendingmachine.view.constants; + +public class Message { + public static final String ASK_TOTAL_COIN_OF_VENDING_MACHINE = "자판기가 보유하고 있는 금액을 입력해 주세요."; + +} diff --git a/src/main/java/vendingmachine/view/constants/OutputMessage.java b/src/main/java/vendingmachine/view/constants/OutputMessage.java new file mode 100644 index 000000000..6f49fab42 --- /dev/null +++ b/src/main/java/vendingmachine/view/constants/OutputMessage.java @@ -0,0 +1,5 @@ +package vendingmachine.view.constants; + +public class OutputMessage { + public static final String ASK_TOTAL_MONEY_OF_VENDING_MACHINE = "자판기가 보유하고 있는 금액을 입력해 주세요."; +} diff --git a/src/main/java/vendingmachine/view/constants/Regex.java b/src/main/java/vendingmachine/view/constants/Regex.java new file mode 100644 index 000000000..9d847da9e --- /dev/null +++ b/src/main/java/vendingmachine/view/constants/Regex.java @@ -0,0 +1,5 @@ +package vendingmachine.view.constants; + +public class Regex { + public static final String REGEX_MONEY_NUMERIC = "(^[1-9])\\d*"; +} diff --git a/src/main/java/vendingmachine/view/validate/InputValidator.java b/src/main/java/vendingmachine/view/validate/InputValidator.java new file mode 100644 index 000000000..c81b52101 --- /dev/null +++ b/src/main/java/vendingmachine/view/validate/InputValidator.java @@ -0,0 +1,17 @@ +package vendingmachine.view.validate; + +import java.util.regex.Pattern; + +import static vendingmachine.view.constants.ErrorMessage.INVALID_VENDING_MACHINE_TOTAL_MONEY; +import static vendingmachine.view.constants.Regex.REGEX_MONEY_NUMERIC; + +public class InputValidator { + private static final Pattern NUMERIC = Pattern.compile(REGEX_MONEY_NUMERIC); + + public static void checkNumericInput(String input) { + if (NUMERIC.matcher(input).matches()) { + return; + } + throw new IllegalArgumentException(INVALID_VENDING_MACHINE_TOTAL_MONEY); + } +} From 5124e25f4b2625832c896be49459bf0e81b6e1db Mon Sep 17 00:00:00 2001 From: HongYeseul Date: Wed, 22 Nov 2023 16:31:21 +0900 Subject: [PATCH 3/9] =?UTF-8?q?:sparkles:=20feat(VendingMachine):=20?= =?UTF-8?q?=EC=9E=90=ED=8C=90=EA=B8=B0=EA=B0=80=20=EB=B3=B4=EC=9C=A0?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EC=9E=88=EB=8A=94=20=EB=9E=9C=EB=8D=A4=20?= =?UTF-8?q?=EB=8F=99=EC=A0=84=20=EC=83=9D=EC=84=B1=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 | 15 ++++++++++- src/main/java/vendingmachine/model/Coins.java | 4 +-- .../vendingmachine/model/RandomCoins.java | 25 +++++++++++++++++++ .../vendingmachine/model/VendingMachine.java | 5 ++-- 4 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 src/main/java/vendingmachine/model/RandomCoins.java diff --git a/src/main/java/vendingmachine/model/Coin.java b/src/main/java/vendingmachine/model/Coin.java index 011cb3c62..13d17927b 100644 --- a/src/main/java/vendingmachine/model/Coin.java +++ b/src/main/java/vendingmachine/model/Coin.java @@ -1,5 +1,9 @@ package vendingmachine.model; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public enum Coin { COIN_500(500), COIN_100(100), @@ -12,5 +16,14 @@ public enum Coin { this.amount = amount; } - // 추가 기능 구현 + public static List coinTypes(){ + List types = new ArrayList<>(); + Arrays.stream(Coin.values()) + .forEach(coin -> types.add(coin.amount)); + return types; + } + + public static Coin getCoinType(int amount){ + return Coin.valueOf("COIN_" + amount); + } } diff --git a/src/main/java/vendingmachine/model/Coins.java b/src/main/java/vendingmachine/model/Coins.java index ffd1c730c..1ee55381f 100644 --- a/src/main/java/vendingmachine/model/Coins.java +++ b/src/main/java/vendingmachine/model/Coins.java @@ -5,7 +5,7 @@ public class Coins { private HashMap coins; - public Coins(int totalMoney){ - + public Coins(HashMap coins) { + this.coins = coins; } } diff --git a/src/main/java/vendingmachine/model/RandomCoins.java b/src/main/java/vendingmachine/model/RandomCoins.java new file mode 100644 index 000000000..8a712ce95 --- /dev/null +++ b/src/main/java/vendingmachine/model/RandomCoins.java @@ -0,0 +1,25 @@ +package vendingmachine.model; + +import camp.nextstep.edu.missionutils.Randoms; + +import java.util.HashMap; + +public class RandomCoins { + public static HashMap makeRandomCoins(int totalMoney){ + HashMap moneyBox = new HashMap<>(); + while(totalMoney >= 0){ + int coin = Randoms.pickNumberInList(Coin.coinTypes()); + Coin coinType = Coin.getCoinType(coin); + if (totalMoney >= coin) { + if (moneyBox.containsKey(Coin.getCoinType(coin))) { + moneyBox.put(coinType, moneyBox.get(coinType)+1); + } + if (!moneyBox.containsKey(Coin.getCoinType(coin))) { + moneyBox.put(coinType, 1); + } + totalMoney -= coin; + } + } + return moneyBox; + } +} diff --git a/src/main/java/vendingmachine/model/VendingMachine.java b/src/main/java/vendingmachine/model/VendingMachine.java index 3aa91791e..11102cbf4 100644 --- a/src/main/java/vendingmachine/model/VendingMachine.java +++ b/src/main/java/vendingmachine/model/VendingMachine.java @@ -1,10 +1,11 @@ package vendingmachine.model; +import static vendingmachine.model.RandomCoins.makeRandomCoins; + public class VendingMachine { private Coins moneyBox; - public VendingMachine(int totalMoney) { - + moneyBox = new Coins(makeRandomCoins(totalMoney)); } } From 8364a13e1b89338683bd428892ddc71ef901f57a Mon Sep 17 00:00:00 2001 From: HongYeseul Date: Wed, 22 Nov 2023 16:55:41 +0900 Subject: [PATCH 4/9] =?UTF-8?q?:sparkles:=20feat(VendingMachine):=20?= =?UTF-8?q?=EC=9E=90=ED=8C=90=EA=B8=B0=EA=B0=80=20=EB=B3=B4=EC=9C=A0?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EC=9E=88=EB=8A=94=20=EB=9E=9C=EB=8D=A4=20?= =?UTF-8?q?=EB=8F=99=EC=A0=84=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MainController.java | 12 +++++++----- src/main/java/vendingmachine/model/Coins.java | 19 +++++++++++++++++++ .../vendingmachine/model/RandomCoins.java | 2 +- .../vendingmachine/model/VendingMachine.java | 6 ++++++ .../java/vendingmachine/view/OutputView.java | 14 ++++++++++++++ .../view/constants/OutputMessage.java | 2 ++ 6 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java index ccd97098c..a2cc2dec8 100644 --- a/src/main/java/vendingmachine/controller/MainController.java +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -4,17 +4,15 @@ import vendingmachine.view.InputView; import vendingmachine.view.OutputView; -import javax.xml.bind.ValidationEvent; - -import static vendingmachine.view.InputView.readTotalMoney; import static vendingmachine.view.OutputView.askMachineTotalMoney; +import static vendingmachine.view.OutputView.printVendingMachineCoins; public class MainController { - VendingMachineController vendingMachineController = new VendingMachineController(); +// VendingMachineController vendingMachineController = new VendingMachineController(); public void run(){ VendingMachine vendingMachine = askTotalMoney(); - + showCoins(vendingMachine); } private VendingMachine askTotalMoney(){ @@ -28,5 +26,9 @@ private VendingMachine askTotalMoney(){ } } + private void showCoins(VendingMachine vendingMachine) { + printVendingMachineCoins(vendingMachine.showCoinBox()); + } + } diff --git a/src/main/java/vendingmachine/model/Coins.java b/src/main/java/vendingmachine/model/Coins.java index 1ee55381f..d6d65dd37 100644 --- a/src/main/java/vendingmachine/model/Coins.java +++ b/src/main/java/vendingmachine/model/Coins.java @@ -1,6 +1,8 @@ package vendingmachine.model; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; public class Coins { private HashMap coins; @@ -8,4 +10,21 @@ public class Coins { public Coins(HashMap coins) { this.coins = coins; } + + public List coinsCount() { + List count = new ArrayList<>(); + count.add(getCoinCount("COIN_500")); + count.add(getCoinCount("COIN_100")); + count.add(getCoinCount("COIN_50")); + count.add(getCoinCount("COIN_10")); + return count; + } + + private Integer getCoinCount(String coinType) { + Integer coinCount = coins.get(Coin.valueOf(coinType)); + if (coinCount == null) { + return 0; + } + return coinCount; + } } diff --git a/src/main/java/vendingmachine/model/RandomCoins.java b/src/main/java/vendingmachine/model/RandomCoins.java index 8a712ce95..ab67cde4b 100644 --- a/src/main/java/vendingmachine/model/RandomCoins.java +++ b/src/main/java/vendingmachine/model/RandomCoins.java @@ -7,7 +7,7 @@ public class RandomCoins { public static HashMap makeRandomCoins(int totalMoney){ HashMap moneyBox = new HashMap<>(); - while(totalMoney >= 0){ + while(totalMoney > 0){ int coin = Randoms.pickNumberInList(Coin.coinTypes()); Coin coinType = Coin.getCoinType(coin); if (totalMoney >= coin) { diff --git a/src/main/java/vendingmachine/model/VendingMachine.java b/src/main/java/vendingmachine/model/VendingMachine.java index 11102cbf4..c1848e90d 100644 --- a/src/main/java/vendingmachine/model/VendingMachine.java +++ b/src/main/java/vendingmachine/model/VendingMachine.java @@ -1,5 +1,7 @@ package vendingmachine.model; +import java.util.List; + import static vendingmachine.model.RandomCoins.makeRandomCoins; public class VendingMachine { @@ -8,4 +10,8 @@ public class VendingMachine { public VendingMachine(int totalMoney) { moneyBox = new Coins(makeRandomCoins(totalMoney)); } + + public List showCoinBox() { + return moneyBox.coinsCount(); + } } diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java index e3ac58db2..3b3636e15 100644 --- a/src/main/java/vendingmachine/view/OutputView.java +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -1,13 +1,27 @@ package vendingmachine.view; +import java.util.List; + import static vendingmachine.view.constants.ErrorMessage.ERROR_TAG; import static vendingmachine.view.constants.OutputMessage.ASK_TOTAL_MONEY_OF_VENDING_MACHINE; +import static vendingmachine.view.constants.OutputMessage.SHOW_VENDING_MACHINE_COINS; +import static vendingmachine.view.constants.OutputMessage.SHOW_VENDING_MACHINE_HOLD_COIN_START_TAG; public class OutputView { public static void askMachineTotalMoney(){ print(ASK_TOTAL_MONEY_OF_VENDING_MACHINE); } + public static void printVendingMachineCoins(List coinCounts){ + print(SHOW_VENDING_MACHINE_HOLD_COIN_START_TAG); + print(String.format(SHOW_VENDING_MACHINE_COINS, + coinCounts.get(0), + coinCounts.get(1), + coinCounts.get(2), + coinCounts.get(3) + )); + } + private static void print(String message){ System.out.println(message); } diff --git a/src/main/java/vendingmachine/view/constants/OutputMessage.java b/src/main/java/vendingmachine/view/constants/OutputMessage.java index 6f49fab42..2800c1099 100644 --- a/src/main/java/vendingmachine/view/constants/OutputMessage.java +++ b/src/main/java/vendingmachine/view/constants/OutputMessage.java @@ -2,4 +2,6 @@ public class OutputMessage { public static final String ASK_TOTAL_MONEY_OF_VENDING_MACHINE = "자판기가 보유하고 있는 금액을 입력해 주세요."; + public static final String SHOW_VENDING_MACHINE_HOLD_COIN_START_TAG = "자판기가 보유한 동전"; + public static final String SHOW_VENDING_MACHINE_COINS = "500원 - %d개\n100원 - %d개\n50원 - %d개\n10원 - %d개"; } From 5f88b75a8fb3f53d36820dff4530121df0df1036 Mon Sep 17 00:00:00 2001 From: HongYeseul Date: Wed, 22 Nov 2023 17:12:17 +0900 Subject: [PATCH 5/9] =?UTF-8?q?:art:=20style(coin):=20=EB=8F=99=EC=A0=84?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/vendingmachine/model/{ => coin}/Coin.java | 2 +- src/main/java/vendingmachine/model/{ => coin}/Coins.java | 2 +- src/main/java/vendingmachine/model/{ => coin}/RandomCoins.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/vendingmachine/model/{ => coin}/Coin.java (94%) rename src/main/java/vendingmachine/model/{ => coin}/Coins.java (95%) rename src/main/java/vendingmachine/model/{ => coin}/RandomCoins.java (95%) diff --git a/src/main/java/vendingmachine/model/Coin.java b/src/main/java/vendingmachine/model/coin/Coin.java similarity index 94% rename from src/main/java/vendingmachine/model/Coin.java rename to src/main/java/vendingmachine/model/coin/Coin.java index 13d17927b..38811dda8 100644 --- a/src/main/java/vendingmachine/model/Coin.java +++ b/src/main/java/vendingmachine/model/coin/Coin.java @@ -1,4 +1,4 @@ -package vendingmachine.model; +package vendingmachine.model.coin; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/vendingmachine/model/Coins.java b/src/main/java/vendingmachine/model/coin/Coins.java similarity index 95% rename from src/main/java/vendingmachine/model/Coins.java rename to src/main/java/vendingmachine/model/coin/Coins.java index d6d65dd37..8895388a1 100644 --- a/src/main/java/vendingmachine/model/Coins.java +++ b/src/main/java/vendingmachine/model/coin/Coins.java @@ -1,4 +1,4 @@ -package vendingmachine.model; +package vendingmachine.model.coin; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/main/java/vendingmachine/model/RandomCoins.java b/src/main/java/vendingmachine/model/coin/RandomCoins.java similarity index 95% rename from src/main/java/vendingmachine/model/RandomCoins.java rename to src/main/java/vendingmachine/model/coin/RandomCoins.java index ab67cde4b..72bb096ae 100644 --- a/src/main/java/vendingmachine/model/RandomCoins.java +++ b/src/main/java/vendingmachine/model/coin/RandomCoins.java @@ -1,4 +1,4 @@ -package vendingmachine.model; +package vendingmachine.model.coin; import camp.nextstep.edu.missionutils.Randoms; From 136dd882be4ba8d542fa944b81be472c6df57ced Mon Sep 17 00:00:00 2001 From: HongYeseul Date: Wed, 22 Nov 2023 17:41:42 +0900 Subject: [PATCH 6/9] =?UTF-8?q?:sparkles:=20feat(drink):=20=EC=9E=90?= =?UTF-8?q?=ED=8C=90=EA=B8=B0=EA=B0=80=20=EA=B0=80=EC=A7=80=EA=B3=A0=20?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20=EC=9D=8C=EB=A3=8C=20=EC=A2=85=EB=A5=98=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=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 --- .../controller/MainController.java | 30 ++++++++++++++----- .../controller/VendingMachineController.java | 13 -------- .../vendingmachine/model/VendingMachine.java | 11 ++++--- .../model/constants/Delimiter.java | 6 ++++ .../vendingmachine/model/constants/Index.java | 7 +++++ .../vendingmachine/model/drink/Drink.java | 13 ++++++++ .../vendingmachine/model/drink/Drinks.java | 27 +++++++++++++++++ .../java/vendingmachine/view/InputView.java | 9 +++++- .../java/vendingmachine/view/OutputView.java | 5 ++++ .../view/constants/ErrorMessage.java | 4 ++- .../view/constants/Message.java | 6 ---- .../view/constants/OutputMessage.java | 2 ++ .../vendingmachine/view/constants/Regex.java | 4 ++- ...InputValidator.java => CoinValidator.java} | 2 +- .../view/validate/DrinkValidator.java | 17 +++++++++++ 15 files changed, 121 insertions(+), 35 deletions(-) delete mode 100644 src/main/java/vendingmachine/controller/VendingMachineController.java create mode 100644 src/main/java/vendingmachine/model/constants/Delimiter.java create mode 100644 src/main/java/vendingmachine/model/constants/Index.java create mode 100644 src/main/java/vendingmachine/model/drink/Drink.java create mode 100644 src/main/java/vendingmachine/model/drink/Drinks.java delete mode 100644 src/main/java/vendingmachine/view/constants/Message.java rename src/main/java/vendingmachine/view/validate/{InputValidator.java => CoinValidator.java} (94%) create mode 100644 src/main/java/vendingmachine/view/validate/DrinkValidator.java diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java index a2cc2dec8..ce0c58ec1 100644 --- a/src/main/java/vendingmachine/controller/MainController.java +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -1,9 +1,13 @@ package vendingmachine.controller; -import vendingmachine.model.VendingMachine; +import vendingmachine.model.coin.Coins; +import vendingmachine.model.drink.Drinks; import vendingmachine.view.InputView; import vendingmachine.view.OutputView; +import static vendingmachine.model.coin.RandomCoins.makeRandomCoins; +import static vendingmachine.view.InputView.readDrinks; +import static vendingmachine.view.OutputView.askDrinkFromUsers; import static vendingmachine.view.OutputView.askMachineTotalMoney; import static vendingmachine.view.OutputView.printVendingMachineCoins; @@ -11,24 +15,34 @@ public class MainController { // VendingMachineController vendingMachineController = new VendingMachineController(); public void run(){ - VendingMachine vendingMachine = askTotalMoney(); - showCoins(vendingMachine); + Coins coins = askTotalMoney(); + showCoins(coins); + askDrinks(); } - private VendingMachine askTotalMoney(){ + private Coins askTotalMoney(){ while (true){ try { askMachineTotalMoney(); - return new VendingMachine(InputView.readTotalMoney()); + return new Coins(makeRandomCoins(InputView.readTotalMoney())); } catch (IllegalArgumentException exception) { OutputView.errorMessage(exception.getMessage()); } } } - private void showCoins(VendingMachine vendingMachine) { - printVendingMachineCoins(vendingMachine.showCoinBox()); + private void showCoins(Coins coins) { + printVendingMachineCoins(coins.coinsCount()); } - + private Drinks askDrinks() { + while (true) { + try { + askDrinkFromUsers(); + return new Drinks(readDrinks()); + } catch (IllegalArgumentException exception) { + OutputView.errorMessage(exception.getMessage()); + } + } + } } diff --git a/src/main/java/vendingmachine/controller/VendingMachineController.java b/src/main/java/vendingmachine/controller/VendingMachineController.java deleted file mode 100644 index cbc2e2476..000000000 --- a/src/main/java/vendingmachine/controller/VendingMachineController.java +++ /dev/null @@ -1,13 +0,0 @@ -package vendingmachine.controller; - -import vendingmachine.controller.handler.RetryHandler; -import vendingmachine.model.VendingMachine; -import vendingmachine.view.InputView; - -public class VendingMachineController extends RetryHandler { - - @Override - public VendingMachine doProcess() { - return new VendingMachine(InputView.readTotalMoney()); - } -} diff --git a/src/main/java/vendingmachine/model/VendingMachine.java b/src/main/java/vendingmachine/model/VendingMachine.java index c1848e90d..2f9986b75 100644 --- a/src/main/java/vendingmachine/model/VendingMachine.java +++ b/src/main/java/vendingmachine/model/VendingMachine.java @@ -1,14 +1,17 @@ package vendingmachine.model; -import java.util.List; +import vendingmachine.model.coin.Coins; +import vendingmachine.model.drink.Drinks; -import static vendingmachine.model.RandomCoins.makeRandomCoins; +import java.util.List; public class VendingMachine { private Coins moneyBox; + private Drinks drinks; - public VendingMachine(int totalMoney) { - moneyBox = new Coins(makeRandomCoins(totalMoney)); + public VendingMachine(Coins moneyBox, Drinks drinks) { + this.moneyBox = moneyBox; + this.drinks = drinks; } public List showCoinBox() { diff --git a/src/main/java/vendingmachine/model/constants/Delimiter.java b/src/main/java/vendingmachine/model/constants/Delimiter.java new file mode 100644 index 000000000..76d02f72e --- /dev/null +++ b/src/main/java/vendingmachine/model/constants/Delimiter.java @@ -0,0 +1,6 @@ +package vendingmachine.model.constants; + +public class Delimiter { + public static final String DRINK_TYPE_DELIMITER_SEMICOLON = ";"; + public static final String DRINK_DETAIL_DELIMITER_COMMA = ","; +} diff --git a/src/main/java/vendingmachine/model/constants/Index.java b/src/main/java/vendingmachine/model/constants/Index.java new file mode 100644 index 000000000..5cc1153c9 --- /dev/null +++ b/src/main/java/vendingmachine/model/constants/Index.java @@ -0,0 +1,7 @@ +package vendingmachine.model.constants; + +public class Index { + public static Integer DRINK_TYPE_INDEX = 0; + public static Integer DRINK_PRICE_INDEX = 1; + public static Integer DRINK_COUNT_INDEX = 2; +} diff --git a/src/main/java/vendingmachine/model/drink/Drink.java b/src/main/java/vendingmachine/model/drink/Drink.java new file mode 100644 index 000000000..0081d8211 --- /dev/null +++ b/src/main/java/vendingmachine/model/drink/Drink.java @@ -0,0 +1,13 @@ +package vendingmachine.model.drink; + +public class Drink { + private String title; + private Integer price; + private Integer count; + + public Drink(String title, Integer price, Integer count) { + this.title = title; + this.price = price; + this.count = count; + } +} diff --git a/src/main/java/vendingmachine/model/drink/Drinks.java b/src/main/java/vendingmachine/model/drink/Drinks.java new file mode 100644 index 000000000..ae733774a --- /dev/null +++ b/src/main/java/vendingmachine/model/drink/Drinks.java @@ -0,0 +1,27 @@ +package vendingmachine.model.drink; + +import java.util.ArrayList; +import java.util.List; + +import static vendingmachine.model.constants.Delimiter.DRINK_DETAIL_DELIMITER_COMMA; +import static vendingmachine.model.constants.Delimiter.DRINK_TYPE_DELIMITER_SEMICOLON; +import static vendingmachine.model.constants.Index.DRINK_COUNT_INDEX; +import static vendingmachine.model.constants.Index.DRINK_PRICE_INDEX; +import static vendingmachine.model.constants.Index.DRINK_TYPE_INDEX; + +public class Drinks { + List drinks = new ArrayList<>(); + + public Drinks(String inputDrink) { + String[] drinkTypes = inputDrink.split(DRINK_TYPE_DELIMITER_SEMICOLON); + + for(int i=0; i coinCounts){ )); } + public static void askDrinkFromUsers() { + print(ASK_DRINKS); + } + private static void print(String message){ System.out.println(message); } diff --git a/src/main/java/vendingmachine/view/constants/ErrorMessage.java b/src/main/java/vendingmachine/view/constants/ErrorMessage.java index e1ac99ada..419c13dec 100644 --- a/src/main/java/vendingmachine/view/constants/ErrorMessage.java +++ b/src/main/java/vendingmachine/view/constants/ErrorMessage.java @@ -3,5 +3,7 @@ public class ErrorMessage { public static final String ERROR_TAG = "[ERROR] "; - public static final String INVALID_VENDING_MACHINE_TOTAL_MONEY = "금액은 숫자여야 합니다."; + public static final String INVALID_VENDING_MACHINE_TOTAL_MONEY = "금액은 10원 단위의 숫자여야 합니다."; + + public static final String INVALID_DRINKS_INPUT_FORMAT = "입력 포맷을 지켜 주세요. 입력 포맷: [음료 이름,가격,수량]"; } diff --git a/src/main/java/vendingmachine/view/constants/Message.java b/src/main/java/vendingmachine/view/constants/Message.java deleted file mode 100644 index 7d6e82274..000000000 --- a/src/main/java/vendingmachine/view/constants/Message.java +++ /dev/null @@ -1,6 +0,0 @@ -package vendingmachine.view.constants; - -public class Message { - public static final String ASK_TOTAL_COIN_OF_VENDING_MACHINE = "자판기가 보유하고 있는 금액을 입력해 주세요."; - -} diff --git a/src/main/java/vendingmachine/view/constants/OutputMessage.java b/src/main/java/vendingmachine/view/constants/OutputMessage.java index 2800c1099..46468b3aa 100644 --- a/src/main/java/vendingmachine/view/constants/OutputMessage.java +++ b/src/main/java/vendingmachine/view/constants/OutputMessage.java @@ -4,4 +4,6 @@ public class OutputMessage { public static final String ASK_TOTAL_MONEY_OF_VENDING_MACHINE = "자판기가 보유하고 있는 금액을 입력해 주세요."; public static final String SHOW_VENDING_MACHINE_HOLD_COIN_START_TAG = "자판기가 보유한 동전"; public static final String SHOW_VENDING_MACHINE_COINS = "500원 - %d개\n100원 - %d개\n50원 - %d개\n10원 - %d개"; + + public static final String ASK_DRINKS = "상품명과 가격, 수량을 입력해 주세요."; } diff --git a/src/main/java/vendingmachine/view/constants/Regex.java b/src/main/java/vendingmachine/view/constants/Regex.java index 9d847da9e..fafc8e12b 100644 --- a/src/main/java/vendingmachine/view/constants/Regex.java +++ b/src/main/java/vendingmachine/view/constants/Regex.java @@ -1,5 +1,7 @@ package vendingmachine.view.constants; public class Regex { - public static final String REGEX_MONEY_NUMERIC = "(^[1-9])\\d*"; + public static final String REGEX_MONEY_NUMERIC = "[1-9]\\d*0"; + + public static final String REGEX_DRINK_INPUT_FORMAT = "([[ㄱ-ㅎ가-힣]{1,},[1-9]\\d*0,[1-9]\\d*](;)?){1,}"; } diff --git a/src/main/java/vendingmachine/view/validate/InputValidator.java b/src/main/java/vendingmachine/view/validate/CoinValidator.java similarity index 94% rename from src/main/java/vendingmachine/view/validate/InputValidator.java rename to src/main/java/vendingmachine/view/validate/CoinValidator.java index c81b52101..abad3a7f9 100644 --- a/src/main/java/vendingmachine/view/validate/InputValidator.java +++ b/src/main/java/vendingmachine/view/validate/CoinValidator.java @@ -5,7 +5,7 @@ import static vendingmachine.view.constants.ErrorMessage.INVALID_VENDING_MACHINE_TOTAL_MONEY; import static vendingmachine.view.constants.Regex.REGEX_MONEY_NUMERIC; -public class InputValidator { +public class CoinValidator { private static final Pattern NUMERIC = Pattern.compile(REGEX_MONEY_NUMERIC); public static void checkNumericInput(String input) { diff --git a/src/main/java/vendingmachine/view/validate/DrinkValidator.java b/src/main/java/vendingmachine/view/validate/DrinkValidator.java new file mode 100644 index 000000000..cfa0c0f7f --- /dev/null +++ b/src/main/java/vendingmachine/view/validate/DrinkValidator.java @@ -0,0 +1,17 @@ +package vendingmachine.view.validate; + +import java.util.regex.Pattern; + +import static vendingmachine.view.constants.ErrorMessage.INVALID_DRINKS_INPUT_FORMAT; +import static vendingmachine.view.constants.Regex.REGEX_DRINK_INPUT_FORMAT; + +public class DrinkValidator { + private static final Pattern DRINK_INPUT_FORMAT = Pattern.compile(REGEX_DRINK_INPUT_FORMAT); + + public static void checkDrinkInput(String input) { + if (DRINK_INPUT_FORMAT.matcher(input).matches()) { + return; + } + throw new IllegalArgumentException(INVALID_DRINKS_INPUT_FORMAT); + } +} From 16471e5966f65cdebf97af1fa24b8947c9ff01bf Mon Sep 17 00:00:00 2001 From: HongYeseul Date: Wed, 22 Nov 2023 17:55:19 +0900 Subject: [PATCH 7/9] =?UTF-8?q?:sparkles:=20feat(user):=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9E=90=EA=B0=80=20=EC=9E=90=ED=8C=90=EA=B8=B0?= =?UTF-8?q?=EC=97=90=20=ED=88=AC=EC=9E=85=ED=95=9C=20=EA=B8=88=EC=95=A1=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=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 --- .../controller/MainController.java | 23 ++++++++++++++++--- .../vendingmachine/model/user/UserMoney.java | 9 ++++++++ .../java/vendingmachine/view/InputView.java | 8 +++---- .../java/vendingmachine/view/OutputView.java | 5 ++++ .../view/constants/OutputMessage.java | 2 ++ 5 files changed, 40 insertions(+), 7 deletions(-) create mode 100644 src/main/java/vendingmachine/model/user/UserMoney.java diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java index ce0c58ec1..9a59fd131 100644 --- a/src/main/java/vendingmachine/controller/MainController.java +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -1,14 +1,17 @@ package vendingmachine.controller; +import vendingmachine.model.VendingMachine; import vendingmachine.model.coin.Coins; import vendingmachine.model.drink.Drinks; -import vendingmachine.view.InputView; +import vendingmachine.model.user.UserMoney; import vendingmachine.view.OutputView; import static vendingmachine.model.coin.RandomCoins.makeRandomCoins; import static vendingmachine.view.InputView.readDrinks; +import static vendingmachine.view.InputView.readMoney; import static vendingmachine.view.OutputView.askDrinkFromUsers; import static vendingmachine.view.OutputView.askMachineTotalMoney; +import static vendingmachine.view.OutputView.askUserInputMoney; import static vendingmachine.view.OutputView.printVendingMachineCoins; public class MainController { @@ -17,14 +20,17 @@ public class MainController { public void run(){ Coins coins = askTotalMoney(); showCoins(coins); - askDrinks(); + Drinks drinks = askDrinks(); + VendingMachine vendingMachine = new VendingMachine(coins, drinks); + UserMoney userMoney = askInputAmount(); + } private Coins askTotalMoney(){ while (true){ try { askMachineTotalMoney(); - return new Coins(makeRandomCoins(InputView.readTotalMoney())); + return new Coins(makeRandomCoins(readMoney())); } catch (IllegalArgumentException exception) { OutputView.errorMessage(exception.getMessage()); } @@ -45,4 +51,15 @@ private Drinks askDrinks() { } } } + + private UserMoney askInputAmount() { + while (true) { + try { + askUserInputMoney(); + return new UserMoney(readMoney()); + } catch (IllegalArgumentException exception) { + OutputView.errorMessage(exception.getMessage()); + } + } + } } diff --git a/src/main/java/vendingmachine/model/user/UserMoney.java b/src/main/java/vendingmachine/model/user/UserMoney.java new file mode 100644 index 000000000..35cf91c4e --- /dev/null +++ b/src/main/java/vendingmachine/model/user/UserMoney.java @@ -0,0 +1,9 @@ +package vendingmachine.model.user; + +public class UserMoney { + int money = 0; + + public UserMoney(int money) { + this.money = money; + } +} diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java index 92f3ea36d..ed0f935d9 100644 --- a/src/main/java/vendingmachine/view/InputView.java +++ b/src/main/java/vendingmachine/view/InputView.java @@ -10,10 +10,10 @@ public static String readLine(){ return Console.readLine(); } - public static int readTotalMoney(){ - String totalMoney = readLine(); - checkNumericInput(totalMoney); - return Integer.parseInt(totalMoney); + public static int readMoney(){ + String money = readLine(); + checkNumericInput(money); + return Integer.parseInt(money); } public static String readDrinks() { diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java index 45983b4d0..7a830a269 100644 --- a/src/main/java/vendingmachine/view/OutputView.java +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -5,6 +5,7 @@ import static vendingmachine.view.constants.ErrorMessage.ERROR_TAG; import static vendingmachine.view.constants.OutputMessage.ASK_DRINKS; import static vendingmachine.view.constants.OutputMessage.ASK_TOTAL_MONEY_OF_VENDING_MACHINE; +import static vendingmachine.view.constants.OutputMessage.ASK_USER_INPUT_MONEY; import static vendingmachine.view.constants.OutputMessage.SHOW_VENDING_MACHINE_COINS; import static vendingmachine.view.constants.OutputMessage.SHOW_VENDING_MACHINE_HOLD_COIN_START_TAG; @@ -27,6 +28,10 @@ public static void askDrinkFromUsers() { print(ASK_DRINKS); } + public static void askUserInputMoney() { + print(ASK_USER_INPUT_MONEY); + } + private static void print(String message){ System.out.println(message); } diff --git a/src/main/java/vendingmachine/view/constants/OutputMessage.java b/src/main/java/vendingmachine/view/constants/OutputMessage.java index 46468b3aa..14b46bfd3 100644 --- a/src/main/java/vendingmachine/view/constants/OutputMessage.java +++ b/src/main/java/vendingmachine/view/constants/OutputMessage.java @@ -6,4 +6,6 @@ public class OutputMessage { public static final String SHOW_VENDING_MACHINE_COINS = "500원 - %d개\n100원 - %d개\n50원 - %d개\n10원 - %d개"; public static final String ASK_DRINKS = "상품명과 가격, 수량을 입력해 주세요."; + + public static final String ASK_USER_INPUT_MONEY = "투입 금액을 입력해 주세요."; } From c7b823d59d4a645e7c97048a25bd04bbf45ed2a1 Mon Sep 17 00:00:00 2001 From: HongYeseul Date: Wed, 22 Nov 2023 18:14:11 +0900 Subject: [PATCH 8/9] =?UTF-8?q?:sparkles:=20feat(vendingMachine):=20?= =?UTF-8?q?=EC=9E=90=ED=8C=90=EA=B8=B0=EC=97=90=20=EC=9E=88=EB=8A=94=20?= =?UTF-8?q?=EA=B0=80=EC=9E=A5=20=EC=A0=80=EB=A0=B4=ED=95=9C=20=EC=9D=8C?= =?UTF-8?q?=EB=A3=8C=20=EC=B0=BE=EB=8A=94=20=EA=B8=B0=EB=8A=A5=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 --- src/main/java/vendingmachine/model/VendingMachine.java | 5 +++++ src/main/java/vendingmachine/model/drink/Drink.java | 4 ++++ src/main/java/vendingmachine/model/drink/Drinks.java | 10 ++++++++++ src/main/java/vendingmachine/model/user/UserMoney.java | 4 ++++ 4 files changed, 23 insertions(+) diff --git a/src/main/java/vendingmachine/model/VendingMachine.java b/src/main/java/vendingmachine/model/VendingMachine.java index 2f9986b75..0fc14716c 100644 --- a/src/main/java/vendingmachine/model/VendingMachine.java +++ b/src/main/java/vendingmachine/model/VendingMachine.java @@ -2,6 +2,7 @@ import vendingmachine.model.coin.Coins; import vendingmachine.model.drink.Drinks; +import vendingmachine.model.user.UserMoney; import java.util.List; @@ -17,4 +18,8 @@ public VendingMachine(Coins moneyBox, Drinks drinks) { public List showCoinBox() { return moneyBox.coinsCount(); } + + public boolean hasMoneyMoreThenMinimumPrice(UserMoney userMoney) { + return userMoney.getBalance() >= drinks.cheapestDrink(); + } } diff --git a/src/main/java/vendingmachine/model/drink/Drink.java b/src/main/java/vendingmachine/model/drink/Drink.java index 0081d8211..ca3767442 100644 --- a/src/main/java/vendingmachine/model/drink/Drink.java +++ b/src/main/java/vendingmachine/model/drink/Drink.java @@ -10,4 +10,8 @@ public Drink(String title, Integer price, Integer count) { this.price = price; this.count = count; } + + public Integer getPrice() { + return price; + } } diff --git a/src/main/java/vendingmachine/model/drink/Drinks.java b/src/main/java/vendingmachine/model/drink/Drinks.java index ae733774a..8b9fcbd1e 100644 --- a/src/main/java/vendingmachine/model/drink/Drinks.java +++ b/src/main/java/vendingmachine/model/drink/Drinks.java @@ -1,7 +1,9 @@ package vendingmachine.model.drink; import java.util.ArrayList; +import java.util.Comparator; import java.util.List; +import java.util.NoSuchElementException; import static vendingmachine.model.constants.Delimiter.DRINK_DETAIL_DELIMITER_COMMA; import static vendingmachine.model.constants.Delimiter.DRINK_TYPE_DELIMITER_SEMICOLON; @@ -24,4 +26,12 @@ public Drinks(String inputDrink) { drinks.add(new Drink(drinkType, drinkPrice, drinkCount)); } } + + public Integer cheapestDrink() { + Comparator comparatorByAge = Comparator.comparingInt(Drink::getPrice); + + Drink cheapestDrink = drinks.stream() + .min(comparatorByAge).orElseThrow(NoSuchElementException::new); + return cheapestDrink.getPrice(); + } } diff --git a/src/main/java/vendingmachine/model/user/UserMoney.java b/src/main/java/vendingmachine/model/user/UserMoney.java index 35cf91c4e..6e7a15647 100644 --- a/src/main/java/vendingmachine/model/user/UserMoney.java +++ b/src/main/java/vendingmachine/model/user/UserMoney.java @@ -6,4 +6,8 @@ public class UserMoney { public UserMoney(int money) { this.money = money; } + + public int getBalance() { + return money; + } } From a4d59e15cbc5b79a60397e8356ad67d32e28302a Mon Sep 17 00:00:00 2001 From: HongYeseul Date: Wed, 22 Nov 2023 19:26:29 +0900 Subject: [PATCH 9/9] =?UTF-8?q?:sparkles:=20feat():=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9E=90=EA=B0=80=20=EC=9D=8C=EB=A3=8C=20=EC=A3=BC=EB=AC=B8?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MainController.java | 26 +++++++++++++++++++ .../vendingmachine/model/VendingMachine.java | 4 +++ .../vendingmachine/model/drink/Drink.java | 4 +++ .../vendingmachine/model/drink/Drinks.java | 10 +++++++ .../vendingmachine/model/user/UserMoney.java | 4 +++ .../java/vendingmachine/view/InputView.java | 10 ++++++- .../java/vendingmachine/view/OutputView.java | 14 ++++++++++ .../view/constants/ErrorMessage.java | 2 ++ .../view/constants/OutputMessage.java | 4 +++ .../vendingmachine/view/constants/Regex.java | 5 +++- .../view/validate/DrinkValidator.java | 10 +++++++ 11 files changed, 91 insertions(+), 2 deletions(-) diff --git a/src/main/java/vendingmachine/controller/MainController.java b/src/main/java/vendingmachine/controller/MainController.java index 9a59fd131..ad5977d55 100644 --- a/src/main/java/vendingmachine/controller/MainController.java +++ b/src/main/java/vendingmachine/controller/MainController.java @@ -9,10 +9,14 @@ import static vendingmachine.model.coin.RandomCoins.makeRandomCoins; import static vendingmachine.view.InputView.readDrinks; import static vendingmachine.view.InputView.readMoney; +import static vendingmachine.view.InputView.readPurchase; import static vendingmachine.view.OutputView.askDrinkFromUsers; import static vendingmachine.view.OutputView.askMachineTotalMoney; +import static vendingmachine.view.OutputView.askPurchaseDrinkType; import static vendingmachine.view.OutputView.askUserInputMoney; import static vendingmachine.view.OutputView.printVendingMachineCoins; +import static vendingmachine.view.OutputView.println; +import static vendingmachine.view.OutputView.showBalance; public class MainController { // VendingMachineController vendingMachineController = new VendingMachineController(); @@ -24,6 +28,7 @@ public void run(){ VendingMachine vendingMachine = new VendingMachine(coins, drinks); UserMoney userMoney = askInputAmount(); + makePurchase(vendingMachine, userMoney); } private Coins askTotalMoney(){ @@ -62,4 +67,25 @@ private UserMoney askInputAmount() { } } } + + private void makePurchase(VendingMachine vendingMachine, UserMoney userMoney) { + while (vendingMachine.hasMoneyMoreThenMinimumPrice(userMoney)) { + showBalance(userMoney.getBalance()); + String purchaseDrinkType = askPurchase(); + userMoney.purchaseDrink(vendingMachine.getPrice(purchaseDrinkType)); + println(); + } + showBalance(userMoney.getBalance()); + } + + private String askPurchase() { + while (true) { + try { + askPurchaseDrinkType(); + return readPurchase(); + } catch (IllegalArgumentException exception) { + OutputView.errorMessage(exception.getMessage()); + } + } + } } diff --git a/src/main/java/vendingmachine/model/VendingMachine.java b/src/main/java/vendingmachine/model/VendingMachine.java index 0fc14716c..d4e610a9c 100644 --- a/src/main/java/vendingmachine/model/VendingMachine.java +++ b/src/main/java/vendingmachine/model/VendingMachine.java @@ -22,4 +22,8 @@ public List showCoinBox() { public boolean hasMoneyMoreThenMinimumPrice(UserMoney userMoney) { return userMoney.getBalance() >= drinks.cheapestDrink(); } + + public int getPrice(String purchaseDrinkType) { + return drinks.getPriceFindByName(purchaseDrinkType); + } } diff --git a/src/main/java/vendingmachine/model/drink/Drink.java b/src/main/java/vendingmachine/model/drink/Drink.java index ca3767442..341873f6d 100644 --- a/src/main/java/vendingmachine/model/drink/Drink.java +++ b/src/main/java/vendingmachine/model/drink/Drink.java @@ -14,4 +14,8 @@ public Drink(String title, Integer price, Integer count) { public Integer getPrice() { return price; } + + public String getName() { + return title; + } } diff --git a/src/main/java/vendingmachine/model/drink/Drinks.java b/src/main/java/vendingmachine/model/drink/Drinks.java index 8b9fcbd1e..08bdc2314 100644 --- a/src/main/java/vendingmachine/model/drink/Drinks.java +++ b/src/main/java/vendingmachine/model/drink/Drinks.java @@ -4,6 +4,7 @@ import java.util.Comparator; import java.util.List; import java.util.NoSuchElementException; +import java.util.Objects; import static vendingmachine.model.constants.Delimiter.DRINK_DETAIL_DELIMITER_COMMA; import static vendingmachine.model.constants.Delimiter.DRINK_TYPE_DELIMITER_SEMICOLON; @@ -34,4 +35,13 @@ public Integer cheapestDrink() { .min(comparatorByAge).orElseThrow(NoSuchElementException::new); return cheapestDrink.getPrice(); } + + public int getPriceFindByName(String purchaseDrinkType) { + for (Drink drink : drinks) { + if (Objects.equals(drink.getName(), purchaseDrinkType)) { + return drink.getPrice(); + } + } + return 0; + } } diff --git a/src/main/java/vendingmachine/model/user/UserMoney.java b/src/main/java/vendingmachine/model/user/UserMoney.java index 6e7a15647..4c064ac30 100644 --- a/src/main/java/vendingmachine/model/user/UserMoney.java +++ b/src/main/java/vendingmachine/model/user/UserMoney.java @@ -10,4 +10,8 @@ public UserMoney(int money) { public int getBalance() { return money; } + + public void purchaseDrink(int price) { + money -= price; + } } diff --git a/src/main/java/vendingmachine/view/InputView.java b/src/main/java/vendingmachine/view/InputView.java index ed0f935d9..3d4cd82b6 100644 --- a/src/main/java/vendingmachine/view/InputView.java +++ b/src/main/java/vendingmachine/view/InputView.java @@ -2,8 +2,10 @@ import camp.nextstep.edu.missionutils.Console; +import static vendingmachine.view.constants.Regex.REGEX_SELECT_BRACKETS; import static vendingmachine.view.validate.CoinValidator.checkNumericInput; import static vendingmachine.view.validate.DrinkValidator.checkDrinkInput; +import static vendingmachine.view.validate.DrinkValidator.checkOnlyKoreanLetter; public class InputView { public static String readLine(){ @@ -19,6 +21,12 @@ public static int readMoney(){ public static String readDrinks() { String drinks = readLine(); checkDrinkInput(drinks); - return drinks; + return drinks.replaceAll(REGEX_SELECT_BRACKETS, ""); + } + + public static String readPurchase() { + String purchase = readLine(); + checkOnlyKoreanLetter(purchase); + return purchase; } } diff --git a/src/main/java/vendingmachine/view/OutputView.java b/src/main/java/vendingmachine/view/OutputView.java index 7a830a269..7505850e6 100644 --- a/src/main/java/vendingmachine/view/OutputView.java +++ b/src/main/java/vendingmachine/view/OutputView.java @@ -4,8 +4,10 @@ import static vendingmachine.view.constants.ErrorMessage.ERROR_TAG; import static vendingmachine.view.constants.OutputMessage.ASK_DRINKS; +import static vendingmachine.view.constants.OutputMessage.ASK_PURCHASE_DRINK_TYPE; import static vendingmachine.view.constants.OutputMessage.ASK_TOTAL_MONEY_OF_VENDING_MACHINE; import static vendingmachine.view.constants.OutputMessage.ASK_USER_INPUT_MONEY; +import static vendingmachine.view.constants.OutputMessage.SHOW_BALANCE; import static vendingmachine.view.constants.OutputMessage.SHOW_VENDING_MACHINE_COINS; import static vendingmachine.view.constants.OutputMessage.SHOW_VENDING_MACHINE_HOLD_COIN_START_TAG; @@ -32,10 +34,22 @@ public static void askUserInputMoney() { print(ASK_USER_INPUT_MONEY); } + public static void showBalance(int balance) { + print(String.format(SHOW_BALANCE, balance)); + } + + public static void askPurchaseDrinkType() { + print(ASK_PURCHASE_DRINK_TYPE); + } + private static void print(String message){ System.out.println(message); } + public static void println() { + System.out.println(System.lineSeparator()); + } + public static void errorMessage(String errorMessage) { System.out.println(ERROR_TAG + errorMessage); } diff --git a/src/main/java/vendingmachine/view/constants/ErrorMessage.java b/src/main/java/vendingmachine/view/constants/ErrorMessage.java index 419c13dec..809cbc93d 100644 --- a/src/main/java/vendingmachine/view/constants/ErrorMessage.java +++ b/src/main/java/vendingmachine/view/constants/ErrorMessage.java @@ -6,4 +6,6 @@ public class ErrorMessage { public static final String INVALID_VENDING_MACHINE_TOTAL_MONEY = "금액은 10원 단위의 숫자여야 합니다."; public static final String INVALID_DRINKS_INPUT_FORMAT = "입력 포맷을 지켜 주세요. 입력 포맷: [음료 이름,가격,수량]"; + + public static final String ONLY_KOREAN_LETTERS = "입력 값은 한국어만 가능합니다."; } diff --git a/src/main/java/vendingmachine/view/constants/OutputMessage.java b/src/main/java/vendingmachine/view/constants/OutputMessage.java index 14b46bfd3..5f9732c7b 100644 --- a/src/main/java/vendingmachine/view/constants/OutputMessage.java +++ b/src/main/java/vendingmachine/view/constants/OutputMessage.java @@ -8,4 +8,8 @@ public class OutputMessage { public static final String ASK_DRINKS = "상품명과 가격, 수량을 입력해 주세요."; public static final String ASK_USER_INPUT_MONEY = "투입 금액을 입력해 주세요."; + + public static final String SHOW_BALANCE = "투입 금액: %d원"; + + public static final String ASK_PURCHASE_DRINK_TYPE = "구매할 상품명을 입력해 주세요."; } diff --git a/src/main/java/vendingmachine/view/constants/Regex.java b/src/main/java/vendingmachine/view/constants/Regex.java index fafc8e12b..fceeeb9ee 100644 --- a/src/main/java/vendingmachine/view/constants/Regex.java +++ b/src/main/java/vendingmachine/view/constants/Regex.java @@ -3,5 +3,8 @@ public class Regex { public static final String REGEX_MONEY_NUMERIC = "[1-9]\\d*0"; - public static final String REGEX_DRINK_INPUT_FORMAT = "([[ㄱ-ㅎ가-힣]{1,},[1-9]\\d*0,[1-9]\\d*](;)?){1,}"; + public static final String REGEX_DRINK_INPUT_FORMAT = "((\\[[ㄱ-ㅎ가-힣]{1,}),([1-9]\\d*0),([1-9]\\d*)\\](;)?){1,}"; + public static final String REGEX_SELECT_BRACKETS = "[\\[\\]]"; + + public static final String REGEX_ONLY_KOREAN_LETTER = "([ㄱ-ㅎ가-힣]){1,}"; } diff --git a/src/main/java/vendingmachine/view/validate/DrinkValidator.java b/src/main/java/vendingmachine/view/validate/DrinkValidator.java index cfa0c0f7f..2af6d71d4 100644 --- a/src/main/java/vendingmachine/view/validate/DrinkValidator.java +++ b/src/main/java/vendingmachine/view/validate/DrinkValidator.java @@ -3,10 +3,13 @@ import java.util.regex.Pattern; import static vendingmachine.view.constants.ErrorMessage.INVALID_DRINKS_INPUT_FORMAT; +import static vendingmachine.view.constants.ErrorMessage.ONLY_KOREAN_LETTERS; import static vendingmachine.view.constants.Regex.REGEX_DRINK_INPUT_FORMAT; +import static vendingmachine.view.constants.Regex.REGEX_ONLY_KOREAN_LETTER; public class DrinkValidator { private static final Pattern DRINK_INPUT_FORMAT = Pattern.compile(REGEX_DRINK_INPUT_FORMAT); + private static final Pattern ONLY_KOREAN_LETTER = Pattern.compile(REGEX_ONLY_KOREAN_LETTER); public static void checkDrinkInput(String input) { if (DRINK_INPUT_FORMAT.matcher(input).matches()) { @@ -14,4 +17,11 @@ public static void checkDrinkInput(String input) { } throw new IllegalArgumentException(INVALID_DRINKS_INPUT_FORMAT); } + + public static void checkOnlyKoreanLetter(String input) { + if (ONLY_KOREAN_LETTER.matcher(input).matches()) { + return; + } + throw new IllegalArgumentException(ONLY_KOREAN_LETTERS); + } }