From 6cbdbefb1348cce997e24782b891a53f5e2220c8 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Mon, 8 Jan 2024 16:38:18 +0900 Subject: [PATCH 01/31] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EC=9E=85=EA=B8=88=EC=95=A1=EC=9D=84=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EC=9D=80=20=ED=9B=84=20=EC=9E=85=EB=A0=A5=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EC=9D=84=20=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 38 +++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index d190922ba44..1c2965c2df5 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,7 +1,43 @@ package lotto; +import camp.nextstep.edu.missionutils.Console; + public class Application { public static void main(String[] args) { - // TODO: 프로그램 구현 + // 구입 금액 입력 -> 입력 금액 검증 + int purchaseAmount = receivePurchaseAmount(); + // 발행된 로또 수량 출력, 번호를 오름 차순으로 출력 [ ] + + // 당첨 번호 6개 입력(쉼표로 구분) -> 입력 숫자 검증(1~45 사이 중복 없는 숫자) + + // 보너스 번호 입력 -> 입력 숫자 검증(1~45 사이 중복 없는 숫자) + + // 몇개가 일치하는지 확인 + + // 당첨 통계 출력 + + // 수익률 출력. 소수 둘째 자리에서 반올림 + } + + private static int receivePurchaseAmount() { + int inputAmount = 0; + while (inputAmount == 0) { + System.out.println("구입금액을 입력해 주세요."); + String input = Console.readLine(); + try { + inputAmount = Integer.parseInt(input); + validatePurchaseAmount(inputAmount); + break; + } catch (IllegalArgumentException e) { + System.out.println("[ERROR] 1000 단위의 금액을 입력하세요."); + } + } + return inputAmount; + } + + private static void validatePurchaseAmount(int inputAmount) { + if (inputAmount % 1000 != 0) { + throw new IllegalArgumentException(); + } } } From 7276e90f6fb43adb0fa8fc06fea7610b26526416 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Tue, 9 Jan 2024 21:58:47 +0900 Subject: [PATCH 02/31] =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 45 ++++------------ src/main/java/lotto/{ => numbers}/Lotto.java | 2 +- .../lotto/numbers/RandomLottoGenerator.java | 4 ++ src/main/java/lotto/util/LottoManager.java | 53 +++++++++++++++++++ src/main/java/lotto/util/PurchaseAmount.java | 22 ++++++++ src/main/java/lotto/util/WinningCheck.java | 4 ++ src/test/java/lotto/LottoTest.java | 1 + 7 files changed, 94 insertions(+), 37 deletions(-) rename src/main/java/lotto/{ => numbers}/Lotto.java (94%) create mode 100644 src/main/java/lotto/numbers/RandomLottoGenerator.java create mode 100644 src/main/java/lotto/util/LottoManager.java create mode 100644 src/main/java/lotto/util/PurchaseAmount.java create mode 100644 src/main/java/lotto/util/WinningCheck.java diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 1c2965c2df5..788a54c37a0 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,43 +1,16 @@ package lotto; import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; -public class Application { - public static void main(String[] args) { - // 구입 금액 입력 -> 입력 금액 검증 - int purchaseAmount = receivePurchaseAmount(); - // 발행된 로또 수량 출력, 번호를 오름 차순으로 출력 [ ] - - // 당첨 번호 6개 입력(쉼표로 구분) -> 입력 숫자 검증(1~45 사이 중복 없는 숫자) - - // 보너스 번호 입력 -> 입력 숫자 검증(1~45 사이 중복 없는 숫자) - - // 몇개가 일치하는지 확인 +import java.util.ArrayList; +import java.util.List; +import lotto.util.LottoManager; - // 당첨 통계 출력 - - // 수익률 출력. 소수 둘째 자리에서 반올림 - } - - private static int receivePurchaseAmount() { - int inputAmount = 0; - while (inputAmount == 0) { - System.out.println("구입금액을 입력해 주세요."); - String input = Console.readLine(); - try { - inputAmount = Integer.parseInt(input); - validatePurchaseAmount(inputAmount); - break; - } catch (IllegalArgumentException e) { - System.out.println("[ERROR] 1000 단위의 금액을 입력하세요."); - } - } - return inputAmount; - } +public class Application { - private static void validatePurchaseAmount(int inputAmount) { - if (inputAmount % 1000 != 0) { - throw new IllegalArgumentException(); - } - } + public static void main(String[] args) { + LottoManager lottoManager = new LottoManager(); + lottoManager.runLotto(); + } } diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/numbers/Lotto.java similarity index 94% rename from src/main/java/lotto/Lotto.java rename to src/main/java/lotto/numbers/Lotto.java index 519793d1f73..2ca233bfd39 100644 --- a/src/main/java/lotto/Lotto.java +++ b/src/main/java/lotto/numbers/Lotto.java @@ -1,4 +1,4 @@ -package lotto; +package lotto.numbers; import java.util.List; diff --git a/src/main/java/lotto/numbers/RandomLottoGenerator.java b/src/main/java/lotto/numbers/RandomLottoGenerator.java new file mode 100644 index 00000000000..d5919c8f031 --- /dev/null +++ b/src/main/java/lotto/numbers/RandomLottoGenerator.java @@ -0,0 +1,4 @@ +package lotto.numbers; + +public class RandomLottoGenerator { +} diff --git a/src/main/java/lotto/util/LottoManager.java b/src/main/java/lotto/util/LottoManager.java new file mode 100644 index 00000000000..6c509b53414 --- /dev/null +++ b/src/main/java/lotto/util/LottoManager.java @@ -0,0 +1,53 @@ +package lotto.util; + +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; + +public class LottoManager { + + public void runLotto() { + PurchaseAmount purchaseAmount = receivePurchaseAmount(); + printSortedLottoNumbers(purchaseAmount.getAmount()); + + } + + private PurchaseAmount receivePurchaseAmount() { + PurchaseAmount purchaseAmount; + while (true) { + try { + System.out.println("구입금액을 입력해 주세요."); + String input = Console.readLine(); + int inputAmount = Integer.parseInt(input); + purchaseAmount = new PurchaseAmount(inputAmount); + break; + } catch (IllegalArgumentException e) { + System.out.println("[ERROR] 1000 단위의 금액을 입력하세요."); + } + } + return purchaseAmount; + } + + private static void printSortedLottoNumbers(int purchaseAmount) { + int purchaseLotto = purchaseAmount / 1000; + System.out.println(purchaseLotto + "개를 구매했습니다."); + + List> allLottoNumbers = generateLottoNumbers(purchaseLotto); + + for (List LottoNumbers : allLottoNumbers) { + System.out.println(LottoNumbers); + } + } + + private static List generateLottoNumbers(int purchaseLotto) { + List> allLottoNumbers = new ArrayList<>(); + + for (int ticketIndex = 0; ticketIndex < purchaseLotto; ticketIndex++) { + List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6); + allLottoNumbers.add(numbers); + } + + return allLottoNumbers; + } +} \ No newline at end of file diff --git a/src/main/java/lotto/util/PurchaseAmount.java b/src/main/java/lotto/util/PurchaseAmount.java new file mode 100644 index 00000000000..151f39f92f9 --- /dev/null +++ b/src/main/java/lotto/util/PurchaseAmount.java @@ -0,0 +1,22 @@ +package lotto.util; + +public class PurchaseAmount { + + static final int LOTTO_PRICE = 1000; + private int amount; + + public PurchaseAmount(int inputAmount) { + validatePurchaseAmount(inputAmount); + this.amount = inputAmount; + } + + private static void validatePurchaseAmount(int inputAmount) { + if (inputAmount % LOTTO_PRICE != 0) { + throw new IllegalArgumentException(); + } + } + + public int getAmount() { + return amount; + } +} diff --git a/src/main/java/lotto/util/WinningCheck.java b/src/main/java/lotto/util/WinningCheck.java new file mode 100644 index 00000000000..80b1fc1692c --- /dev/null +++ b/src/main/java/lotto/util/WinningCheck.java @@ -0,0 +1,4 @@ +package lotto.util; + +public enum WinningCheck { +} diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 9f5dfe7eb83..031a6e92fad 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,5 +1,6 @@ package lotto; +import lotto.numbers.Lotto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From b6f34e0234db2651f432f23a3df73c4816273f6e Mon Sep 17 00:00:00 2001 From: junseoplee Date: Tue, 9 Jan 2024 22:01:58 +0900 Subject: [PATCH 03/31] =?UTF-8?q?Revert=20"=EA=B2=BD"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 7276e90f6fb43adb0fa8fc06fea7610b26526416. --- src/main/java/lotto/Application.java | 45 ++++++++++++---- src/main/java/lotto/{numbers => }/Lotto.java | 2 +- .../lotto/numbers/RandomLottoGenerator.java | 4 -- src/main/java/lotto/util/LottoManager.java | 53 ------------------- src/main/java/lotto/util/PurchaseAmount.java | 22 -------- src/main/java/lotto/util/WinningCheck.java | 4 -- src/test/java/lotto/LottoTest.java | 1 - 7 files changed, 37 insertions(+), 94 deletions(-) rename src/main/java/lotto/{numbers => }/Lotto.java (94%) delete mode 100644 src/main/java/lotto/numbers/RandomLottoGenerator.java delete mode 100644 src/main/java/lotto/util/LottoManager.java delete mode 100644 src/main/java/lotto/util/PurchaseAmount.java delete mode 100644 src/main/java/lotto/util/WinningCheck.java diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 788a54c37a0..1c2965c2df5 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,16 +1,43 @@ package lotto; import camp.nextstep.edu.missionutils.Console; -import camp.nextstep.edu.missionutils.Randoms; - -import java.util.ArrayList; -import java.util.List; -import lotto.util.LottoManager; public class Application { + public static void main(String[] args) { + // 구입 금액 입력 -> 입력 금액 검증 + int purchaseAmount = receivePurchaseAmount(); + // 발행된 로또 수량 출력, 번호를 오름 차순으로 출력 [ ] + + // 당첨 번호 6개 입력(쉼표로 구분) -> 입력 숫자 검증(1~45 사이 중복 없는 숫자) + + // 보너스 번호 입력 -> 입력 숫자 검증(1~45 사이 중복 없는 숫자) + + // 몇개가 일치하는지 확인 + + // 당첨 통계 출력 + + // 수익률 출력. 소수 둘째 자리에서 반올림 + } + + private static int receivePurchaseAmount() { + int inputAmount = 0; + while (inputAmount == 0) { + System.out.println("구입금액을 입력해 주세요."); + String input = Console.readLine(); + try { + inputAmount = Integer.parseInt(input); + validatePurchaseAmount(inputAmount); + break; + } catch (IllegalArgumentException e) { + System.out.println("[ERROR] 1000 단위의 금액을 입력하세요."); + } + } + return inputAmount; + } - public static void main(String[] args) { - LottoManager lottoManager = new LottoManager(); - lottoManager.runLotto(); - } + private static void validatePurchaseAmount(int inputAmount) { + if (inputAmount % 1000 != 0) { + throw new IllegalArgumentException(); + } + } } diff --git a/src/main/java/lotto/numbers/Lotto.java b/src/main/java/lotto/Lotto.java similarity index 94% rename from src/main/java/lotto/numbers/Lotto.java rename to src/main/java/lotto/Lotto.java index 2ca233bfd39..519793d1f73 100644 --- a/src/main/java/lotto/numbers/Lotto.java +++ b/src/main/java/lotto/Lotto.java @@ -1,4 +1,4 @@ -package lotto.numbers; +package lotto; import java.util.List; diff --git a/src/main/java/lotto/numbers/RandomLottoGenerator.java b/src/main/java/lotto/numbers/RandomLottoGenerator.java deleted file mode 100644 index d5919c8f031..00000000000 --- a/src/main/java/lotto/numbers/RandomLottoGenerator.java +++ /dev/null @@ -1,4 +0,0 @@ -package lotto.numbers; - -public class RandomLottoGenerator { -} diff --git a/src/main/java/lotto/util/LottoManager.java b/src/main/java/lotto/util/LottoManager.java deleted file mode 100644 index 6c509b53414..00000000000 --- a/src/main/java/lotto/util/LottoManager.java +++ /dev/null @@ -1,53 +0,0 @@ -package lotto.util; - -import camp.nextstep.edu.missionutils.Console; -import camp.nextstep.edu.missionutils.Randoms; -import java.util.ArrayList; -import java.util.List; - -public class LottoManager { - - public void runLotto() { - PurchaseAmount purchaseAmount = receivePurchaseAmount(); - printSortedLottoNumbers(purchaseAmount.getAmount()); - - } - - private PurchaseAmount receivePurchaseAmount() { - PurchaseAmount purchaseAmount; - while (true) { - try { - System.out.println("구입금액을 입력해 주세요."); - String input = Console.readLine(); - int inputAmount = Integer.parseInt(input); - purchaseAmount = new PurchaseAmount(inputAmount); - break; - } catch (IllegalArgumentException e) { - System.out.println("[ERROR] 1000 단위의 금액을 입력하세요."); - } - } - return purchaseAmount; - } - - private static void printSortedLottoNumbers(int purchaseAmount) { - int purchaseLotto = purchaseAmount / 1000; - System.out.println(purchaseLotto + "개를 구매했습니다."); - - List> allLottoNumbers = generateLottoNumbers(purchaseLotto); - - for (List LottoNumbers : allLottoNumbers) { - System.out.println(LottoNumbers); - } - } - - private static List generateLottoNumbers(int purchaseLotto) { - List> allLottoNumbers = new ArrayList<>(); - - for (int ticketIndex = 0; ticketIndex < purchaseLotto; ticketIndex++) { - List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6); - allLottoNumbers.add(numbers); - } - - return allLottoNumbers; - } -} \ No newline at end of file diff --git a/src/main/java/lotto/util/PurchaseAmount.java b/src/main/java/lotto/util/PurchaseAmount.java deleted file mode 100644 index 151f39f92f9..00000000000 --- a/src/main/java/lotto/util/PurchaseAmount.java +++ /dev/null @@ -1,22 +0,0 @@ -package lotto.util; - -public class PurchaseAmount { - - static final int LOTTO_PRICE = 1000; - private int amount; - - public PurchaseAmount(int inputAmount) { - validatePurchaseAmount(inputAmount); - this.amount = inputAmount; - } - - private static void validatePurchaseAmount(int inputAmount) { - if (inputAmount % LOTTO_PRICE != 0) { - throw new IllegalArgumentException(); - } - } - - public int getAmount() { - return amount; - } -} diff --git a/src/main/java/lotto/util/WinningCheck.java b/src/main/java/lotto/util/WinningCheck.java deleted file mode 100644 index 80b1fc1692c..00000000000 --- a/src/main/java/lotto/util/WinningCheck.java +++ /dev/null @@ -1,4 +0,0 @@ -package lotto.util; - -public enum WinningCheck { -} diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 031a6e92fad..9f5dfe7eb83 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,6 +1,5 @@ package lotto; -import lotto.numbers.Lotto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; From 5fb75e0f86d04ab4f6b33fcacfada62223380dff Mon Sep 17 00:00:00 2001 From: junseoplee Date: Tue, 9 Jan 2024 22:39:54 +0900 Subject: [PATCH 04/31] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80,?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=EB=B6=84=20=EB=B0=8F?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1,=20=EA=B5=AC=EC=9E=85=EA=B8=88=EC=95=A1?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EB=B0=8F=20=EC=9C=A0=ED=9A=A8=EC=84=B1?= =?UTF-8?q?=20=EA=B2=80=EC=82=AC=20=EA=B8=B0=EB=8A=A5=20=EC=9E=AC=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 45 ++++------------ src/main/java/lotto/Lotto.java | 20 ------- src/main/java/lotto/numbers/Lotto.java | 21 ++++++++ .../lotto/numbers/RandomLottoGenerator.java | 5 ++ src/main/java/lotto/util/LottoManager.java | 53 +++++++++++++++++++ src/main/java/lotto/util/PurchaseAmount.java | 22 ++++++++ src/main/java/lotto/util/WinningCheck.java | 4 ++ src/test/java/lotto/LottoTest.java | 30 ++++++----- 8 files changed, 130 insertions(+), 70 deletions(-) delete mode 100644 src/main/java/lotto/Lotto.java create mode 100644 src/main/java/lotto/numbers/Lotto.java create mode 100644 src/main/java/lotto/numbers/RandomLottoGenerator.java create mode 100644 src/main/java/lotto/util/LottoManager.java create mode 100644 src/main/java/lotto/util/PurchaseAmount.java create mode 100644 src/main/java/lotto/util/WinningCheck.java diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 1c2965c2df5..788a54c37a0 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,43 +1,16 @@ package lotto; import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; -public class Application { - public static void main(String[] args) { - // 구입 금액 입력 -> 입력 금액 검증 - int purchaseAmount = receivePurchaseAmount(); - // 발행된 로또 수량 출력, 번호를 오름 차순으로 출력 [ ] - - // 당첨 번호 6개 입력(쉼표로 구분) -> 입력 숫자 검증(1~45 사이 중복 없는 숫자) - - // 보너스 번호 입력 -> 입력 숫자 검증(1~45 사이 중복 없는 숫자) - - // 몇개가 일치하는지 확인 +import java.util.ArrayList; +import java.util.List; +import lotto.util.LottoManager; - // 당첨 통계 출력 - - // 수익률 출력. 소수 둘째 자리에서 반올림 - } - - private static int receivePurchaseAmount() { - int inputAmount = 0; - while (inputAmount == 0) { - System.out.println("구입금액을 입력해 주세요."); - String input = Console.readLine(); - try { - inputAmount = Integer.parseInt(input); - validatePurchaseAmount(inputAmount); - break; - } catch (IllegalArgumentException e) { - System.out.println("[ERROR] 1000 단위의 금액을 입력하세요."); - } - } - return inputAmount; - } +public class Application { - private static void validatePurchaseAmount(int inputAmount) { - if (inputAmount % 1000 != 0) { - throw new IllegalArgumentException(); - } - } + public static void main(String[] args) { + LottoManager lottoManager = new LottoManager(); + lottoManager.runLotto(); + } } diff --git a/src/main/java/lotto/Lotto.java b/src/main/java/lotto/Lotto.java deleted file mode 100644 index 519793d1f73..00000000000 --- a/src/main/java/lotto/Lotto.java +++ /dev/null @@ -1,20 +0,0 @@ -package lotto; - -import java.util.List; - -public class Lotto { - private final List numbers; - - public Lotto(List numbers) { - validate(numbers); - this.numbers = numbers; - } - - private void validate(List numbers) { - if (numbers.size() != 6) { - throw new IllegalArgumentException(); - } - } - - // TODO: 추가 기능 구현 -} diff --git a/src/main/java/lotto/numbers/Lotto.java b/src/main/java/lotto/numbers/Lotto.java new file mode 100644 index 00000000000..86b13c086e1 --- /dev/null +++ b/src/main/java/lotto/numbers/Lotto.java @@ -0,0 +1,21 @@ +package lotto.numbers; + +import java.util.List; + +public class Lotto { + + private final List numbers; + + public Lotto(List numbers) { + validate(numbers); + this.numbers = numbers; + } + + private void validate(List numbers) { + if (numbers.size() != 6) { + throw new IllegalArgumentException(); + } + } + + // TODO: 추가 기능 구현 +} diff --git a/src/main/java/lotto/numbers/RandomLottoGenerator.java b/src/main/java/lotto/numbers/RandomLottoGenerator.java new file mode 100644 index 00000000000..fcd84e42713 --- /dev/null +++ b/src/main/java/lotto/numbers/RandomLottoGenerator.java @@ -0,0 +1,5 @@ +package lotto.numbers; + +public class RandomLottoGenerator { + +} diff --git a/src/main/java/lotto/util/LottoManager.java b/src/main/java/lotto/util/LottoManager.java new file mode 100644 index 00000000000..6c509b53414 --- /dev/null +++ b/src/main/java/lotto/util/LottoManager.java @@ -0,0 +1,53 @@ +package lotto.util; + +import camp.nextstep.edu.missionutils.Console; +import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; + +public class LottoManager { + + public void runLotto() { + PurchaseAmount purchaseAmount = receivePurchaseAmount(); + printSortedLottoNumbers(purchaseAmount.getAmount()); + + } + + private PurchaseAmount receivePurchaseAmount() { + PurchaseAmount purchaseAmount; + while (true) { + try { + System.out.println("구입금액을 입력해 주세요."); + String input = Console.readLine(); + int inputAmount = Integer.parseInt(input); + purchaseAmount = new PurchaseAmount(inputAmount); + break; + } catch (IllegalArgumentException e) { + System.out.println("[ERROR] 1000 단위의 금액을 입력하세요."); + } + } + return purchaseAmount; + } + + private static void printSortedLottoNumbers(int purchaseAmount) { + int purchaseLotto = purchaseAmount / 1000; + System.out.println(purchaseLotto + "개를 구매했습니다."); + + List> allLottoNumbers = generateLottoNumbers(purchaseLotto); + + for (List LottoNumbers : allLottoNumbers) { + System.out.println(LottoNumbers); + } + } + + private static List generateLottoNumbers(int purchaseLotto) { + List> allLottoNumbers = new ArrayList<>(); + + for (int ticketIndex = 0; ticketIndex < purchaseLotto; ticketIndex++) { + List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6); + allLottoNumbers.add(numbers); + } + + return allLottoNumbers; + } +} \ No newline at end of file diff --git a/src/main/java/lotto/util/PurchaseAmount.java b/src/main/java/lotto/util/PurchaseAmount.java new file mode 100644 index 00000000000..44c4790c2a6 --- /dev/null +++ b/src/main/java/lotto/util/PurchaseAmount.java @@ -0,0 +1,22 @@ +package lotto.util; + +public class PurchaseAmount { + + static final int LOTTO_PRICE = 1000; + private int amount; + + public PurchaseAmount(int inputAmount) { + validatePurchaseAmount(inputAmount); + this.amount = inputAmount; + } + + private static void validatePurchaseAmount(int inputAmount) { + if (inputAmount % LOTTO_PRICE != 0) { + throw new IllegalArgumentException(); + } + } + + public int getAmount() { + return amount; + } +} \ No newline at end of file diff --git a/src/main/java/lotto/util/WinningCheck.java b/src/main/java/lotto/util/WinningCheck.java new file mode 100644 index 00000000000..80b1fc1692c --- /dev/null +++ b/src/main/java/lotto/util/WinningCheck.java @@ -0,0 +1,4 @@ +package lotto.util; + +public enum WinningCheck { +} diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java index 9f5dfe7eb83..058a943233d 100644 --- a/src/test/java/lotto/LottoTest.java +++ b/src/test/java/lotto/LottoTest.java @@ -1,5 +1,6 @@ package lotto; +import lotto.numbers.Lotto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -8,20 +9,21 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; class LottoTest { - @DisplayName("로또 번호의 개수가 6개가 넘어가면 예외가 발생한다.") - @Test - void createLottoByOverSize() { - assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 6, 7))) - .isInstanceOf(IllegalArgumentException.class); - } - @DisplayName("로또 번호에 중복된 숫자가 있으면 예외가 발생한다.") - @Test - void createLottoByDuplicatedNumber() { - // TODO: 이 테스트가 통과할 수 있게 구현 코드 작성 - assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 5))) - .isInstanceOf(IllegalArgumentException.class); - } + @DisplayName("로또 번호의 개수가 6개가 넘어가면 예외가 발생한다.") + @Test + void createLottoByOverSize() { + assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 6, 7))) + .isInstanceOf(IllegalArgumentException.class); + } - // 아래에 추가 테스트 작성 가능 + @DisplayName("로또 번호에 중복된 숫자가 있으면 예외가 발생한다.") + @Test + void createLottoByDuplicatedNumber() { + // TODO: 이 테스트가 통과할 수 있게 구현 코드 작성 + assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 5))) + .isInstanceOf(IllegalArgumentException.class); + } + + // 아래에 추가 테스트 작성 가능 } \ No newline at end of file From 0bf4e6fb1ef5505754abbdeba278269fec3eafc4 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Wed, 10 Jan 2024 17:48:39 +0900 Subject: [PATCH 05/31] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=A5=BC=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84.=20-=20=EB=A1=9C=EB=98=90=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A5=BC=20=EB=A7=8C=EB=93=A4=EA=B3=A0=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=B4=20=EA=B0=81=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EA=B0=9D=EC=B2=B4=EC=97=90=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5,=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC.?= =?UTF-8?q?=20-=20=EC=A0=95=EB=A0=AC=20=ED=9B=84=20=ED=98=95=EC=8B=9D?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EA=B2=8C=20=EC=B6=9C=EB=A0=A5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/numbers/Lotto.java | 46 +++++++++++--- .../lotto/numbers/RandomLottoGenerator.java | 5 -- .../lotto/numbers/ReceivedLottoNumbers.java | 5 ++ src/main/java/lotto/util/LottoManager.java | 60 ++++++++++++------- .../util/{PurchaseAmount.java => Money.java} | 8 +-- .../java/lotto/util/LottoManagerTest.java | 7 +++ 6 files changed, 92 insertions(+), 39 deletions(-) delete mode 100644 src/main/java/lotto/numbers/RandomLottoGenerator.java create mode 100644 src/main/java/lotto/numbers/ReceivedLottoNumbers.java rename src/main/java/lotto/util/{PurchaseAmount.java => Money.java} (59%) create mode 100644 src/test/java/lotto/util/LottoManagerTest.java diff --git a/src/main/java/lotto/numbers/Lotto.java b/src/main/java/lotto/numbers/Lotto.java index 86b13c086e1..dd7933e15e2 100644 --- a/src/main/java/lotto/numbers/Lotto.java +++ b/src/main/java/lotto/numbers/Lotto.java @@ -1,21 +1,51 @@ package lotto.numbers; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; public class Lotto { - private final List numbers; + public static final int MIN_LOTTO_NUMBER = 1; + public static final int MAX_LOTTO_NUMBER = 45; + public static final int SIZE_OF_LOTTO = 6; + private List lottoNumbers; - public Lotto(List numbers) { - validate(numbers); - this.numbers = numbers; + public Lotto(List lottoNumbers) { + validateLottoNumbers(lottoNumbers); + this.lottoNumbers = lottoNumbers; } - private void validate(List numbers) { - if (numbers.size() != 6) { - throw new IllegalArgumentException(); + public List getLottoNumbers() { + return lottoNumbers; + } + + private void validateLottoNumbers(List lottoNumbers) { + validateSize(lottoNumbers); + validateRange(lottoNumbers); + validateDuplicates(lottoNumbers); + } + + private void validateSize(List lottoNumbers) { + if (lottoNumbers.size() != SIZE_OF_LOTTO) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 총 6개여야 합니다."); } } - // TODO: 추가 기능 구현 + private void validateRange(List lottoNumbers) { + for (int number : lottoNumbers) { + if (number < MIN_LOTTO_NUMBER || number > MAX_LOTTO_NUMBER) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."); + } + } + } + + private void validateDuplicates(List lottoNumbers) { + Set uniqueNumbers = new HashSet<>(lottoNumbers); + if (uniqueNumbers.size() < lottoNumbers.size()) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 중복이 없어야 합니다."); + } + } } diff --git a/src/main/java/lotto/numbers/RandomLottoGenerator.java b/src/main/java/lotto/numbers/RandomLottoGenerator.java deleted file mode 100644 index fcd84e42713..00000000000 --- a/src/main/java/lotto/numbers/RandomLottoGenerator.java +++ /dev/null @@ -1,5 +0,0 @@ -package lotto.numbers; - -public class RandomLottoGenerator { - -} diff --git a/src/main/java/lotto/numbers/ReceivedLottoNumbers.java b/src/main/java/lotto/numbers/ReceivedLottoNumbers.java new file mode 100644 index 00000000000..2ebea033ec7 --- /dev/null +++ b/src/main/java/lotto/numbers/ReceivedLottoNumbers.java @@ -0,0 +1,5 @@ +package lotto.numbers; + +public class ReceivedLottoNumbers { + +} diff --git a/src/main/java/lotto/util/LottoManager.java b/src/main/java/lotto/util/LottoManager.java index 6c509b53414..62f8bfdde86 100644 --- a/src/main/java/lotto/util/LottoManager.java +++ b/src/main/java/lotto/util/LottoManager.java @@ -1,53 +1,69 @@ package lotto.util; +import static lotto.numbers.Lotto.MAX_LOTTO_NUMBER; +import static lotto.numbers.Lotto.MIN_LOTTO_NUMBER; +import static lotto.numbers.Lotto.SIZE_OF_LOTTO; +import static lotto.util.Money.LOTTO_PRICE; + import camp.nextstep.edu.missionutils.Console; import camp.nextstep.edu.missionutils.Randoms; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import lotto.numbers.Lotto; public class LottoManager { public void runLotto() { - PurchaseAmount purchaseAmount = receivePurchaseAmount(); - printSortedLottoNumbers(purchaseAmount.getAmount()); - + Money money = receivePurchaseAmount(); + List lottos = generateLottos(money.getAmount()); + printLottoNumbers(lottos); } - private PurchaseAmount receivePurchaseAmount() { - PurchaseAmount purchaseAmount; + private Money receivePurchaseAmount() { + Money money; while (true) { try { System.out.println("구입금액을 입력해 주세요."); String input = Console.readLine(); int inputAmount = Integer.parseInt(input); - purchaseAmount = new PurchaseAmount(inputAmount); + money = new Money(inputAmount); break; } catch (IllegalArgumentException e) { - System.out.println("[ERROR] 1000 단위의 금액을 입력하세요."); + System.out.println(e.getMessage()); } } - return purchaseAmount; + return money; } - private static void printSortedLottoNumbers(int purchaseAmount) { - int purchaseLotto = purchaseAmount / 1000; - System.out.println(purchaseLotto + "개를 구매했습니다."); + private List generateLottos(int money) { + int numberOfLotto = money / LOTTO_PRICE; + List lottos = new ArrayList<>(); - List> allLottoNumbers = generateLottoNumbers(purchaseLotto); + for (int i = 0; i < numberOfLotto; i++) { + List lottoNumbers = + Randoms.pickUniqueNumbersInRange(MIN_LOTTO_NUMBER, MAX_LOTTO_NUMBER, SIZE_OF_LOTTO); - for (List LottoNumbers : allLottoNumbers) { - System.out.println(LottoNumbers); + try { + Lotto lotto = new Lotto(lottoNumbers); + lottos.add(lotto); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + i--; + } } - } - private static List generateLottoNumbers(int purchaseLotto) { - List> allLottoNumbers = new ArrayList<>(); + return lottos; + } - for (int ticketIndex = 0; ticketIndex < purchaseLotto; ticketIndex++) { - List numbers = Randoms.pickUniqueNumbersInRange(1, 45, 6); - allLottoNumbers.add(numbers); + public void printLottoNumbers(List lottos) { + List lottoNumbers = new ArrayList<>(); + for (Lotto lotto : lottos) { + lottoNumbers.add(String.join(", ", lotto.getLottoNumbers().toString())); + } + Collections.sort(lottoNumbers); + for (int i = 0; i < lottoNumbers.size(); i++) { + System.out.println(lottoNumbers.get(i)); } - - return allLottoNumbers; } } \ No newline at end of file diff --git a/src/main/java/lotto/util/PurchaseAmount.java b/src/main/java/lotto/util/Money.java similarity index 59% rename from src/main/java/lotto/util/PurchaseAmount.java rename to src/main/java/lotto/util/Money.java index 44c4790c2a6..793892683d0 100644 --- a/src/main/java/lotto/util/PurchaseAmount.java +++ b/src/main/java/lotto/util/Money.java @@ -1,18 +1,18 @@ package lotto.util; -public class PurchaseAmount { +public class Money { - static final int LOTTO_PRICE = 1000; + public static final int LOTTO_PRICE = 1000; private int amount; - public PurchaseAmount(int inputAmount) { + public Money(int inputAmount) { validatePurchaseAmount(inputAmount); this.amount = inputAmount; } private static void validatePurchaseAmount(int inputAmount) { if (inputAmount % LOTTO_PRICE != 0) { - throw new IllegalArgumentException(); + throw new IllegalArgumentException("[ERROR] 1000 단위의 금액을 입력하세요."); } } diff --git a/src/test/java/lotto/util/LottoManagerTest.java b/src/test/java/lotto/util/LottoManagerTest.java new file mode 100644 index 00000000000..e6e2d04b043 --- /dev/null +++ b/src/test/java/lotto/util/LottoManagerTest.java @@ -0,0 +1,7 @@ +package lotto.util; + +import static org.junit.jupiter.api.Assertions.*; + +class LottoManagerTest { + +} \ No newline at end of file From 93faf63336112d2c6e6f176030ba65f71f72b30c Mon Sep 17 00:00:00 2001 From: junseoplee Date: Wed, 10 Jan 2024 20:26:04 +0900 Subject: [PATCH 06/31] =?UTF-8?q?fix:=20=EC=A0=95=EB=A0=AC=EC=9D=B4=20?= =?UTF-8?q?=EC=A0=9C=EB=8C=80=EB=A1=9C=20=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EB=AC=B8=EC=A0=9C=EB=A5=BC=20=ED=95=B4=EA=B2=B0,?= =?UTF-8?q?=20=EB=B3=80=EC=88=98=EB=AA=85=EC=9D=84=20=EB=AA=85=ED=99=95?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/util/LottoManager.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/lotto/util/LottoManager.java b/src/main/java/lotto/util/LottoManager.java index 62f8bfdde86..2b4fb3c4e66 100644 --- a/src/main/java/lotto/util/LottoManager.java +++ b/src/main/java/lotto/util/LottoManager.java @@ -57,13 +57,14 @@ private List generateLottos(int money) { } public void printLottoNumbers(List lottos) { - List lottoNumbers = new ArrayList<>(); + List allLottoNumbers = new ArrayList<>(); for (Lotto lotto : lottos) { - lottoNumbers.add(String.join(", ", lotto.getLottoNumbers().toString())); + List numbersOfOneLotto = new ArrayList<>(lotto.getLottoNumbers()); + Collections.sort(numbersOfOneLotto); + allLottoNumbers.add(String.join(", ", numbersOfOneLotto.toString())); } - Collections.sort(lottoNumbers); - for (int i = 0; i < lottoNumbers.size(); i++) { - System.out.println(lottoNumbers.get(i)); + for (int i = 0; i < allLottoNumbers.size(); i++) { + System.out.println(allLottoNumbers.get(i)); } } } \ No newline at end of file From 14f83cd9ce2a43e1bf0bab7fff81e8444601e46d Mon Sep 17 00:00:00 2001 From: junseoplee Date: Wed, 10 Jan 2024 20:29:43 +0900 Subject: [PATCH 07/31] =?UTF-8?q?fix:=20=EC=8B=A4=ED=96=89=EA=B2=B0?= =?UTF-8?q?=EA=B3=BC=EB=A5=BC=20=EC=96=91=EC=8B=9D=EC=97=90=20=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/util/LottoManager.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/lotto/util/LottoManager.java b/src/main/java/lotto/util/LottoManager.java index 2b4fb3c4e66..3a80c3ec484 100644 --- a/src/main/java/lotto/util/LottoManager.java +++ b/src/main/java/lotto/util/LottoManager.java @@ -38,6 +38,8 @@ private Money receivePurchaseAmount() { private List generateLottos(int money) { int numberOfLotto = money / LOTTO_PRICE; + System.out.println("\n" + numberOfLotto + "개를 구매했습니다."); + List lottos = new ArrayList<>(); for (int i = 0; i < numberOfLotto; i++) { From c3ec26becc540cf2d65dc4d16066fee7d6ec29d5 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Thu, 11 Jan 2024 01:26:53 +0900 Subject: [PATCH 08/31] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EC=99=80=20=EB=B3=B4=EB=84=88=EC=8A=A4=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=A5=BC=20=EC=9E=85=EB=A0=A5=20=EB=B0=9B=EC=95=84=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=83=9D=EC=84=B1,=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC=EB=A5=BC=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/numbers/Lotto.java | 13 +--- .../lotto/numbers/ReceivedLottoNumbers.java | 5 -- .../java/lotto/numbers/UserInputNumbers.java | 64 +++++++++++++++++++ src/main/java/lotto/util/LottoManager.java | 41 ++++++++++-- 4 files changed, 99 insertions(+), 24 deletions(-) delete mode 100644 src/main/java/lotto/numbers/ReceivedLottoNumbers.java create mode 100644 src/main/java/lotto/numbers/UserInputNumbers.java diff --git a/src/main/java/lotto/numbers/Lotto.java b/src/main/java/lotto/numbers/Lotto.java index dd7933e15e2..c7922b36a48 100644 --- a/src/main/java/lotto/numbers/Lotto.java +++ b/src/main/java/lotto/numbers/Lotto.java @@ -1,7 +1,5 @@ package lotto.numbers; -import java.util.ArrayList; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -23,29 +21,20 @@ public List getLottoNumbers() { } private void validateLottoNumbers(List lottoNumbers) { - validateSize(lottoNumbers); - validateRange(lottoNumbers); - validateDuplicates(lottoNumbers); - } - - private void validateSize(List lottoNumbers) { if (lottoNumbers.size() != SIZE_OF_LOTTO) { throw new IllegalArgumentException("[ERROR] 로또 번호는 총 6개여야 합니다."); } - } - private void validateRange(List lottoNumbers) { for (int number : lottoNumbers) { if (number < MIN_LOTTO_NUMBER || number > MAX_LOTTO_NUMBER) { throw new IllegalArgumentException("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."); } } - } - private void validateDuplicates(List lottoNumbers) { Set uniqueNumbers = new HashSet<>(lottoNumbers); if (uniqueNumbers.size() < lottoNumbers.size()) { throw new IllegalArgumentException("[ERROR] 로또 번호는 중복이 없어야 합니다."); } } } + diff --git a/src/main/java/lotto/numbers/ReceivedLottoNumbers.java b/src/main/java/lotto/numbers/ReceivedLottoNumbers.java deleted file mode 100644 index 2ebea033ec7..00000000000 --- a/src/main/java/lotto/numbers/ReceivedLottoNumbers.java +++ /dev/null @@ -1,5 +0,0 @@ -package lotto.numbers; - -public class ReceivedLottoNumbers { - -} diff --git a/src/main/java/lotto/numbers/UserInputNumbers.java b/src/main/java/lotto/numbers/UserInputNumbers.java new file mode 100644 index 00000000000..fb2921b5435 --- /dev/null +++ b/src/main/java/lotto/numbers/UserInputNumbers.java @@ -0,0 +1,64 @@ +package lotto.numbers; + +import static lotto.numbers.Lotto.MIN_LOTTO_NUMBER; +import static lotto.numbers.Lotto.MAX_LOTTO_NUMBER; +import static lotto.numbers.Lotto.SIZE_OF_LOTTO; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class UserInputNumbers { + + static final int SIZE_OF_BONUS_NUMBER = 1; + private List receivedLottoNumbers; + private List bonusNumber; + + public UserInputNumbers(List receivedLottoNumbers, List bonusNumber) { + validateLottoNumbers(receivedLottoNumbers); + this.receivedLottoNumbers = receivedLottoNumbers; + validateBonusNumbers(bonusNumber); + this.bonusNumber = bonusNumber; + } + + public List getReceivedLottoNumbers() { + return receivedLottoNumbers; + } + + public List getBonusNumber() { + return bonusNumber; + } + + private void validateLottoNumbers(List receivedLottoNumbers) { + if (receivedLottoNumbers.size() != SIZE_OF_LOTTO) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 총 6개여야 합니다."); + } + + for (int number : receivedLottoNumbers) { + if (number < MIN_LOTTO_NUMBER || number > MAX_LOTTO_NUMBER) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."); + } + } + + Set uniqueNumbers = new HashSet<>(receivedLottoNumbers); + if (uniqueNumbers.size() < receivedLottoNumbers.size()) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 중복이 없어야 합니다."); + } + } + + private void validateBonusNumbers(List bonusNumber) { + if (bonusNumber.size() != SIZE_OF_BONUS_NUMBER) { + throw new IllegalArgumentException("[ERROR] 보너스 번호는 1개여야 합니다."); + } + + for (int number : bonusNumber) { + if (number < MIN_LOTTO_NUMBER || number > MAX_LOTTO_NUMBER) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."); + } + } + + if (receivedLottoNumbers.containsAll(bonusNumber)) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 중복이 없어야 합니다."); + } + } +} diff --git a/src/main/java/lotto/util/LottoManager.java b/src/main/java/lotto/util/LottoManager.java index 3a80c3ec484..6c1f8eaa503 100644 --- a/src/main/java/lotto/util/LottoManager.java +++ b/src/main/java/lotto/util/LottoManager.java @@ -8,9 +8,11 @@ import camp.nextstep.edu.missionutils.Console; import camp.nextstep.edu.missionutils.Randoms; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import lotto.numbers.Lotto; +import lotto.numbers.UserInputNumbers; public class LottoManager { @@ -18,6 +20,8 @@ public void runLotto() { Money money = receivePurchaseAmount(); List lottos = generateLottos(money.getAmount()); printLottoNumbers(lottos); + UserInputNumbers receivedLotto = receiveLottoNumber(); + printLotto(receivedLotto); } private Money receivePurchaseAmount() { @@ -58,15 +62,38 @@ private List generateLottos(int money) { return lottos; } - public void printLottoNumbers(List lottos) { - List allLottoNumbers = new ArrayList<>(); + private void printLottoNumbers(List lottos) { for (Lotto lotto : lottos) { - List numbersOfOneLotto = new ArrayList<>(lotto.getLottoNumbers()); - Collections.sort(numbersOfOneLotto); - allLottoNumbers.add(String.join(", ", numbersOfOneLotto.toString())); + List lottoNumbers = lotto.getLottoNumbers(); + System.out.println(lottoNumbers.toString()); } - for (int i = 0; i < allLottoNumbers.size(); i++) { - System.out.println(allLottoNumbers.get(i)); + } + + private UserInputNumbers receiveLottoNumber() { + while (true) { + System.out.println("\n당첨 번호를 입력해 주세요."); + String inputNumbers = Console.readLine(); + System.out.println("\n보너스 번호를 입력해 주세요."); + String inputBonusNumber = Console.readLine(); + try { + String[] numbersArray = inputNumbers.split(","); + List receivedLottoNumbers = new ArrayList<>(); + Arrays.stream(numbersArray) + .forEach(number -> receivedLottoNumbers.add(Integer.parseInt(number.trim()))); // 공백 제거 + List bonusNumber = Collections.singletonList( + Integer.parseInt(inputBonusNumber.trim())); + + return new UserInputNumbers(receivedLottoNumbers, bonusNumber); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } } } + + private void printLotto(UserInputNumbers receivedLotto) { // 테스트 코드 짜는 법 까먹었어요ㅜㅜ + List inputLotto = receivedLotto.getReceivedLottoNumbers(); + List inputBonus = receivedLotto.getBonusNumber(); + System.out.print(inputLotto); + System.out.print(inputBonus); + } } \ No newline at end of file From 96f673705c280981a5f288e9bd50b436479e895d Mon Sep 17 00:00:00 2001 From: junseoplee Date: Thu, 11 Jan 2024 15:13:47 +0900 Subject: [PATCH 09/31] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=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/lotto/Application.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 788a54c37a0..680b0093e23 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,10 +1,5 @@ package lotto; -import camp.nextstep.edu.missionutils.Console; -import camp.nextstep.edu.missionutils.Randoms; - -import java.util.ArrayList; -import java.util.List; import lotto.util.LottoManager; public class Application { From 0ccdc4723569f5760bbaadb46cbde752c7119e28 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Fri, 12 Jan 2024 02:36:34 +0900 Subject: [PATCH 10/31] =?UTF-8?q?feat:=20=EA=B2=B0=EA=B3=BC=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84=20-=20?= =?UTF-8?q?=EC=9D=BC=EC=B9=98=ED=95=98=EB=8A=94=20=EB=B2=88=ED=98=B8?= =?UTF-8?q?=EC=9D=98=20=EC=88=98=EB=A5=BC=20=EA=B2=80=EC=82=AC=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20=EB=93=B1=EC=88=98=EB=A5=BC=20=EC=B2=B4=ED=81=AC,?= =?UTF-8?q?=20=EC=9D=B4=ED=9B=84=20=EB=8B=B9=EC=B2=A8=EB=90=9C=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=EA=B0=80=20=EB=AA=87=EA=B0=9C=EC=9D=B8=EC=A7=80=20Map?= =?UTF-8?q?=EC=97=90=20=EC=A0=80=EC=9E=A5=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20-=205=EB=93=B1=EB=B6=80=ED=84=B0=201=EB=93=B1,=20?= =?UTF-8?q?=EB=B3=B4=EB=84=88=EC=8A=A4=20=EB=B3=BC=20=EC=9D=BC=EC=B9=98=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20=ED=8C=90=EB=8B=A8=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/numbers/Lotto.java | 11 +++++ src/main/java/lotto/util/LottoManager.java | 52 ++++++++++++++++------ src/main/java/lotto/util/WinningCheck.java | 50 +++++++++++++++++++++ 3 files changed, 99 insertions(+), 14 deletions(-) diff --git a/src/main/java/lotto/numbers/Lotto.java b/src/main/java/lotto/numbers/Lotto.java index c7922b36a48..982d61fb8ce 100644 --- a/src/main/java/lotto/numbers/Lotto.java +++ b/src/main/java/lotto/numbers/Lotto.java @@ -20,6 +20,17 @@ public List getLottoNumbers() { return lottoNumbers; } + public int getMatchCount(UserInputNumbers receivedLotto) { + int matchCount = (int) lottoNumbers.stream() + .filter(number -> receivedLotto.getReceivedLottoNumbers().contains(number)) + .count(); // count() 메서드는 반환 값이 long이다. int로 캐스팅 해야한다. + return matchCount; + } + + public boolean isBonusMatch(UserInputNumbers receivedLotto) { + return lottoNumbers.contains(receivedLotto.getReceivedLottoNumbers()); + } + private void validateLottoNumbers(List lottoNumbers) { if (lottoNumbers.size() != SIZE_OF_LOTTO) { throw new IllegalArgumentException("[ERROR] 로또 번호는 총 6개여야 합니다."); diff --git a/src/main/java/lotto/util/LottoManager.java b/src/main/java/lotto/util/LottoManager.java index 6c1f8eaa503..1867ea4b32e 100644 --- a/src/main/java/lotto/util/LottoManager.java +++ b/src/main/java/lotto/util/LottoManager.java @@ -10,7 +10,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import lotto.numbers.Lotto; import lotto.numbers.UserInputNumbers; @@ -19,9 +21,10 @@ public class LottoManager { public void runLotto() { Money money = receivePurchaseAmount(); List lottos = generateLottos(money.getAmount()); - printLottoNumbers(lottos); + printGeneratedLottoNumbers(lottos); UserInputNumbers receivedLotto = receiveLottoNumber(); - printLotto(receivedLotto); + Map result = calculateWinningResult(lottos, receivedLotto); + printWinningResult(result); } private Money receivePurchaseAmount() { @@ -62,10 +65,11 @@ private List generateLottos(int money) { return lottos; } - private void printLottoNumbers(List lottos) { + private void printGeneratedLottoNumbers(List lottos) { for (Lotto lotto : lottos) { List lottoNumbers = lotto.getLottoNumbers(); - System.out.println(lottoNumbers.toString()); + Collections.sort(lottoNumbers); + System.out.println(lottoNumbers); } } @@ -73,27 +77,47 @@ private UserInputNumbers receiveLottoNumber() { while (true) { System.out.println("\n당첨 번호를 입력해 주세요."); String inputNumbers = Console.readLine(); - System.out.println("\n보너스 번호를 입력해 주세요."); - String inputBonusNumber = Console.readLine(); try { String[] numbersArray = inputNumbers.split(","); List receivedLottoNumbers = new ArrayList<>(); Arrays.stream(numbersArray) .forEach(number -> receivedLottoNumbers.add(Integer.parseInt(number.trim()))); // 공백 제거 - List bonusNumber = Collections.singletonList( - Integer.parseInt(inputBonusNumber.trim())); + System.out.println("\n보너스 번호를 입력해 주세요."); + int bonusNumber = Integer.parseInt(Console.readLine().trim()); - return new UserInputNumbers(receivedLottoNumbers, bonusNumber); + return new UserInputNumbers(receivedLottoNumbers, List.of(bonusNumber)); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } } - private void printLotto(UserInputNumbers receivedLotto) { // 테스트 코드 짜는 법 까먹었어요ㅜㅜ - List inputLotto = receivedLotto.getReceivedLottoNumbers(); - List inputBonus = receivedLotto.getBonusNumber(); - System.out.print(inputLotto); - System.out.print(inputBonus); + private Map calculateWinningResult(List lottos + , UserInputNumbers receivedLotto) { + Map result = new HashMap<>(); // WinningCheck 객체와 정수를 키와 값으로 Map에 저장 + for (Lotto lotto : lottos) { + int matchCount = lotto.getMatchCount(receivedLotto); + boolean bonusMatch = lotto.isBonusMatch(receivedLotto); + + WinningCheck prize = WinningCheck.getPrize(matchCount, bonusMatch); + result.put(prize // prize 키와 해당하는 값을 Map에 넣는다. 이미 있다면 덮어쓴다 + , result.getOrDefault(prize, 0) + 1); + /*키(prize)에 해당하는 값을 가져온다. 없다면 default(0)을 반환 + -> 해당하는 현재의 당첨 수를 가져오고 그 수에 1을 더해서 새로운 당첨 수를 계산함*/ + } + return result; + } + + private void printWinningResult(Map result) { + System.out.println("\n당첨 통계\n---"); + for (WinningCheck prize : WinningCheck.values()) { + if (prize == WinningCheck.LOSE) { + continue; + } + String bonus = prize.hasBonus() ? ", 보너스 볼 일치" : ""; + System.out.println( + prize.getMatchingCount() + "개 일치" + bonus + " (" + prize.getPrizeAmount() + "원) - " + + result.getOrDefault(prize, 0) + "개"); + } } } \ No newline at end of file diff --git a/src/main/java/lotto/util/WinningCheck.java b/src/main/java/lotto/util/WinningCheck.java index 80b1fc1692c..4f2189679dc 100644 --- a/src/main/java/lotto/util/WinningCheck.java +++ b/src/main/java/lotto/util/WinningCheck.java @@ -1,4 +1,54 @@ package lotto.util; public enum WinningCheck { + LOSE("0", 0), + FIFTH_PRIZE("5,000", 3), + FOURTH_PRIZE("50,000", 4), + THIRD_PRIZE("1,500,000", 5, false), + SECOND_PRIZE("30,000,000", 5, true), + FIRST_PRIZE("2,000,000,000", 6); + + private final String prizeAmount; + private final int matchingCount; + private final boolean hasBonus; + + WinningCheck(String prizeAmount, int matchingCount) { + this.prizeAmount = prizeAmount; + this.matchingCount = matchingCount; + this.hasBonus = false; + } + + WinningCheck(String prizeAmount, int matchingCount, boolean hasBonus) { + this.prizeAmount = prizeAmount; + this.matchingCount = matchingCount; + this.hasBonus = hasBonus; + } + + public String getPrizeAmount() { + return prizeAmount; + } + + public int getMatchingCount() { + return matchingCount; + } + + public boolean hasBonus() { + return hasBonus; + } + + public static WinningCheck getPrize(int matchCount, boolean bonusMatch) { + if (matchCount == 6) { + return FIRST_PRIZE; + } + if (matchCount == 5) { + return bonusMatch ? SECOND_PRIZE : THIRD_PRIZE; + } + if (matchCount == 4) { + return FOURTH_PRIZE; + } + if (matchCount == 3) { + return FIFTH_PRIZE; + } + return LOSE; + } } From e4cf6626d99fefc442dcd824bb8a94756be355a0 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Fri, 12 Jan 2024 14:29:16 +0900 Subject: [PATCH 11/31] =?UTF-8?q?feat:=20=EA=B5=AC=EC=9E=85=EA=B8=88?= =?UTF-8?q?=EC=95=A1=EC=9D=B4=20=EC=88=AB=EC=9E=90=EC=9D=B8=EC=A7=80=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/util/Money.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/util/Money.java b/src/main/java/lotto/util/Money.java index 793892683d0..18b1eeb23f9 100644 --- a/src/main/java/lotto/util/Money.java +++ b/src/main/java/lotto/util/Money.java @@ -5,11 +5,21 @@ public class Money { public static final int LOTTO_PRICE = 1000; private int amount; - public Money(int inputAmount) { - validatePurchaseAmount(inputAmount); + public Money(String input) { + validateIsNumeric(input); + int inputAmount = Integer.parseInt(input); + validatePurchaseAmount(amount); this.amount = inputAmount; } + private static void validateIsNumeric(String inputAmount) { + try { + Integer.parseInt(inputAmount); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("[ERROR] 구입금액은 숫자여야합니다."); + } + } + private static void validatePurchaseAmount(int inputAmount) { if (inputAmount % LOTTO_PRICE != 0) { throw new IllegalArgumentException("[ERROR] 1000 단위의 금액을 입력하세요."); From c2c7bc94a80a4d6405971559ec35d9e5f678d6ce Mon Sep 17 00:00:00 2001 From: junseoplee Date: Fri, 12 Jan 2024 14:45:31 +0900 Subject: [PATCH 12/31] =?UTF-8?q?feat:=20=EC=88=98=EC=9D=B5=EB=A5=A0=20?= =?UTF-8?q?=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/util/LottoManager.java | 26 +++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/util/LottoManager.java b/src/main/java/lotto/util/LottoManager.java index 1867ea4b32e..f6a8f08f001 100644 --- a/src/main/java/lotto/util/LottoManager.java +++ b/src/main/java/lotto/util/LottoManager.java @@ -7,6 +7,7 @@ import camp.nextstep.edu.missionutils.Console; import camp.nextstep.edu.missionutils.Randoms; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -18,6 +19,8 @@ public class LottoManager { + public static final int PERCENTAGE_FACTOR = 100; + public void runLotto() { Money money = receivePurchaseAmount(); List lottos = generateLottos(money.getAmount()); @@ -25,6 +28,7 @@ public void runLotto() { UserInputNumbers receivedLotto = receiveLottoNumber(); Map result = calculateWinningResult(lottos, receivedLotto); printWinningResult(result); + printProfitRate(money.getAmount(), result); } private Money receivePurchaseAmount() { @@ -33,8 +37,7 @@ private Money receivePurchaseAmount() { try { System.out.println("구입금액을 입력해 주세요."); String input = Console.readLine(); - int inputAmount = Integer.parseInt(input); - money = new Money(inputAmount); + money = new Money(input); break; } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); @@ -67,7 +70,7 @@ private List generateLottos(int money) { private void printGeneratedLottoNumbers(List lottos) { for (Lotto lotto : lottos) { - List lottoNumbers = lotto.getLottoNumbers(); + List lottoNumbers = new ArrayList<>(lotto.getLottoNumbers()); Collections.sort(lottoNumbers); System.out.println(lottoNumbers); } @@ -120,4 +123,21 @@ private void printWinningResult(Map result) { + result.getOrDefault(prize, 0) + "개"); } } + + private void printProfitRate(int amount, Map result) { + double totalPrize = 0; + for (Map.Entry entry : result.entrySet()) { + // entry: 맵의 각 항목을 나타내는 객체, .entrySet(): 맵의 모든 항목을 객체의 Set으로 반환 + WinningCheck prize = entry.getKey(); // enum에 열거된 상금을 가져온다 + int count = entry.getValue(); // 당첨 횟수를 가져온다. + totalPrize += Double.parseDouble(prize.getPrizeAmount() + .replace(",", "")) * count; // 문자열을 double로 변환하기 위해 쉼표 제거 + } + + double profitRate = (totalPrize / amount) * PERCENTAGE_FACTOR; + DecimalFormat df = new DecimalFormat("#.##"); + profitRate = Double.parseDouble(df.format(profitRate)); // 소수 둘째 자리에서 반올림 + + System.out.println("총 수익률은 " + profitRate + "%입니다."); + } } \ No newline at end of file From 68d01e723582637d77a7e6e8f5eb10c0d7decc1e Mon Sep 17 00:00:00 2001 From: junseoplee Date: Sun, 14 Jan 2024 02:15:30 +0900 Subject: [PATCH 13/31] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/README.md b/docs/README.md index e69de29bb2d..19d755ab347 100644 --- a/docs/README.md +++ b/docs/README.md @@ -0,0 +1,20 @@ +필요한 기능들을 패키지로 묶어보자 + +- 로또 번호들이 있는 패키지 (numbers) + - 난수 생성된 로또 번호가 있는 클래스 Lotto + - 사용자로부터 로또 번호 6개와 보너스 번호 1개를 입력받아 저장하는 클래스 UserInputNumbers +- 각종 메서드가 있는 패키지 (util): + - LottoManager + - Money + - 당첨된 로또 개수를 enum으로 저장 (당첨금과 수 포함) + +1. 구입 금액을 입력 받는 메서드 receivePurchaseAmount() → Money 객체로 저장 +2. 로또를 발행하고 수량과 번호들을 오름차순으로 출력한다. + generateLottos(int money) -> return List lottos 객체로 저장 + -> printGeneratedLottoNumbers(List lottos) +3. 당첨 번호 6개를 입력받음(쉼표로 구분), 보너스 번호 1개를 입력받음 + receiveLottoNumber() -> return new UserInputNumbers 객체로 저장 +4. enum 당첨 금액과 수량 저장 (출력 기능 포함) +5. 일치하는 개수를 검사하고 등수를 체크, 출력하는 기능 Map에 저장 + -> printWinningResult(Map result) +6. 수익률을 출력하는 기능 (소수 둘째 자리에서 반올림) printProfitRate(int amount, Map result) From cb5e44705f46e80ed1ef3ce9143097c1fddcf292 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Tue, 16 Jan 2024 04:12:10 +0900 Subject: [PATCH 14/31] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 47 +++++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 16 deletions(-) diff --git a/docs/README.md b/docs/README.md index 19d755ab347..4f0d1119c81 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,20 +1,35 @@ -필요한 기능들을 패키지로 묶어보자 +Application과 동일 선상에 RunLotto 클래스 생성 -- 로또 번호들이 있는 패키지 (numbers) +RunLotto에 필요한 기능들을 패키지로 묶어보자 + +- 도메인 모델 패키지 (domain) + - 사용자로부터 입력받은 구입금액을 저장하는 클래스 PurchaseAmount - 난수 생성된 로또 번호가 있는 클래스 Lotto - 사용자로부터 로또 번호 6개와 보너스 번호 1개를 입력받아 저장하는 클래스 UserInputNumbers -- 각종 메서드가 있는 패키지 (util): - - LottoManager - - Money - - 당첨된 로또 개수를 enum으로 저장 (당첨금과 수 포함) + - 상금과 당첨 수를 저장하는 열거형 enum WinningCheck +- 비즈니스 로직을 수행하는 서비스 패키지 (service) + - 당첨 결과와 수익률을 계산하는 클래스 Calculator + - 구입금액만큼 로또를 발행하는 클래스 LottoGenerator +- 각종 메서드가 있는 패키지 (util) + - 사용자로부터 값들을 입력받는 클래스 InputManager + - 결과들을 출력하는 클래스 OutputManager + +동작 구조 + +1. receivePurchaseAmount()로 구입금액을 입력받아 PurchaseAmount에 객체로 저장(유효성 검사) +2. 생성된 PurchaseAmount를 매개변수로 받아 generateLottos(PurchaseAmount purchaseAmount) + 입력받은 양 만큼 Lotto 객체로 로또를 발행(유효성 검사) -> 리턴 값은 List로 generatedLottos를 리턴 +3. generatedLottos를 매개변수로 받아 printGeneratedLottoNumbers(List lottos) 생성된 로또들을 출력 +4. receiveLottoNumber() 로또 번호 6개와 보너스 번호 1개를 입력 받아 UserInputNumbers에 객체로 저장(유효성 검사) +5. calculateWinningResult(List lottos, UserInputNumbers receivedLotto) + Map을 이용해서 result를 생성 WinningCheck에 열거형으로 상금과 당첨 수를 저장 + Lotto클래스에서 각 로또 당 matchCount와 bonusMatch를 가져온다 -> WinningCheck.getPrize(matchCount, bonusMatch) + -> 각 로또 당 상금과 수를 result에 저장 후 리턴 +6. calculateProfitRate(PurchaseAmount purchaseAmount, Map result) + 구입금액과 결과를 비교하여 수익률을 계산(소수 둘째에서 반올림) -> 리턴 값은 double profitRate +7. printResults(Map result, double profitRate) 최종 결과 출력 -1. 구입 금액을 입력 받는 메서드 receivePurchaseAmount() → Money 객체로 저장 -2. 로또를 발행하고 수량과 번호들을 오름차순으로 출력한다. - generateLottos(int money) -> return List lottos 객체로 저장 - -> printGeneratedLottoNumbers(List lottos) -3. 당첨 번호 6개를 입력받음(쉼표로 구분), 보너스 번호 1개를 입력받음 - receiveLottoNumber() -> return new UserInputNumbers 객체로 저장 -4. enum 당첨 금액과 수량 저장 (출력 기능 포함) -5. 일치하는 개수를 검사하고 등수를 체크, 출력하는 기능 Map에 저장 - -> printWinningResult(Map result) -6. 수익률을 출력하는 기능 (소수 둘째 자리에서 반올림) printProfitRate(int amount, Map result) +해야할 것 +금액 출력 enum을 String으로 할 필요가 없다 +-> DecimalFormat decFormat = new DecimalFormat("###,###"); +calculateProfitRate 메서드 수정하기 From 177b560049267b0e7656076ed5f600d47c7497c8 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Tue, 16 Jan 2024 04:20:17 +0900 Subject: [PATCH 15/31] =?UTF-8?q?refactor:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=EC=99=80=20=ED=81=B4=EB=9E=98=EC=8A=A4=20=EA=B5=AC=EB=B6=84=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81,=20=EB=B3=B4?= =?UTF-8?q?=EB=84=88=EC=8A=A4=20=EB=B2=88=ED=98=B8=20=EA=B2=80=EC=82=AC?= =?UTF-8?q?=EA=B0=80=20=EC=A0=9C=EB=8C=80=EB=A1=9C=20=EB=8F=99=EC=9E=91?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=98=A4=EB=A5=98=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 --- src/main/java/lotto/Application.java | 6 +- src/main/java/lotto/RunLotto.java | 34 +++++ .../java/lotto/{numbers => domain}/Lotto.java | 5 +- .../Money.java => domain/PurchaseAmount.java} | 8 +- .../{numbers => domain}/UserInputNumbers.java | 32 ++-- .../lotto/{util => domain}/WinningCheck.java | 2 +- src/main/java/lotto/sevice/Calculator.java | 46 ++++++ .../java/lotto/sevice/LottoGenerator.java | 38 +++++ src/main/java/lotto/util/InputManager.java | 47 ++++++ src/main/java/lotto/util/LottoManager.java | 143 ------------------ src/main/java/lotto/util/OutputManager.java | 41 +++++ 11 files changed, 228 insertions(+), 174 deletions(-) create mode 100644 src/main/java/lotto/RunLotto.java rename src/main/java/lotto/{numbers => domain}/Lotto.java (94%) rename src/main/java/lotto/{util/Money.java => domain/PurchaseAmount.java} (88%) rename src/main/java/lotto/{numbers => domain}/UserInputNumbers.java (56%) rename src/main/java/lotto/{util => domain}/WinningCheck.java (98%) create mode 100644 src/main/java/lotto/sevice/Calculator.java create mode 100644 src/main/java/lotto/sevice/LottoGenerator.java create mode 100644 src/main/java/lotto/util/InputManager.java delete mode 100644 src/main/java/lotto/util/LottoManager.java create mode 100644 src/main/java/lotto/util/OutputManager.java diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 680b0093e23..198bc6a79dc 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -1,11 +1,9 @@ package lotto; -import lotto.util.LottoManager; - public class Application { public static void main(String[] args) { - LottoManager lottoManager = new LottoManager(); - lottoManager.runLotto(); + RunLotto runLotto = new RunLotto(); + runLotto.runLotto(); } } diff --git a/src/main/java/lotto/RunLotto.java b/src/main/java/lotto/RunLotto.java new file mode 100644 index 00000000000..7e7249cb59d --- /dev/null +++ b/src/main/java/lotto/RunLotto.java @@ -0,0 +1,34 @@ +package lotto; + +import java.util.List; +import java.util.Map; +import lotto.domain.Lotto; +import lotto.domain.PurchaseAmount; +import lotto.domain.UserInputNumbers; +import lotto.sevice.Calculator; +import lotto.util.InputManager; +import lotto.sevice.LottoGenerator; +import lotto.util.OutputManager; +import lotto.domain.WinningCheck; + +public class RunLotto { + + private final InputManager inputManager = new InputManager(); + private final LottoGenerator lottoGenerator = new LottoGenerator(); + private final Calculator calculator = new Calculator(); + private final OutputManager outputManager = new OutputManager(); + + public void runLotto() { + PurchaseAmount purchaseAmount = inputManager.receivePurchaseAmount(); + List generatedLottos = lottoGenerator.generateLottos(purchaseAmount); + outputManager.printGeneratedLottoNumbers(generatedLottos); + + UserInputNumbers userInputNumbers = inputManager.receiveLottoNumber(); + + Map result = calculator.calculateWinningResult(generatedLottos, + userInputNumbers); + double profitRate = calculator.calculateProfitRate(purchaseAmount, result); + + outputManager.printResults(result, profitRate); + } +} diff --git a/src/main/java/lotto/numbers/Lotto.java b/src/main/java/lotto/domain/Lotto.java similarity index 94% rename from src/main/java/lotto/numbers/Lotto.java rename to src/main/java/lotto/domain/Lotto.java index 982d61fb8ce..a1e50171c17 100644 --- a/src/main/java/lotto/numbers/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -1,4 +1,4 @@ -package lotto.numbers; +package lotto.domain; import java.util.HashSet; import java.util.List; @@ -28,7 +28,7 @@ public int getMatchCount(UserInputNumbers receivedLotto) { } public boolean isBonusMatch(UserInputNumbers receivedLotto) { - return lottoNumbers.contains(receivedLotto.getReceivedLottoNumbers()); + return lottoNumbers.contains(receivedLotto.getBonusNumber()); } private void validateLottoNumbers(List lottoNumbers) { @@ -48,4 +48,3 @@ private void validateLottoNumbers(List lottoNumbers) { } } } - diff --git a/src/main/java/lotto/util/Money.java b/src/main/java/lotto/domain/PurchaseAmount.java similarity index 88% rename from src/main/java/lotto/util/Money.java rename to src/main/java/lotto/domain/PurchaseAmount.java index 18b1eeb23f9..96b829fad88 100644 --- a/src/main/java/lotto/util/Money.java +++ b/src/main/java/lotto/domain/PurchaseAmount.java @@ -1,11 +1,11 @@ -package lotto.util; +package lotto.domain; -public class Money { +public class PurchaseAmount { public static final int LOTTO_PRICE = 1000; private int amount; - public Money(String input) { + public PurchaseAmount(String input) { validateIsNumeric(input); int inputAmount = Integer.parseInt(input); validatePurchaseAmount(amount); @@ -29,4 +29,4 @@ private static void validatePurchaseAmount(int inputAmount) { public int getAmount() { return amount; } -} \ No newline at end of file +} diff --git a/src/main/java/lotto/numbers/UserInputNumbers.java b/src/main/java/lotto/domain/UserInputNumbers.java similarity index 56% rename from src/main/java/lotto/numbers/UserInputNumbers.java rename to src/main/java/lotto/domain/UserInputNumbers.java index fb2921b5435..1f231da49fc 100644 --- a/src/main/java/lotto/numbers/UserInputNumbers.java +++ b/src/main/java/lotto/domain/UserInputNumbers.java @@ -1,8 +1,8 @@ -package lotto.numbers; +package lotto.domain; -import static lotto.numbers.Lotto.MIN_LOTTO_NUMBER; -import static lotto.numbers.Lotto.MAX_LOTTO_NUMBER; -import static lotto.numbers.Lotto.SIZE_OF_LOTTO; +import static lotto.domain.Lotto.MIN_LOTTO_NUMBER; +import static lotto.domain.Lotto.MAX_LOTTO_NUMBER; +import static lotto.domain.Lotto.SIZE_OF_LOTTO; import java.util.HashSet; import java.util.List; @@ -10,22 +10,22 @@ public class UserInputNumbers { - static final int SIZE_OF_BONUS_NUMBER = 1; private List receivedLottoNumbers; - private List bonusNumber; + private int bonusNumber; - public UserInputNumbers(List receivedLottoNumbers, List bonusNumber) { + public UserInputNumbers(List receivedLottoNumbers, int bonusNumber) { validateLottoNumbers(receivedLottoNumbers); this.receivedLottoNumbers = receivedLottoNumbers; validateBonusNumbers(bonusNumber); this.bonusNumber = bonusNumber; } - public List getReceivedLottoNumbers() { + public List getReceivedLottoNumbers() { // 결과 계산에 호출됨 return receivedLottoNumbers; } - public List getBonusNumber() { + + public int getBonusNumber() { return bonusNumber; } @@ -46,18 +46,12 @@ private void validateLottoNumbers(List receivedLottoNumbers) { } } - private void validateBonusNumbers(List bonusNumber) { - if (bonusNumber.size() != SIZE_OF_BONUS_NUMBER) { - throw new IllegalArgumentException("[ERROR] 보너스 번호는 1개여야 합니다."); - } - - for (int number : bonusNumber) { - if (number < MIN_LOTTO_NUMBER || number > MAX_LOTTO_NUMBER) { - throw new IllegalArgumentException("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."); - } + private void validateBonusNumbers(int bonusNumber) { + if (bonusNumber < MIN_LOTTO_NUMBER || bonusNumber > MAX_LOTTO_NUMBER) { + throw new IllegalArgumentException("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."); } - if (receivedLottoNumbers.containsAll(bonusNumber)) { + if (new HashSet<>(receivedLottoNumbers).contains(bonusNumber)) { throw new IllegalArgumentException("[ERROR] 로또 번호는 중복이 없어야 합니다."); } } diff --git a/src/main/java/lotto/util/WinningCheck.java b/src/main/java/lotto/domain/WinningCheck.java similarity index 98% rename from src/main/java/lotto/util/WinningCheck.java rename to src/main/java/lotto/domain/WinningCheck.java index 4f2189679dc..d12e948aa9e 100644 --- a/src/main/java/lotto/util/WinningCheck.java +++ b/src/main/java/lotto/domain/WinningCheck.java @@ -1,4 +1,4 @@ -package lotto.util; +package lotto.domain; public enum WinningCheck { LOSE("0", 0), diff --git a/src/main/java/lotto/sevice/Calculator.java b/src/main/java/lotto/sevice/Calculator.java new file mode 100644 index 00000000000..a0d8c376377 --- /dev/null +++ b/src/main/java/lotto/sevice/Calculator.java @@ -0,0 +1,46 @@ +package lotto.sevice; + +import java.text.DecimalFormat; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import lotto.domain.Lotto; +import lotto.domain.PurchaseAmount; +import lotto.domain.UserInputNumbers; +import lotto.domain.WinningCheck; + +public class Calculator { + + private static final int PERCENTAGE_FACTOR = 100; + + public Map calculateWinningResult(List lottos, + UserInputNumbers receivedLotto) { + Map result = new HashMap<>(); // WinningCheck 객체 정수를 키와 값으로 Map에 저장 + for (Lotto lotto : lottos) { + int matchCount = lotto.getMatchCount(receivedLotto); + boolean bonusMatch = lotto.isBonusMatch(receivedLotto); // receivedLotto는 bonus를 포함하고있음 + + WinningCheck prize = WinningCheck.getPrize(matchCount, bonusMatch); + result.put(prize // prize 키와 해당하는 값을 Map에 넣는다. 이미 있다면 덮어쓴다 + , result.getOrDefault(prize, 0) + 1); + /*키(prize)에 해당하는 값을 가져온다. 없다면 default(0)을 반환 + -> 해당하는 현재의 당첨 수를 가져오고 그 수에 1을 더해서 새로운 당첨 수를 계산함*/ + } + return result; + } + + public double calculateProfitRate(PurchaseAmount purchaseAmount, + Map result) { + double totalPrize = 0; + for (Map.Entry entry : result.entrySet()) { + WinningCheck prize = entry.getKey(); + int count = entry.getValue(); + totalPrize += Double.parseDouble(prize.getPrizeAmount() + .replace(",", "")) * count; + } + + double profitRate = (totalPrize / purchaseAmount.getAmount()) * PERCENTAGE_FACTOR; + DecimalFormat df = new DecimalFormat("#.##"); + return Double.parseDouble(df.format(profitRate)); + } +} diff --git a/src/main/java/lotto/sevice/LottoGenerator.java b/src/main/java/lotto/sevice/LottoGenerator.java new file mode 100644 index 00000000000..480dbd8c10e --- /dev/null +++ b/src/main/java/lotto/sevice/LottoGenerator.java @@ -0,0 +1,38 @@ +package lotto.sevice; + +import static lotto.domain.Lotto.MAX_LOTTO_NUMBER; +import static lotto.domain.Lotto.MIN_LOTTO_NUMBER; +import static lotto.domain.Lotto.SIZE_OF_LOTTO; +import static lotto.domain.PurchaseAmount.LOTTO_PRICE; + +import camp.nextstep.edu.missionutils.Randoms; +import java.util.ArrayList; +import java.util.List; +import lotto.domain.Lotto; +import lotto.domain.PurchaseAmount; + +public class LottoGenerator { + + public static List generateLottos(PurchaseAmount purchaseAmount) { + int numberOfLotto = purchaseAmount.getAmount() / LOTTO_PRICE; + System.out.println("\n" + numberOfLotto + "개를 구매했습니다."); + + List generatedLottos = new ArrayList<>(); + + for (int i = 0; i < numberOfLotto; i++) { + List lottoNumbers = + Randoms.pickUniqueNumbersInRange(MIN_LOTTO_NUMBER, MAX_LOTTO_NUMBER, SIZE_OF_LOTTO); + + try { + Lotto lotto = new Lotto(lottoNumbers); + generatedLottos.add(lotto); + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + i--; + } + } + + return generatedLottos; + } + +} diff --git a/src/main/java/lotto/util/InputManager.java b/src/main/java/lotto/util/InputManager.java new file mode 100644 index 00000000000..878edd7dece --- /dev/null +++ b/src/main/java/lotto/util/InputManager.java @@ -0,0 +1,47 @@ +package lotto.util; + +import camp.nextstep.edu.missionutils.Console; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import lotto.domain.PurchaseAmount; +import lotto.domain.UserInputNumbers; + +public class InputManager { + + public PurchaseAmount receivePurchaseAmount() { + PurchaseAmount purchaseAmount = null; + while (true) { + try { + System.out.println("구입금액을 입력해 주세요."); + String input = Console.readLine(); + purchaseAmount = new PurchaseAmount(input); + break; + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + return purchaseAmount; + } + + public UserInputNumbers receiveLottoNumber() { + while (true) { + System.out.println("\n당첨 번호를 입력해 주세요."); + String inputNumbers = Console.readLine(); + try { + String[] numbersArray = inputNumbers.split(","); + List receivedLottoNumbers = new ArrayList<>(); + Arrays.stream(numbersArray) + .forEach(number -> receivedLottoNumbers.add(Integer.parseInt(number.trim()))); // 공백 제거 + System.out.println("\n보너스 번호를 입력해 주세요."); + int bonusNumber = Integer.parseInt(Console.readLine().trim()); + + return new UserInputNumbers(receivedLottoNumbers, bonusNumber); + } catch (NumberFormatException e) { + System.out.println("[ERROR] 보너스 번호는 1개여야 합니다."); // 하나가 아니라면 String으로 인식 + } catch (IllegalArgumentException e) { + System.out.println(e.getMessage()); + } + } + } +} diff --git a/src/main/java/lotto/util/LottoManager.java b/src/main/java/lotto/util/LottoManager.java deleted file mode 100644 index f6a8f08f001..00000000000 --- a/src/main/java/lotto/util/LottoManager.java +++ /dev/null @@ -1,143 +0,0 @@ -package lotto.util; - -import static lotto.numbers.Lotto.MAX_LOTTO_NUMBER; -import static lotto.numbers.Lotto.MIN_LOTTO_NUMBER; -import static lotto.numbers.Lotto.SIZE_OF_LOTTO; -import static lotto.util.Money.LOTTO_PRICE; - -import camp.nextstep.edu.missionutils.Console; -import camp.nextstep.edu.missionutils.Randoms; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import lotto.numbers.Lotto; -import lotto.numbers.UserInputNumbers; - -public class LottoManager { - - public static final int PERCENTAGE_FACTOR = 100; - - public void runLotto() { - Money money = receivePurchaseAmount(); - List lottos = generateLottos(money.getAmount()); - printGeneratedLottoNumbers(lottos); - UserInputNumbers receivedLotto = receiveLottoNumber(); - Map result = calculateWinningResult(lottos, receivedLotto); - printWinningResult(result); - printProfitRate(money.getAmount(), result); - } - - private Money receivePurchaseAmount() { - Money money; - while (true) { - try { - System.out.println("구입금액을 입력해 주세요."); - String input = Console.readLine(); - money = new Money(input); - break; - } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); - } - } - return money; - } - - private List generateLottos(int money) { - int numberOfLotto = money / LOTTO_PRICE; - System.out.println("\n" + numberOfLotto + "개를 구매했습니다."); - - List lottos = new ArrayList<>(); - - for (int i = 0; i < numberOfLotto; i++) { - List lottoNumbers = - Randoms.pickUniqueNumbersInRange(MIN_LOTTO_NUMBER, MAX_LOTTO_NUMBER, SIZE_OF_LOTTO); - - try { - Lotto lotto = new Lotto(lottoNumbers); - lottos.add(lotto); - } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); - i--; - } - } - - return lottos; - } - - private void printGeneratedLottoNumbers(List lottos) { - for (Lotto lotto : lottos) { - List lottoNumbers = new ArrayList<>(lotto.getLottoNumbers()); - Collections.sort(lottoNumbers); - System.out.println(lottoNumbers); - } - } - - private UserInputNumbers receiveLottoNumber() { - while (true) { - System.out.println("\n당첨 번호를 입력해 주세요."); - String inputNumbers = Console.readLine(); - try { - String[] numbersArray = inputNumbers.split(","); - List receivedLottoNumbers = new ArrayList<>(); - Arrays.stream(numbersArray) - .forEach(number -> receivedLottoNumbers.add(Integer.parseInt(number.trim()))); // 공백 제거 - System.out.println("\n보너스 번호를 입력해 주세요."); - int bonusNumber = Integer.parseInt(Console.readLine().trim()); - - return new UserInputNumbers(receivedLottoNumbers, List.of(bonusNumber)); - } catch (IllegalArgumentException e) { - System.out.println(e.getMessage()); - } - } - } - - private Map calculateWinningResult(List lottos - , UserInputNumbers receivedLotto) { - Map result = new HashMap<>(); // WinningCheck 객체와 정수를 키와 값으로 Map에 저장 - for (Lotto lotto : lottos) { - int matchCount = lotto.getMatchCount(receivedLotto); - boolean bonusMatch = lotto.isBonusMatch(receivedLotto); - - WinningCheck prize = WinningCheck.getPrize(matchCount, bonusMatch); - result.put(prize // prize 키와 해당하는 값을 Map에 넣는다. 이미 있다면 덮어쓴다 - , result.getOrDefault(prize, 0) + 1); - /*키(prize)에 해당하는 값을 가져온다. 없다면 default(0)을 반환 - -> 해당하는 현재의 당첨 수를 가져오고 그 수에 1을 더해서 새로운 당첨 수를 계산함*/ - } - return result; - } - - private void printWinningResult(Map result) { - System.out.println("\n당첨 통계\n---"); - for (WinningCheck prize : WinningCheck.values()) { - if (prize == WinningCheck.LOSE) { - continue; - } - String bonus = prize.hasBonus() ? ", 보너스 볼 일치" : ""; - System.out.println( - prize.getMatchingCount() + "개 일치" + bonus + " (" + prize.getPrizeAmount() + "원) - " - + result.getOrDefault(prize, 0) + "개"); - } - } - - private void printProfitRate(int amount, Map result) { - double totalPrize = 0; - for (Map.Entry entry : result.entrySet()) { - // entry: 맵의 각 항목을 나타내는 객체, .entrySet(): 맵의 모든 항목을 객체의 Set으로 반환 - WinningCheck prize = entry.getKey(); // enum에 열거된 상금을 가져온다 - int count = entry.getValue(); // 당첨 횟수를 가져온다. - totalPrize += Double.parseDouble(prize.getPrizeAmount() - .replace(",", "")) * count; // 문자열을 double로 변환하기 위해 쉼표 제거 - } - - double profitRate = (totalPrize / amount) * PERCENTAGE_FACTOR; - DecimalFormat df = new DecimalFormat("#.##"); - profitRate = Double.parseDouble(df.format(profitRate)); // 소수 둘째 자리에서 반올림 - - System.out.println("총 수익률은 " + profitRate + "%입니다."); - } -} \ No newline at end of file diff --git a/src/main/java/lotto/util/OutputManager.java b/src/main/java/lotto/util/OutputManager.java new file mode 100644 index 00000000000..323c80e6405 --- /dev/null +++ b/src/main/java/lotto/util/OutputManager.java @@ -0,0 +1,41 @@ +package lotto.util; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import lotto.domain.Lotto; +import lotto.domain.WinningCheck; + +public class OutputManager { + + public static void printGeneratedLottoNumbers(List lottos) { + for (Lotto lotto : lottos) { + List sortedLottoNumbers = new ArrayList<>(lotto.getLottoNumbers()); + Collections.sort(sortedLottoNumbers); + System.out.println(sortedLottoNumbers); + } + } + + public void printResults(Map result, double profitRate) { + printWinningResult(result); + printProfitRate(profitRate); + } + + private void printWinningResult(Map result) { + System.out.println("\n당첨 통계\n---"); + for (WinningCheck prize : WinningCheck.values()) { + if (prize == WinningCheck.LOSE) { + continue; + } + String bonus = prize.hasBonus() ? ", 보너스 볼 일치" : ""; + System.out.println( + prize.getMatchingCount() + "개 일치" + bonus + " (" + prize.getPrizeAmount() + "원) - " + + result.getOrDefault(prize, 0) + "개"); + } + } + + private void printProfitRate(double profitRate) { + System.out.println("총 수익률은 " + profitRate + "%입니다."); + } +} From c12be999c2fdd86285ba364d0ffae2c99e89226f Mon Sep 17 00:00:00 2001 From: junseoplee Date: Tue, 16 Jan 2024 19:07:04 +0900 Subject: [PATCH 16/31] =?UTF-8?q?fix:=20getter=EC=9D=98=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=93=B1=20=EC=BB=A8=EB=B2=A4=EC=85=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/Lotto.java | 8 +++---- .../java/lotto/domain/UserInputNumbers.java | 17 +++++++------ src/main/java/lotto/domain/WinningCheck.java | 24 +++++++++---------- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index a1e50171c17..deedb0c7026 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -16,10 +16,6 @@ public Lotto(List lottoNumbers) { this.lottoNumbers = lottoNumbers; } - public List getLottoNumbers() { - return lottoNumbers; - } - public int getMatchCount(UserInputNumbers receivedLotto) { int matchCount = (int) lottoNumbers.stream() .filter(number -> receivedLotto.getReceivedLottoNumbers().contains(number)) @@ -47,4 +43,8 @@ private void validateLottoNumbers(List lottoNumbers) { throw new IllegalArgumentException("[ERROR] 로또 번호는 중복이 없어야 합니다."); } } + + public List getLottoNumbers() { + return lottoNumbers; + } } diff --git a/src/main/java/lotto/domain/UserInputNumbers.java b/src/main/java/lotto/domain/UserInputNumbers.java index 1f231da49fc..8fb5842765e 100644 --- a/src/main/java/lotto/domain/UserInputNumbers.java +++ b/src/main/java/lotto/domain/UserInputNumbers.java @@ -20,15 +20,6 @@ public UserInputNumbers(List receivedLottoNumbers, int bonusNumber) { this.bonusNumber = bonusNumber; } - public List getReceivedLottoNumbers() { // 결과 계산에 호출됨 - return receivedLottoNumbers; - } - - - public int getBonusNumber() { - return bonusNumber; - } - private void validateLottoNumbers(List receivedLottoNumbers) { if (receivedLottoNumbers.size() != SIZE_OF_LOTTO) { throw new IllegalArgumentException("[ERROR] 로또 번호는 총 6개여야 합니다."); @@ -55,4 +46,12 @@ private void validateBonusNumbers(int bonusNumber) { throw new IllegalArgumentException("[ERROR] 로또 번호는 중복이 없어야 합니다."); } } + + public List getReceivedLottoNumbers() { // 결과 계산에 호출됨 + return receivedLottoNumbers; + } + + public int getBonusNumber() { + return bonusNumber; + } } diff --git a/src/main/java/lotto/domain/WinningCheck.java b/src/main/java/lotto/domain/WinningCheck.java index d12e948aa9e..f9a7376657c 100644 --- a/src/main/java/lotto/domain/WinningCheck.java +++ b/src/main/java/lotto/domain/WinningCheck.java @@ -24,18 +24,6 @@ public enum WinningCheck { this.hasBonus = hasBonus; } - public String getPrizeAmount() { - return prizeAmount; - } - - public int getMatchingCount() { - return matchingCount; - } - - public boolean hasBonus() { - return hasBonus; - } - public static WinningCheck getPrize(int matchCount, boolean bonusMatch) { if (matchCount == 6) { return FIRST_PRIZE; @@ -51,4 +39,16 @@ public static WinningCheck getPrize(int matchCount, boolean bonusMatch) { } return LOSE; } + + public String getPrizeAmount() { + return prizeAmount; + } + + public int getMatchingCount() { + return matchingCount; + } + + public boolean hasBonus() { + return hasBonus; + } } From 2b5fd6fecd140cfb5389443d55d33f877964dfbf Mon Sep 17 00:00:00 2001 From: junseoplee Date: Wed, 17 Jan 2024 03:11:56 +0900 Subject: [PATCH 17/31] =?UTF-8?q?fix:=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20-=20numbersArray=20->=20separatedNumbers?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD=20=EB=B3=80=EC=88=98=EB=AA=85=EC=97=90?= =?UTF-8?q?=EB=8A=94=20=EC=9E=90=EB=A3=8C=ED=98=95=EC=9D=B4=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EA=B2=83=EC=9D=B4=20=EC=A2=8B=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/util/InputManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/util/InputManager.java b/src/main/java/lotto/util/InputManager.java index 878edd7dece..6179d0d19ca 100644 --- a/src/main/java/lotto/util/InputManager.java +++ b/src/main/java/lotto/util/InputManager.java @@ -29,9 +29,9 @@ public UserInputNumbers receiveLottoNumber() { System.out.println("\n당첨 번호를 입력해 주세요."); String inputNumbers = Console.readLine(); try { - String[] numbersArray = inputNumbers.split(","); + String[] separatedNumbers = inputNumbers.split(","); List receivedLottoNumbers = new ArrayList<>(); - Arrays.stream(numbersArray) + Arrays.stream(separatedNumbers) .forEach(number -> receivedLottoNumbers.add(Integer.parseInt(number.trim()))); // 공백 제거 System.out.println("\n보너스 번호를 입력해 주세요."); int bonusNumber = Integer.parseInt(Console.readLine().trim()); From c0fda34b2f3ed0f180efd2ed045f919a39bcb438 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Wed, 17 Jan 2024 22:16:38 +0900 Subject: [PATCH 18/31] =?UTF-8?q?fix:=20=EA=B5=AC=ED=98=84=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20stream=EC=9D=98=20map(),=20merge(),=20toList()?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=82=AC=EC=9A=A9=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=A7=81=EA=B4=80=EC=A0=81=EC=9D=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84=20-=20try=20=EB=AC=B8=20?= =?UTF-8?q?=EC=95=88=EC=97=90=EC=84=9C=20=EC=A7=81=EC=A0=91=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EC=97=AC=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=B3=80=EC=88=98=20=EC=84=A0?= =?UTF-8?q?=EC=96=B8=EC=9D=84=20=EC=83=9D=EB=9E=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/sevice/Calculator.java | 5 +---- src/main/java/lotto/util/InputManager.java | 14 ++++++-------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/main/java/lotto/sevice/Calculator.java b/src/main/java/lotto/sevice/Calculator.java index a0d8c376377..b6762e5ab65 100644 --- a/src/main/java/lotto/sevice/Calculator.java +++ b/src/main/java/lotto/sevice/Calculator.java @@ -21,10 +21,7 @@ public Map calculateWinningResult(List lottos, boolean bonusMatch = lotto.isBonusMatch(receivedLotto); // receivedLotto는 bonus를 포함하고있음 WinningCheck prize = WinningCheck.getPrize(matchCount, bonusMatch); - result.put(prize // prize 키와 해당하는 값을 Map에 넣는다. 이미 있다면 덮어쓴다 - , result.getOrDefault(prize, 0) + 1); - /*키(prize)에 해당하는 값을 가져온다. 없다면 default(0)을 반환 - -> 해당하는 현재의 당첨 수를 가져오고 그 수에 1을 더해서 새로운 당첨 수를 계산함*/ + result.merge(prize, 1, Integer::sum); } return result; } diff --git a/src/main/java/lotto/util/InputManager.java b/src/main/java/lotto/util/InputManager.java index 6179d0d19ca..1c294c502d8 100644 --- a/src/main/java/lotto/util/InputManager.java +++ b/src/main/java/lotto/util/InputManager.java @@ -1,7 +1,6 @@ package lotto.util; import camp.nextstep.edu.missionutils.Console; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import lotto.domain.PurchaseAmount; @@ -10,29 +9,28 @@ public class InputManager { public PurchaseAmount receivePurchaseAmount() { - PurchaseAmount purchaseAmount = null; while (true) { try { System.out.println("구입금액을 입력해 주세요."); String input = Console.readLine(); - purchaseAmount = new PurchaseAmount(input); - break; + return new PurchaseAmount(input); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } - return purchaseAmount; } + public UserInputNumbers receiveLottoNumber() { while (true) { System.out.println("\n당첨 번호를 입력해 주세요."); String inputNumbers = Console.readLine(); try { String[] separatedNumbers = inputNumbers.split(","); - List receivedLottoNumbers = new ArrayList<>(); - Arrays.stream(separatedNumbers) - .forEach(number -> receivedLottoNumbers.add(Integer.parseInt(number.trim()))); // 공백 제거 + List receivedLottoNumbers = Arrays.stream(separatedNumbers) + .map(String::trim) + .map(Integer::parseInt) + .toList(); System.out.println("\n보너스 번호를 입력해 주세요."); int bonusNumber = Integer.parseInt(Console.readLine().trim()); From 1829f9cf434d0631af017fdc8ab58177345fcd5a Mon Sep 17 00:00:00 2001 From: junseoplee Date: Wed, 17 Jan 2024 22:21:21 +0900 Subject: [PATCH 19/31] =?UTF-8?q?docs:=20=EA=B5=AC=ED=98=84=ED=95=A0=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EB=AA=A9=EB=A1=9D=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index 4f0d1119c81..2a2264f12df 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,19 +17,19 @@ RunLotto에 필요한 기능들을 패키지로 묶어보자 동작 구조 1. receivePurchaseAmount()로 구입금액을 입력받아 PurchaseAmount에 객체로 저장(유효성 검사) -2. 생성된 PurchaseAmount를 매개변수로 받아 generateLottos(PurchaseAmount purchaseAmount) +2. 생성된 PurchaseAmount를 ㄹㄹㄹ 받아 generateLottos(PurchaseAmount purchaseAmount) 입력받은 양 만큼 Lotto 객체로 로또를 발행(유효성 검사) -> 리턴 값은 List로 generatedLottos를 리턴 3. generatedLottos를 매개변수로 받아 printGeneratedLottoNumbers(List lottos) 생성된 로또들을 출력 -4. receiveLottoNumber() 로또 번호 6개와 보너스 번호 1개를 입력 받아 UserInputNumbers에 객체로 저장(유효성 검사) -5. calculateWinningResult(List lottos, UserInputNumbers receivedLotto) +4. calculateWinningResult(List lottos, UserInputNumbers receivedLotto) Map을 이용해서 result를 생성 WinningCheck에 열거형으로 상금과 당첨 수를 저장 Lotto클래스에서 각 로또 당 matchCount와 bonusMatch를 가져온다 -> WinningCheck.getPrize(matchCount, bonusMatch) -> 각 로또 당 상금과 수를 result에 저장 후 리턴 -6. calculateProfitRate(PurchaseAmount purchaseAmount, Map result) +5. calculateProfitRate(PurchaseAmount purchaseAmount, Map result) 구입금액과 결과를 비교하여 수익률을 계산(소수 둘째에서 반올림) -> 리턴 값은 double profitRate -7. printResults(Map result, double profitRate) 최종 결과 출력 +6. printResults(Map result, double profitRate) 최종 결과 출력 해야할 것 금액 출력 enum을 String으로 할 필요가 없다 -> DecimalFormat decFormat = new DecimalFormat("###,###"); -calculateProfitRate 메서드 수정하기 +calculateProfitRate 메서드 수정하기 receiveLottoNumber() 로또 번호 6개와 보너스 번호 1개를 입력 받아 UserInputNumbers에 객체로 +저장(유효성 검사) From 32f7bd4631ba9eafde659cdb5724f004ba66ac0e Mon Sep 17 00:00:00 2001 From: junseoplee Date: Thu, 18 Jan 2024 01:44:16 +0900 Subject: [PATCH 20/31] =?UTF-8?q?fix:=20WinningCheck=20enum=EC=9D=98=20?= =?UTF-8?q?=EC=83=81=EA=B8=88=EC=9D=84=20String=EC=97=90=EC=84=9C=20int?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/WinningCheck.java | 22 ++++++++++---------- src/main/java/lotto/sevice/Calculator.java | 3 +-- src/main/java/lotto/util/OutputManager.java | 5 ++++- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/main/java/lotto/domain/WinningCheck.java b/src/main/java/lotto/domain/WinningCheck.java index f9a7376657c..68719b49cb6 100644 --- a/src/main/java/lotto/domain/WinningCheck.java +++ b/src/main/java/lotto/domain/WinningCheck.java @@ -1,24 +1,24 @@ package lotto.domain; public enum WinningCheck { - LOSE("0", 0), - FIFTH_PRIZE("5,000", 3), - FOURTH_PRIZE("50,000", 4), - THIRD_PRIZE("1,500,000", 5, false), - SECOND_PRIZE("30,000,000", 5, true), - FIRST_PRIZE("2,000,000,000", 6); - - private final String prizeAmount; + LOSE(0, 0), + FIFTH_PRIZE(5000, 3), + FOURTH_PRIZE(50000, 4), + THIRD_PRIZE(1500000, 5, false), + SECOND_PRIZE(30000000, 5, true), + FIRST_PRIZE(2000000000, 6); + + private final int prizeAmount; private final int matchingCount; private final boolean hasBonus; - WinningCheck(String prizeAmount, int matchingCount) { + WinningCheck(int prizeAmount, int matchingCount) { this.prizeAmount = prizeAmount; this.matchingCount = matchingCount; this.hasBonus = false; } - WinningCheck(String prizeAmount, int matchingCount, boolean hasBonus) { + WinningCheck(int prizeAmount, int matchingCount, boolean hasBonus) { this.prizeAmount = prizeAmount; this.matchingCount = matchingCount; this.hasBonus = hasBonus; @@ -40,7 +40,7 @@ public static WinningCheck getPrize(int matchCount, boolean bonusMatch) { return LOSE; } - public String getPrizeAmount() { + public int getPrizeAmount() { return prizeAmount; } diff --git a/src/main/java/lotto/sevice/Calculator.java b/src/main/java/lotto/sevice/Calculator.java index b6762e5ab65..9866d1255d9 100644 --- a/src/main/java/lotto/sevice/Calculator.java +++ b/src/main/java/lotto/sevice/Calculator.java @@ -32,8 +32,7 @@ public double calculateProfitRate(PurchaseAmount purchaseAmount, for (Map.Entry entry : result.entrySet()) { WinningCheck prize = entry.getKey(); int count = entry.getValue(); - totalPrize += Double.parseDouble(prize.getPrizeAmount() - .replace(",", "")) * count; + totalPrize += prize.getPrizeAmount() * count; } double profitRate = (totalPrize / purchaseAmount.getAmount()) * PERCENTAGE_FACTOR; diff --git a/src/main/java/lotto/util/OutputManager.java b/src/main/java/lotto/util/OutputManager.java index 323c80e6405..ec6035eb56d 100644 --- a/src/main/java/lotto/util/OutputManager.java +++ b/src/main/java/lotto/util/OutputManager.java @@ -1,5 +1,6 @@ package lotto.util; +import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -23,14 +24,16 @@ public void printResults(Map result, double profitRate) { } private void printWinningResult(Map result) { + DecimalFormat decimalFormat = new DecimalFormat("#,###"); System.out.println("\n당첨 통계\n---"); for (WinningCheck prize : WinningCheck.values()) { if (prize == WinningCheck.LOSE) { continue; } String bonus = prize.hasBonus() ? ", 보너스 볼 일치" : ""; + String formattedPrize = decimalFormat.format(prize.getPrizeAmount()); System.out.println( - prize.getMatchingCount() + "개 일치" + bonus + " (" + prize.getPrizeAmount() + "원) - " + prize.getMatchingCount() + "개 일치" + bonus + " (" + formattedPrize + "원) - " + result.getOrDefault(prize, 0) + "개"); } } From d62f6cd70aa9a882c1f92ea194ba0bd13bc9ec31 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Fri, 19 Jan 2024 01:54:50 +0900 Subject: [PATCH 21/31] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EB=B3=80=EC=88=98=20=EB=B0=8F=20=EC=A3=BC=EC=84=9D?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/Lotto.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index deedb0c7026..4a246c780ee 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -9,7 +9,7 @@ public class Lotto { public static final int MIN_LOTTO_NUMBER = 1; public static final int MAX_LOTTO_NUMBER = 45; public static final int SIZE_OF_LOTTO = 6; - private List lottoNumbers; + private final List lottoNumbers; public Lotto(List lottoNumbers) { validateLottoNumbers(lottoNumbers); @@ -17,10 +17,9 @@ public Lotto(List lottoNumbers) { } public int getMatchCount(UserInputNumbers receivedLotto) { - int matchCount = (int) lottoNumbers.stream() + return (int) lottoNumbers.stream() .filter(number -> receivedLotto.getReceivedLottoNumbers().contains(number)) - .count(); // count() 메서드는 반환 값이 long이다. int로 캐스팅 해야한다. - return matchCount; + .count(); } public boolean isBonusMatch(UserInputNumbers receivedLotto) { From e22152e6322e31ed82f26ac22a31e147cce3b69b Mon Sep 17 00:00:00 2001 From: junseoplee Date: Fri, 19 Jan 2024 01:57:06 +0900 Subject: [PATCH 22/31] =?UTF-8?q?docs:=20=ED=95=B4=EA=B2=B0=ED=95=9C=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=AD=EB=AA=A9=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/README.md b/docs/README.md index 2a2264f12df..24b84a4cc38 100644 --- a/docs/README.md +++ b/docs/README.md @@ -27,9 +27,3 @@ RunLotto에 필요한 기능들을 패키지로 묶어보자 5. calculateProfitRate(PurchaseAmount purchaseAmount, Map result) 구입금액과 결과를 비교하여 수익률을 계산(소수 둘째에서 반올림) -> 리턴 값은 double profitRate 6. printResults(Map result, double profitRate) 최종 결과 출력 - -해야할 것 -금액 출력 enum을 String으로 할 필요가 없다 --> DecimalFormat decFormat = new DecimalFormat("###,###"); -calculateProfitRate 메서드 수정하기 receiveLottoNumber() 로또 번호 6개와 보너스 번호 1개를 입력 받아 UserInputNumbers에 객체로 -저장(유효성 검사) From 3e0d8fcce1e173da8d3729abe3a0b0a2e3e6bde2 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Fri, 19 Jan 2024 01:59:30 +0900 Subject: [PATCH 23/31] =?UTF-8?q?docs:=20=EC=98=A4=ED=83=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 24b84a4cc38..64c97dd2481 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,7 +17,7 @@ RunLotto에 필요한 기능들을 패키지로 묶어보자 동작 구조 1. receivePurchaseAmount()로 구입금액을 입력받아 PurchaseAmount에 객체로 저장(유효성 검사) -2. 생성된 PurchaseAmount를 ㄹㄹㄹ 받아 generateLottos(PurchaseAmount purchaseAmount) +2. 생성된 PurchaseAmount를 받아 generateLottos(PurchaseAmount purchaseAmount) 입력받은 양 만큼 Lotto 객체로 로또를 발행(유효성 검사) -> 리턴 값은 List로 generatedLottos를 리턴 3. generatedLottos를 매개변수로 받아 printGeneratedLottoNumbers(List lottos) 생성된 로또들을 출력 4. calculateWinningResult(List lottos, UserInputNumbers receivedLotto) From 76224f2ccdfe4ca1da4a2b736a07fdccbb506607 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Sun, 21 Jan 2024 18:17:38 +0900 Subject: [PATCH 24/31] =?UTF-8?q?fix:=20=EB=8B=A8=EC=9C=84=20=EA=B5=AC?= =?UTF-8?q?=EB=B6=84=EC=9D=84=20=EC=9C=84=ED=95=B4=20'=5F'=20=EC=82=BD?= =?UTF-8?q?=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/WinningCheck.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/lotto/domain/WinningCheck.java b/src/main/java/lotto/domain/WinningCheck.java index 68719b49cb6..5569e6b537a 100644 --- a/src/main/java/lotto/domain/WinningCheck.java +++ b/src/main/java/lotto/domain/WinningCheck.java @@ -2,11 +2,11 @@ public enum WinningCheck { LOSE(0, 0), - FIFTH_PRIZE(5000, 3), - FOURTH_PRIZE(50000, 4), - THIRD_PRIZE(1500000, 5, false), - SECOND_PRIZE(30000000, 5, true), - FIRST_PRIZE(2000000000, 6); + FIFTH_PRIZE(5_000, 3), + FOURTH_PRIZE(50_000, 4), + THIRD_PRIZE(1_500_000, 5, false), + SECOND_PRIZE(30_000_000, 5, true), + FIRST_PRIZE(2_000_000_000, 6); private final int prizeAmount; private final int matchingCount; From 58013f849c0177340cb89cc2f3acb5d5456a0d92 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Sun, 21 Jan 2024 18:22:13 +0900 Subject: [PATCH 25/31] =?UTF-8?q?refactor:=20Calculator=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=A0=95=20-=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EA=B3=84=EC=82=B0,=20=EC=88=98=EC=9D=B5?= =?UTF-8?q?=EB=A5=A0=20=EA=B3=84=EC=82=B0=EC=9D=98=20=EC=B1=85=EC=9E=84?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20-=20=EB=B0=98?= =?UTF-8?q?=EB=B3=B5=EB=AC=B8=EC=9D=84=20=EC=8A=A4=ED=8A=B8=EB=A6=BC?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=98=EC=97=AC=20?= =?UTF-8?q?=EB=B3=B4=EB=8B=A4=20=EB=AA=85=ED=99=95=ED=95=98=EA=B3=A0=20?= =?UTF-8?q?=EC=A7=81=EA=B4=80=EC=A0=81=EC=9D=B8=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=EB=A1=9C=20=EC=88=98=EC=A0=95=20-=20service=20=EC=98=A4?= =?UTF-8?q?=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/RunLotto.java | 16 +++++++++----- .../{sevice => service}/LottoGenerator.java | 2 +- .../service/LottoProfitRateCalculator.java | 22 +++++++++++++++++++ .../LottoResultCalculator.java} | 22 ++----------------- 4 files changed, 35 insertions(+), 27 deletions(-) rename src/main/java/lotto/{sevice => service}/LottoGenerator.java (97%) create mode 100644 src/main/java/lotto/service/LottoProfitRateCalculator.java rename src/main/java/lotto/{sevice/Calculator.java => service/LottoResultCalculator.java} (51%) diff --git a/src/main/java/lotto/RunLotto.java b/src/main/java/lotto/RunLotto.java index 7e7249cb59d..eb1d47403be 100644 --- a/src/main/java/lotto/RunLotto.java +++ b/src/main/java/lotto/RunLotto.java @@ -5,9 +5,10 @@ import lotto.domain.Lotto; import lotto.domain.PurchaseAmount; import lotto.domain.UserInputNumbers; -import lotto.sevice.Calculator; +import lotto.service.LottoProfitRateCalculator; +import lotto.service.LottoResultCalculator; import lotto.util.InputManager; -import lotto.sevice.LottoGenerator; +import lotto.service.LottoGenerator; import lotto.util.OutputManager; import lotto.domain.WinningCheck; @@ -15,19 +16,22 @@ public class RunLotto { private final InputManager inputManager = new InputManager(); private final LottoGenerator lottoGenerator = new LottoGenerator(); - private final Calculator calculator = new Calculator(); + private final LottoResultCalculator lottoResultCalculator = new LottoResultCalculator(); + private final LottoProfitRateCalculator lottoProfitRateCalculator = new LottoProfitRateCalculator(); private final OutputManager outputManager = new OutputManager(); public void runLotto() { PurchaseAmount purchaseAmount = inputManager.receivePurchaseAmount(); + List generatedLottos = lottoGenerator.generateLottos(purchaseAmount); outputManager.printGeneratedLottoNumbers(generatedLottos); UserInputNumbers userInputNumbers = inputManager.receiveLottoNumber(); - Map result = calculator.calculateWinningResult(generatedLottos, - userInputNumbers); - double profitRate = calculator.calculateProfitRate(purchaseAmount, result); + Map result = lottoResultCalculator + .calculateWinningResult(generatedLottos, userInputNumbers); + double profitRate = lottoProfitRateCalculator + .calculateProfitRate(purchaseAmount, result); outputManager.printResults(result, profitRate); } diff --git a/src/main/java/lotto/sevice/LottoGenerator.java b/src/main/java/lotto/service/LottoGenerator.java similarity index 97% rename from src/main/java/lotto/sevice/LottoGenerator.java rename to src/main/java/lotto/service/LottoGenerator.java index 480dbd8c10e..e532a1da483 100644 --- a/src/main/java/lotto/sevice/LottoGenerator.java +++ b/src/main/java/lotto/service/LottoGenerator.java @@ -1,4 +1,4 @@ -package lotto.sevice; +package lotto.service; import static lotto.domain.Lotto.MAX_LOTTO_NUMBER; import static lotto.domain.Lotto.MIN_LOTTO_NUMBER; diff --git a/src/main/java/lotto/service/LottoProfitRateCalculator.java b/src/main/java/lotto/service/LottoProfitRateCalculator.java new file mode 100644 index 00000000000..6eb5a3446fd --- /dev/null +++ b/src/main/java/lotto/service/LottoProfitRateCalculator.java @@ -0,0 +1,22 @@ +package lotto.service; + +import java.text.DecimalFormat; +import java.util.Map; +import lotto.domain.PurchaseAmount; +import lotto.domain.WinningCheck; + +public class LottoProfitRateCalculator { + + private static final int PERCENTAGE_FACTOR = 100; + + public double calculateProfitRate(PurchaseAmount purchaseAmount, + Map result) { + double totalPrize = result.entrySet().stream() + .mapToInt(entry -> entry.getKey().getPrizeAmount() * entry.getValue()) + .sum(); + + double profitRate = (totalPrize / purchaseAmount.getAmount()) * PERCENTAGE_FACTOR; + DecimalFormat df = new DecimalFormat("#.##"); + return Double.parseDouble(df.format(profitRate)); + } +} diff --git a/src/main/java/lotto/sevice/Calculator.java b/src/main/java/lotto/service/LottoResultCalculator.java similarity index 51% rename from src/main/java/lotto/sevice/Calculator.java rename to src/main/java/lotto/service/LottoResultCalculator.java index 9866d1255d9..e27fbef52b8 100644 --- a/src/main/java/lotto/sevice/Calculator.java +++ b/src/main/java/lotto/service/LottoResultCalculator.java @@ -1,17 +1,13 @@ -package lotto.sevice; +package lotto.service; -import java.text.DecimalFormat; import java.util.HashMap; import java.util.List; import java.util.Map; import lotto.domain.Lotto; -import lotto.domain.PurchaseAmount; import lotto.domain.UserInputNumbers; import lotto.domain.WinningCheck; -public class Calculator { - - private static final int PERCENTAGE_FACTOR = 100; +public class LottoResultCalculator { public Map calculateWinningResult(List lottos, UserInputNumbers receivedLotto) { @@ -25,18 +21,4 @@ public Map calculateWinningResult(List lottos, } return result; } - - public double calculateProfitRate(PurchaseAmount purchaseAmount, - Map result) { - double totalPrize = 0; - for (Map.Entry entry : result.entrySet()) { - WinningCheck prize = entry.getKey(); - int count = entry.getValue(); - totalPrize += prize.getPrizeAmount() * count; - } - - double profitRate = (totalPrize / purchaseAmount.getAmount()) * PERCENTAGE_FACTOR; - DecimalFormat df = new DecimalFormat("#.##"); - return Double.parseDouble(df.format(profitRate)); - } } From c331b18d5ce49bd6ec3dfb6a3e09ff2c8f6d037c Mon Sep 17 00:00:00 2001 From: junseoplee Date: Mon, 22 Jan 2024 03:40:53 +0900 Subject: [PATCH 26/31] =?UTF-8?q?fix:=20=ED=95=84=EC=9A=94=20=EC=97=86?= =?UTF-8?q?=EB=8A=94=20static=20=EC=82=AD=EC=A0=9C=EC=99=80=20=EC=95=88?= =?UTF-8?q?=EC=A0=95=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=9C=20final=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/lotto/domain/PurchaseAmount.java | 4 ++-- src/main/java/lotto/domain/UserInputNumbers.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/lotto/domain/PurchaseAmount.java b/src/main/java/lotto/domain/PurchaseAmount.java index 96b829fad88..12091100dba 100644 --- a/src/main/java/lotto/domain/PurchaseAmount.java +++ b/src/main/java/lotto/domain/PurchaseAmount.java @@ -12,7 +12,7 @@ public PurchaseAmount(String input) { this.amount = inputAmount; } - private static void validateIsNumeric(String inputAmount) { + private void validateIsNumeric(String inputAmount) { try { Integer.parseInt(inputAmount); } catch (NumberFormatException e) { @@ -20,7 +20,7 @@ private static void validateIsNumeric(String inputAmount) { } } - private static void validatePurchaseAmount(int inputAmount) { + private void validatePurchaseAmount(int inputAmount) { if (inputAmount % LOTTO_PRICE != 0) { throw new IllegalArgumentException("[ERROR] 1000 단위의 금액을 입력하세요."); } diff --git a/src/main/java/lotto/domain/UserInputNumbers.java b/src/main/java/lotto/domain/UserInputNumbers.java index 8fb5842765e..3eaeba3057b 100644 --- a/src/main/java/lotto/domain/UserInputNumbers.java +++ b/src/main/java/lotto/domain/UserInputNumbers.java @@ -10,8 +10,8 @@ public class UserInputNumbers { - private List receivedLottoNumbers; - private int bonusNumber; + private final List receivedLottoNumbers; + private final int bonusNumber; public UserInputNumbers(List receivedLottoNumbers, int bonusNumber) { validateLottoNumbers(receivedLottoNumbers); From ea0ea0071211658c3184116f51a0634a456c4247 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Mon, 22 Jan 2024 04:25:16 +0900 Subject: [PATCH 27/31] =?UTF-8?q?refactor:=20PurchaseAmount=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=99=80=20InputManager=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81=20-=20PurchaseAmount=EC=9D=98=20=EB=A1=9C?= =?UTF-8?q?=EC=BB=AC=20=EB=B3=80=EC=88=98=EB=A5=BC=20=EB=B6=88=EB=B3=80?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=84=A0=EC=96=B8=20=EB=B0=8F=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=EB=A1=9C=EC=A7=81=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?-=20=EC=88=AB=EC=9E=90=20=EA=B2=80=EC=A6=9D=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EB=A5=BC=20=EC=9E=85=EB=A0=A5=EB=B0=9B?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20-=20=EB=B3=80=EC=88=98=EB=AA=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20-=20=EB=B2=88=ED=98=B8=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A5=BC=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EB=B2=88=ED=98=B8=EB=A5=BC=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C,=20=EB=B3=B4?= =?UTF-8?q?=EB=84=88=EC=8A=A4=20=EB=B2=88=ED=98=B8=EB=A5=BC=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EB=B0=9B=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/domain/PurchaseAmount.java | 24 +++------- .../java/lotto/service/LottoGenerator.java | 2 +- .../service/LottoProfitRateCalculator.java | 2 +- src/main/java/lotto/util/InputManager.java | 44 ++++++++++++------- 4 files changed, 38 insertions(+), 34 deletions(-) diff --git a/src/main/java/lotto/domain/PurchaseAmount.java b/src/main/java/lotto/domain/PurchaseAmount.java index 12091100dba..c24827df37c 100644 --- a/src/main/java/lotto/domain/PurchaseAmount.java +++ b/src/main/java/lotto/domain/PurchaseAmount.java @@ -3,30 +3,20 @@ public class PurchaseAmount { public static final int LOTTO_PRICE = 1000; - private int amount; + private final int purchaseAmount; - public PurchaseAmount(String input) { - validateIsNumeric(input); - int inputAmount = Integer.parseInt(input); - validatePurchaseAmount(amount); - this.amount = inputAmount; - } - - private void validateIsNumeric(String inputAmount) { - try { - Integer.parseInt(inputAmount); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("[ERROR] 구입금액은 숫자여야합니다."); - } + public PurchaseAmount(int inputAmount) { + validatePurchaseAmount(inputAmount); + this.purchaseAmount = inputAmount; } private void validatePurchaseAmount(int inputAmount) { if (inputAmount % LOTTO_PRICE != 0) { - throw new IllegalArgumentException("[ERROR] 1000 단위의 금액을 입력하세요."); + throw new IllegalArgumentException("[ERROR] 1000 단위의 금액이어야 합니다."); } } - public int getAmount() { - return amount; + public int getPurchaseAmount() { + return purchaseAmount; } } diff --git a/src/main/java/lotto/service/LottoGenerator.java b/src/main/java/lotto/service/LottoGenerator.java index e532a1da483..4842ed4d8d6 100644 --- a/src/main/java/lotto/service/LottoGenerator.java +++ b/src/main/java/lotto/service/LottoGenerator.java @@ -14,7 +14,7 @@ public class LottoGenerator { public static List generateLottos(PurchaseAmount purchaseAmount) { - int numberOfLotto = purchaseAmount.getAmount() / LOTTO_PRICE; + int numberOfLotto = purchaseAmount.getPurchaseAmount() / LOTTO_PRICE; System.out.println("\n" + numberOfLotto + "개를 구매했습니다."); List generatedLottos = new ArrayList<>(); diff --git a/src/main/java/lotto/service/LottoProfitRateCalculator.java b/src/main/java/lotto/service/LottoProfitRateCalculator.java index 6eb5a3446fd..88b808c6054 100644 --- a/src/main/java/lotto/service/LottoProfitRateCalculator.java +++ b/src/main/java/lotto/service/LottoProfitRateCalculator.java @@ -15,7 +15,7 @@ public double calculateProfitRate(PurchaseAmount purchaseAmount, .mapToInt(entry -> entry.getKey().getPrizeAmount() * entry.getValue()) .sum(); - double profitRate = (totalPrize / purchaseAmount.getAmount()) * PERCENTAGE_FACTOR; + double profitRate = (totalPrize / purchaseAmount.getPurchaseAmount()) * PERCENTAGE_FACTOR; DecimalFormat df = new DecimalFormat("#.##"); return Double.parseDouble(df.format(profitRate)); } diff --git a/src/main/java/lotto/util/InputManager.java b/src/main/java/lotto/util/InputManager.java index 1c294c502d8..0eff34b54e9 100644 --- a/src/main/java/lotto/util/InputManager.java +++ b/src/main/java/lotto/util/InputManager.java @@ -12,34 +12,48 @@ public PurchaseAmount receivePurchaseAmount() { while (true) { try { System.out.println("구입금액을 입력해 주세요."); - String input = Console.readLine(); - return new PurchaseAmount(input); + int inputAmount = Integer.parseInt(Console.readLine().trim()); + return new PurchaseAmount(inputAmount); + } catch (NumberFormatException e) { + System.out.println("[ERROR] 숫자여야 합니다."); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } } - public UserInputNumbers receiveLottoNumber() { while (true) { - System.out.println("\n당첨 번호를 입력해 주세요."); - String inputNumbers = Console.readLine(); try { - String[] separatedNumbers = inputNumbers.split(","); - List receivedLottoNumbers = Arrays.stream(separatedNumbers) - .map(String::trim) - .map(Integer::parseInt) - .toList(); - System.out.println("\n보너스 번호를 입력해 주세요."); - int bonusNumber = Integer.parseInt(Console.readLine().trim()); - + List receivedLottoNumbers = receiveLottoNumbers(); + int bonusNumber = receiveBonusNumber(); return new UserInputNumbers(receivedLottoNumbers, bonusNumber); - } catch (NumberFormatException e) { - System.out.println("[ERROR] 보너스 번호는 1개여야 합니다."); // 하나가 아니라면 String으로 인식 } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } } } + + private List receiveLottoNumbers() { + try { + System.out.println("\n당첨 번호를 입력해 주세요."); + String inputNumbers = Console.readLine(); + String[] separatedNumbers = inputNumbers.split(","); + return Arrays.stream(separatedNumbers) + .map(String::trim) + .map(Integer::parseInt) + .toList(); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("[ERROR] 숫자여야 합니다."); + } + } + + private int receiveBonusNumber() { + try { + System.out.println("\n보너스 번호를 입력해 주세요."); + return Integer.parseInt(Console.readLine().trim()); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("[ERROR] 숫자여야 합니다."); + } + } } From 71be87d60cac33fd4dafe604dfd9512e396c78ed Mon Sep 17 00:00:00 2001 From: junseoplee Date: Mon, 22 Jan 2024 05:07:48 +0900 Subject: [PATCH 28/31] =?UTF-8?q?fix:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=AA=85=EC=9D=84=20=EB=AA=85=EC=82=AC=ED=98=95=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 4 ++-- src/main/java/lotto/{RunLotto.java => LottoManager.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/main/java/lotto/{RunLotto.java => LottoManager.java} (98%) diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 198bc6a79dc..bea36a2b8ae 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -3,7 +3,7 @@ public class Application { public static void main(String[] args) { - RunLotto runLotto = new RunLotto(); - runLotto.runLotto(); + LottoManager lottoManager = new LottoManager(); + lottoManager.runLotto(); } } diff --git a/src/main/java/lotto/RunLotto.java b/src/main/java/lotto/LottoManager.java similarity index 98% rename from src/main/java/lotto/RunLotto.java rename to src/main/java/lotto/LottoManager.java index eb1d47403be..1ede7fe36bc 100644 --- a/src/main/java/lotto/RunLotto.java +++ b/src/main/java/lotto/LottoManager.java @@ -12,7 +12,7 @@ import lotto.util.OutputManager; import lotto.domain.WinningCheck; -public class RunLotto { +public class LottoManager { private final InputManager inputManager = new InputManager(); private final LottoGenerator lottoGenerator = new LottoGenerator(); From 9aa81c9e863daa3c4b0dce6e107417b248bad1e0 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Mon, 22 Jan 2024 05:08:16 +0900 Subject: [PATCH 29/31] =?UTF-8?q?fix:=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81=EB=90=9C=20=ED=95=AD=EB=AA=A9=EB=93=A4=EC=9D=84=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 --- docs/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 64c97dd2481..d8e552eecdf 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ Application과 동일 선상에 RunLotto 클래스 생성 -RunLotto에 필요한 기능들을 패키지로 묶어보자 +LottoManager에 필요한 기능들을 패키지로 묶어보자 - 도메인 모델 패키지 (domain) - 사용자로부터 입력받은 구입금액을 저장하는 클래스 PurchaseAmount @@ -8,7 +8,8 @@ RunLotto에 필요한 기능들을 패키지로 묶어보자 - 사용자로부터 로또 번호 6개와 보너스 번호 1개를 입력받아 저장하는 클래스 UserInputNumbers - 상금과 당첨 수를 저장하는 열거형 enum WinningCheck - 비즈니스 로직을 수행하는 서비스 패키지 (service) - - 당첨 결과와 수익률을 계산하는 클래스 Calculator + - 당첨 결과를 계산하는 클래스 LottoResultCalculator + - 수익률을 계산하는 클래스 LottoProfitRateCalculator - 구입금액만큼 로또를 발행하는 클래스 LottoGenerator - 각종 메서드가 있는 패키지 (util) - 사용자로부터 값들을 입력받는 클래스 InputManager From 3ae6d9ed7c08f5fa8444b145d47fb36fd800773d Mon Sep 17 00:00:00 2001 From: junseoplee Date: Mon, 22 Jan 2024 05:41:49 +0900 Subject: [PATCH 30/31] =?UTF-8?q?refactor:=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=A9=94=EC=84=B8=EC=A7=80=EB=A5=BC=20enum=EC=97=90=EC=84=9C?= =?UTF-8?q?=20=EA=B4=80=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/Lotto.java | 7 ++++--- .../java/lotto/domain/PurchaseAmount.java | 4 +++- .../java/lotto/domain/UserInputNumbers.java | 11 +++++----- src/main/java/lotto/util/ErrorMessage.java | 20 +++++++++++++++++++ src/main/java/lotto/util/InputManager.java | 6 +++--- 5 files changed, 36 insertions(+), 12 deletions(-) create mode 100644 src/main/java/lotto/util/ErrorMessage.java diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 4a246c780ee..d321761b674 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -3,6 +3,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import lotto.util.ErrorMessage; public class Lotto { @@ -28,18 +29,18 @@ public boolean isBonusMatch(UserInputNumbers receivedLotto) { private void validateLottoNumbers(List lottoNumbers) { if (lottoNumbers.size() != SIZE_OF_LOTTO) { - throw new IllegalArgumentException("[ERROR] 로또 번호는 총 6개여야 합니다."); + throw new IllegalArgumentException(ErrorMessage.NOT_SIX_NUMBERS.getMessage()); } for (int number : lottoNumbers) { if (number < MIN_LOTTO_NUMBER || number > MAX_LOTTO_NUMBER) { - throw new IllegalArgumentException("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."); + throw new IllegalArgumentException(ErrorMessage.NOT_IN_RANGE.getMessage()); } } Set uniqueNumbers = new HashSet<>(lottoNumbers); if (uniqueNumbers.size() < lottoNumbers.size()) { - throw new IllegalArgumentException("[ERROR] 로또 번호는 중복이 없어야 합니다."); + throw new IllegalArgumentException(ErrorMessage.MUST_NOT_DUPLICATE.getMessage()); } } diff --git a/src/main/java/lotto/domain/PurchaseAmount.java b/src/main/java/lotto/domain/PurchaseAmount.java index c24827df37c..988d33cccd0 100644 --- a/src/main/java/lotto/domain/PurchaseAmount.java +++ b/src/main/java/lotto/domain/PurchaseAmount.java @@ -1,5 +1,7 @@ package lotto.domain; +import lotto.util.ErrorMessage; + public class PurchaseAmount { public static final int LOTTO_PRICE = 1000; @@ -12,7 +14,7 @@ public PurchaseAmount(int inputAmount) { private void validatePurchaseAmount(int inputAmount) { if (inputAmount % LOTTO_PRICE != 0) { - throw new IllegalArgumentException("[ERROR] 1000 단위의 금액이어야 합니다."); + throw new IllegalArgumentException(ErrorMessage.NOT_A_UNIT_OF_1000.getMessage()); } } diff --git a/src/main/java/lotto/domain/UserInputNumbers.java b/src/main/java/lotto/domain/UserInputNumbers.java index 3eaeba3057b..bb4f51c0901 100644 --- a/src/main/java/lotto/domain/UserInputNumbers.java +++ b/src/main/java/lotto/domain/UserInputNumbers.java @@ -7,6 +7,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import lotto.util.ErrorMessage; public class UserInputNumbers { @@ -22,28 +23,28 @@ public UserInputNumbers(List receivedLottoNumbers, int bonusNumber) { private void validateLottoNumbers(List receivedLottoNumbers) { if (receivedLottoNumbers.size() != SIZE_OF_LOTTO) { - throw new IllegalArgumentException("[ERROR] 로또 번호는 총 6개여야 합니다."); + throw new IllegalArgumentException(ErrorMessage.NOT_SIX_NUMBERS.getMessage()); } for (int number : receivedLottoNumbers) { if (number < MIN_LOTTO_NUMBER || number > MAX_LOTTO_NUMBER) { - throw new IllegalArgumentException("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."); + throw new IllegalArgumentException(ErrorMessage.NOT_IN_RANGE.getMessage()); } } Set uniqueNumbers = new HashSet<>(receivedLottoNumbers); if (uniqueNumbers.size() < receivedLottoNumbers.size()) { - throw new IllegalArgumentException("[ERROR] 로또 번호는 중복이 없어야 합니다."); + throw new IllegalArgumentException(ErrorMessage.MUST_NOT_DUPLICATE.getMessage()); } } private void validateBonusNumbers(int bonusNumber) { if (bonusNumber < MIN_LOTTO_NUMBER || bonusNumber > MAX_LOTTO_NUMBER) { - throw new IllegalArgumentException("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."); + throw new IllegalArgumentException(ErrorMessage.NOT_IN_RANGE.getMessage()); } if (new HashSet<>(receivedLottoNumbers).contains(bonusNumber)) { - throw new IllegalArgumentException("[ERROR] 로또 번호는 중복이 없어야 합니다."); + throw new IllegalArgumentException(ErrorMessage.MUST_NOT_DUPLICATE.getMessage()); } } diff --git a/src/main/java/lotto/util/ErrorMessage.java b/src/main/java/lotto/util/ErrorMessage.java new file mode 100644 index 00000000000..0e0feb48542 --- /dev/null +++ b/src/main/java/lotto/util/ErrorMessage.java @@ -0,0 +1,20 @@ +package lotto.util; + +public enum ErrorMessage { + NOT_A_NUMBER("[ERROR] 숫자여야 합니다."), + NOT_A_SINGLE_NUMBER("[ERROR] 보너스 번호는 하나의 숫자여야 합니다."), + NOT_A_UNIT_OF_1000("[ERROR] 1000 단위의 금액이어야 합니다."), + NOT_SIX_NUMBERS("[ERROR] 로또 번호는 총 6개여야 합니다."), + NOT_IN_RANGE("[ERROR] 로또 번호는 1부터 45 사이의 숫자여야 합니다."), + MUST_NOT_DUPLICATE("[ERROR] 로또 번호는 중복이 없어야 합니다."); + + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } +} diff --git a/src/main/java/lotto/util/InputManager.java b/src/main/java/lotto/util/InputManager.java index 0eff34b54e9..cad01f27734 100644 --- a/src/main/java/lotto/util/InputManager.java +++ b/src/main/java/lotto/util/InputManager.java @@ -15,7 +15,7 @@ public PurchaseAmount receivePurchaseAmount() { int inputAmount = Integer.parseInt(Console.readLine().trim()); return new PurchaseAmount(inputAmount); } catch (NumberFormatException e) { - System.out.println("[ERROR] 숫자여야 합니다."); + System.out.println(ErrorMessage.NOT_A_NUMBER.getMessage()); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } @@ -44,7 +44,7 @@ private List receiveLottoNumbers() { .map(Integer::parseInt) .toList(); } catch (NumberFormatException e) { - throw new IllegalArgumentException("[ERROR] 숫자여야 합니다."); + throw new IllegalArgumentException(ErrorMessage.NOT_A_NUMBER.getMessage()); } } @@ -53,7 +53,7 @@ private int receiveBonusNumber() { System.out.println("\n보너스 번호를 입력해 주세요."); return Integer.parseInt(Console.readLine().trim()); } catch (NumberFormatException e) { - throw new IllegalArgumentException("[ERROR] 숫자여야 합니다."); + throw new IllegalArgumentException(ErrorMessage.NOT_A_SINGLE_NUMBER.getMessage()); } } } From 63bf89dd06d63deadc611dfe61b2b3c4d24ed571 Mon Sep 17 00:00:00 2001 From: junseoplee Date: Wed, 24 Jan 2024 17:14:38 +0900 Subject: [PATCH 31/31] =?UTF-8?q?feat:=20=EB=8F=84=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/lotto/LottoTest.java | 29 --------- src/test/java/lotto/domain/LottoTest.java | 59 +++++++++++++++++++ .../java/lotto/domain/PurchaseAmountTest.java | 16 +++++ .../lotto/domain/UserInputNumbersTest.java | 33 +++++++++++ 4 files changed, 108 insertions(+), 29 deletions(-) delete mode 100644 src/test/java/lotto/LottoTest.java create mode 100644 src/test/java/lotto/domain/LottoTest.java create mode 100644 src/test/java/lotto/domain/PurchaseAmountTest.java create mode 100644 src/test/java/lotto/domain/UserInputNumbersTest.java diff --git a/src/test/java/lotto/LottoTest.java b/src/test/java/lotto/LottoTest.java deleted file mode 100644 index 058a943233d..00000000000 --- a/src/test/java/lotto/LottoTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package lotto; - -import lotto.numbers.Lotto; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -class LottoTest { - - @DisplayName("로또 번호의 개수가 6개가 넘어가면 예외가 발생한다.") - @Test - void createLottoByOverSize() { - assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 6, 7))) - .isInstanceOf(IllegalArgumentException.class); - } - - @DisplayName("로또 번호에 중복된 숫자가 있으면 예외가 발생한다.") - @Test - void createLottoByDuplicatedNumber() { - // TODO: 이 테스트가 통과할 수 있게 구현 코드 작성 - assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 5))) - .isInstanceOf(IllegalArgumentException.class); - } - - // 아래에 추가 테스트 작성 가능 -} \ No newline at end of file diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java new file mode 100644 index 00000000000..b8b1561811d --- /dev/null +++ b/src/test/java/lotto/domain/LottoTest.java @@ -0,0 +1,59 @@ +package lotto.domain; + +import java.util.Arrays; +import lotto.domain.Lotto; +import lotto.domain.UserInputNumbers; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class LottoTest { + + @DisplayName("로또 번호의 개수가 6개가 넘어가면 예외가 발생한다.") + @Test + void createLottoByOverSize() { + assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 6, 7))) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("로또 번호의 범위가 1~45가 아닌 경우 예외가 발생한다.") + @Test + void createLottoByInvalidNumber() { + assertThatThrownBy(() -> new Lotto(List.of(0, 2, 3, 4, 5, 6))) + .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 46))) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("로또 번호에 중복된 숫자가 있는 경우 예외가 발생한다.") + @Test + void createLottoByDuplicatedNumber() { + // TODO: 이 테스트가 통과할 수 있게 구현 코드 작성 + assertThatThrownBy(() -> new Lotto(List.of(1, 2, 3, 4, 5, 5))) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("getMatchCount()는 로또 번호와 일치하는 번호의 수를 반환한다.") + @Test + void testGetMatchCount() { + List lottoNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); + Lotto lotto = new Lotto(lottoNumbers); + UserInputNumbers userInputNumbers = new UserInputNumbers(lottoNumbers, 7); + int matchCount = lotto.getMatchCount(userInputNumbers); + assertThat(matchCount).isEqualTo(6); + } + + @DisplayName("isBonusMatch()는 로또 번호와 보너스 번호가 일치하면 true를 반환한다.") + @Test + void testIsBonusMatch() { + List lottoNumbers = Arrays.asList(1, 2, 3, 4, 5, 6); + Lotto lotto = new Lotto(lottoNumbers); + UserInputNumbers userInputNumbers = new UserInputNumbers(lottoNumbers, 7); + boolean isBonusMatch = lotto.isBonusMatch(userInputNumbers); + assertThat(isBonusMatch).isFalse(); // 보너스 번호는 7이므로 일치하지 않아야 함 + } +} diff --git a/src/test/java/lotto/domain/PurchaseAmountTest.java b/src/test/java/lotto/domain/PurchaseAmountTest.java new file mode 100644 index 00000000000..ba8c18775d9 --- /dev/null +++ b/src/test/java/lotto/domain/PurchaseAmountTest.java @@ -0,0 +1,16 @@ +package lotto.domain; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class PurchaseAmountTest { + + @DisplayName("구입금액이 1000 단위가 아니라면 예외가 발생한다.") + @Test + void createPurchaseAmountByInvalidAmount() { + assertThatThrownBy(() -> new PurchaseAmount(1500)) + .isInstanceOf(IllegalArgumentException.class); + } +} diff --git a/src/test/java/lotto/domain/UserInputNumbersTest.java b/src/test/java/lotto/domain/UserInputNumbersTest.java new file mode 100644 index 00000000000..2d7ca62aca3 --- /dev/null +++ b/src/test/java/lotto/domain/UserInputNumbersTest.java @@ -0,0 +1,33 @@ +package lotto.domain; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +import java.util.List; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class UserInputNumbersTest { + + @DisplayName("당첨 번호의 개수가 6개를 넘어가는 경우 예외가 발생한다.") + @Test + void createNumberByOverSize() { + assertThatThrownBy(() -> new UserInputNumbers(List.of(1, 2, 3, 4, 5, 6, 7), 8)) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("당첨 번호의 범위가 1~45가 아닌 경우 예외가 발생한다.") + @Test + void createNumberByInvalidNumber() { + assertThatThrownBy(() -> new UserInputNumbers(List.of(0, 2, 3, 4, 5, 6), 7)) + .isInstanceOf(IllegalArgumentException.class); + assertThatThrownBy(() -> new UserInputNumbers(List.of(1, 2, 3, 4, 5, 46), 7)) + .isInstanceOf(IllegalArgumentException.class); + } + + @DisplayName("당첨 번호에 중복된 숫자가 있는 경우 예외가 발생한다.") + @Test + void createNumberByDuplicatedNumber() { + assertThatThrownBy(() -> new UserInputNumbers(List.of(1, 2, 3, 4, 5, 5), 7)) + .isInstanceOf(IllegalArgumentException.class); + } +}