From 072cd19df27ee5bc6eae3d922648c6aa5ca59feb Mon Sep 17 00:00:00 2001 From: ho-jun97 Date: Tue, 2 Dec 2025 21:27:10 +0900 Subject: [PATCH 1/7] =?UTF-8?q?refactor:=20=ED=94=BC=EB=93=9C=EB=B0=B1=20?= =?UTF-8?q?=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/LottoNumber.java | 2 +- src/main/java/lotto/domain/LottoWinningNumbers.java | 4 ++++ src/test/java/lotto/domain/LottoResultTest.java | 4 ++-- src/test/java/lotto/domain/LottoTest.java | 10 +++++----- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/lotto/domain/LottoNumber.java b/src/main/java/lotto/domain/LottoNumber.java index a6fbe061e4..4ee5377659 100644 --- a/src/main/java/lotto/domain/LottoNumber.java +++ b/src/main/java/lotto/domain/LottoNumber.java @@ -24,7 +24,7 @@ public LottoNumber(int number) { public static LottoNumber valueOf(String number){ validation(Integer.parseInt(number)); - return CACHE_NUM.get(Integer.parseInt(number)); + return valueOf(Integer.parseInt(number)); } public static LottoNumber valueOf(int number){ diff --git a/src/main/java/lotto/domain/LottoWinningNumbers.java b/src/main/java/lotto/domain/LottoWinningNumbers.java index e83d31ad69..f5e52d2194 100644 --- a/src/main/java/lotto/domain/LottoWinningNumbers.java +++ b/src/main/java/lotto/domain/LottoWinningNumbers.java @@ -4,6 +4,10 @@ public class LottoWinningNumbers { private final Lotto winningLotto; private final LottoNumber bonusNumber; + public LottoWinningNumbers(Lotto winningLotto, int bonusNumber) { + this(winningLotto, new LottoNumber(bonusNumber)); + } + public LottoWinningNumbers(Lotto winningLotto, LottoNumber bonusNumber) { this.winningLotto = winningLotto; this.bonusNumber = bonusNumber; diff --git a/src/test/java/lotto/domain/LottoResultTest.java b/src/test/java/lotto/domain/LottoResultTest.java index 05aa76c0e2..ddeb062aaa 100644 --- a/src/test/java/lotto/domain/LottoResultTest.java +++ b/src/test/java/lotto/domain/LottoResultTest.java @@ -18,7 +18,7 @@ public class LottoResultTest { ) ); - LottoWinningNumbers lottoWinningNumbers = new LottoWinningNumbers(winLotto, LottoNumber.valueOf(10)); + LottoWinningNumbers lottoWinningNumbers = new LottoWinningNumbers(winLotto, 10); LottoResult lottoResult = lottoGroup.match(lottoWinningNumbers); Assertions.assertThat(lottoResult.calTotal()).isEqualTo(new Money(10000)); @@ -35,7 +35,7 @@ public class LottoResultTest { ) ); - LottoWinningNumbers lottoWinningNumbers = new LottoWinningNumbers(winLotto, LottoNumber.valueOf(10)); + LottoWinningNumbers lottoWinningNumbers = new LottoWinningNumbers(winLotto, 10); LottoResult lottoResult = lottoGroup.match(lottoWinningNumbers); diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java index a7337dd99e..490ea7e412 100644 --- a/src/test/java/lotto/domain/LottoTest.java +++ b/src/test/java/lotto/domain/LottoTest.java @@ -8,26 +8,26 @@ public class LottoTest { @Test void 로또_개수_구하기() { - Lotto lotto = new Lotto(1,2,3,4,5,6); + Lotto lotto = new Lotto(1, 2, 3, 4, 5, 6); assertThat(lotto.countMatchedNumbers( - new Lotto(1,2,3,11,22,33) + new Lotto(1, 2, 3, 11, 22, 33) )).isEqualTo(3); } @Test void 포함된_숫자인지() { - Lotto lotto = new Lotto(1,2,3,4,5,6); + Lotto lotto = new Lotto(1, 2, 3, 4, 5, 6); assertThat(lotto.contains(LottoNumber.valueOf(1))).isTrue(); } @Test void 로또_스트링으로_받기() { - Lotto lotto = new Lotto("1","2","3","4","5","6"); + Lotto lotto = new Lotto("1", "2", "3", "4", "5", "6"); assertThat(lotto.countMatchedNumbers( - new Lotto(1,2,3,11,22,33) + new Lotto(1, 2, 3, 11, 22, 33) )).isEqualTo(3); } } From ffb12e3daf7ad2d0fb334a3ad7d9d9b31b07710d Mon Sep 17 00:00:00 2001 From: ho-jun97 Date: Wed, 3 Dec 2025 22:52:09 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20=EC=88=98=EB=8F=99=EA=B3=BC=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=9D=98=20=EA=B0=9C=EC=88=98=EB=A5=BC=20?= =?UTF-8?q?=EA=B0=80=EC=A7=80=EB=8A=94=20=EA=B0=9D=EC=B2=B4=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/LottoCount.java | 27 +++++++++++++++++++ .../java/lotto/domain/LottoCountTest.java | 21 +++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/main/java/lotto/domain/LottoCount.java create mode 100644 src/test/java/lotto/domain/LottoCountTest.java diff --git a/src/main/java/lotto/domain/LottoCount.java b/src/main/java/lotto/domain/LottoCount.java new file mode 100644 index 0000000000..66da46c1a1 --- /dev/null +++ b/src/main/java/lotto/domain/LottoCount.java @@ -0,0 +1,27 @@ +package lotto.domain; + +public class LottoCount { + private final int manualCount; + private final int autoCount; + + public LottoCount(Money money, int manualCount) { + this(money.getBuyableCount() - manualCount, manualCount); + } + + public LottoCount(int manualCount) { + this( 0, manualCount); + } + + public LottoCount(int autoCount,int manualCount) { + this.autoCount = autoCount; + this.manualCount = manualCount; + } + + public int getManualCount() { + return this.manualCount; + } + + public int getAutoCount() { + return this.autoCount; + } +} diff --git a/src/test/java/lotto/domain/LottoCountTest.java b/src/test/java/lotto/domain/LottoCountTest.java new file mode 100644 index 0000000000..70d35d0fdf --- /dev/null +++ b/src/test/java/lotto/domain/LottoCountTest.java @@ -0,0 +1,21 @@ +package lotto.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class LottoCountTest { + + @Test + void create() { + LottoCount lottoCount = new LottoCount(3); + + Assertions.assertThat(lottoCount.getManualCount()).isEqualTo(3); + } + + @Test + void 수동_자동_카운트해서_생성() { + LottoCount lottoCount = new LottoCount(new Money(14000), 3); + + Assertions.assertThat(lottoCount.getAutoCount()).isEqualTo(11); + } +} From 9744613ac5929d61bebebec55bee2a5e26e7fa1a Mon Sep 17 00:00:00 2001 From: ho-jun97 Date: Wed, 3 Dec 2025 23:31:50 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EC=88=98?= =?UTF-8?q?=EB=8F=99,=EC=9E=90=EB=8F=99=20=EA=B0=9C=EC=88=98=EC=99=80=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=ED=95=98=EB=8A=94=20=EB=8F=88=EC=9D=84=20?= =?UTF-8?q?=EB=AC=B6=EB=8A=94=20=EA=B0=9D=EC=B2=B4=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/LottoMain.java | 14 ++++++++-- src/main/java/lotto/domain/LottoCount.java | 4 --- src/main/java/lotto/domain/LottoGroup.java | 16 +++++++++++ src/main/java/lotto/domain/LottoPurChase.java | 27 +++++++++++++++++++ src/main/java/lotto/view/InputView.java | 18 +++++++++++++ src/main/java/lotto/view/ResultView.java | 4 +-- .../java/lotto/domain/LottoCountTest.java | 9 +------ .../java/lotto/domain/LottoPurchaseTest.java | 13 +++++++++ 8 files changed, 89 insertions(+), 16 deletions(-) create mode 100644 src/main/java/lotto/domain/LottoPurChase.java create mode 100644 src/test/java/lotto/domain/LottoPurchaseTest.java diff --git a/src/main/java/lotto/LottoMain.java b/src/main/java/lotto/LottoMain.java index 3ed6d871ad..5ff3f79a12 100644 --- a/src/main/java/lotto/LottoMain.java +++ b/src/main/java/lotto/LottoMain.java @@ -4,13 +4,23 @@ import lotto.view.InputView; import lotto.view.ResultView; +import java.util.List; + public class LottoMain { public static void main(String[] args) { Money money = new Money(InputView.getInputMoney()); - LottoGroup lottoGroup = new LottoGroup(money); + int inputManualLottoCount = InputView.getInputManualLottoCount(); + + LottoCount lottoCount = new LottoCount(money, inputManualLottoCount); + + LottoPurChase lottoPurChase = new LottoPurChase(money, lottoCount); + + List manualLottos = InputView.getInputManualLottos(inputManualLottoCount); + + LottoGroup lottoGroup = new LottoGroup(lottoPurChase, manualLottos); - ResultView.showBuyLottos(lottoGroup); + ResultView.showBuyLottos(lottoGroup, lottoPurChase); Lotto winLotto = new Lotto(InputView.getInputWinNumber()); diff --git a/src/main/java/lotto/domain/LottoCount.java b/src/main/java/lotto/domain/LottoCount.java index 66da46c1a1..b15ad1f094 100644 --- a/src/main/java/lotto/domain/LottoCount.java +++ b/src/main/java/lotto/domain/LottoCount.java @@ -8,10 +8,6 @@ public LottoCount(Money money, int manualCount) { this(money.getBuyableCount() - manualCount, manualCount); } - public LottoCount(int manualCount) { - this( 0, manualCount); - } - public LottoCount(int autoCount,int manualCount) { this.autoCount = autoCount; this.manualCount = manualCount; diff --git a/src/main/java/lotto/domain/LottoGroup.java b/src/main/java/lotto/domain/LottoGroup.java index 12791db65f..9f5a5b058b 100644 --- a/src/main/java/lotto/domain/LottoGroup.java +++ b/src/main/java/lotto/domain/LottoGroup.java @@ -6,6 +6,10 @@ public class LottoGroup { private final List lottos; + public LottoGroup(LottoPurChase lottoPurchase, List manualLottos) { + this(buyLotto(lottoPurchase, manualLottos)); + } + public LottoGroup(Money money) { this(buyLotto(money)); } @@ -13,6 +17,18 @@ public LottoGroup(Money money) { public LottoGroup(List lottos) { this.lottos = lottos; } + + private static List buyLotto(LottoPurChase lottoPurchase, List manualLottos) { + List lottoArray = new ArrayList<>(manualLottos); + + for(int i = 0; i < lottoPurchase.getAutoCount(); i++) { + lottoArray.add(new Lotto(LottoMachine.createLottoNumbers())); + } + + return lottoArray; + } + + private static List buyLotto(Money money) { int cnt = money.getBuyableCount(); diff --git a/src/main/java/lotto/domain/LottoPurChase.java b/src/main/java/lotto/domain/LottoPurChase.java new file mode 100644 index 0000000000..3bded5082f --- /dev/null +++ b/src/main/java/lotto/domain/LottoPurChase.java @@ -0,0 +1,27 @@ +package lotto.domain; + +public class LottoPurChase { + private final Money money; + private final LottoCount lottoCount; + + + public LottoPurChase(int money, int autoCount, int manualCount) { + this(new Money(money), new LottoCount(autoCount, manualCount)); + } + public LottoPurChase(Money money, LottoCount lottoCount) { + this.money = money; + this.lottoCount = lottoCount; + } + + public Money getMoney() { + return this.money; + } + + public int getAutoCount() { + return this.lottoCount.getAutoCount(); + } + + public int getManualCount() { + return this.lottoCount.getManualCount(); + } +} diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 6f4ed7f831..26240435d5 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -2,6 +2,8 @@ import lotto.domain.Lotto; +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; public class InputView { @@ -12,6 +14,22 @@ public static int getInputMoney() { return Integer.parseInt(scanner.nextLine()); } + public static int getInputManualLottoCount() { + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + return Integer.parseInt(scanner.nextLine()); + } + + public static List getInputManualLottos(int manualLottoCount) { + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + + List manualLottos = new ArrayList<>(); + for (int i = 0; i < manualLottoCount; i++) { + manualLottos.add(new Lotto(parse(scanner.nextLine()))); + } + + return manualLottos; + } + public static String[] getInputWinNumber() { System.out.println("지난 주 당첨 번호를 입력해 주세요."); diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index 40914c8109..bd2b59b8df 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -4,8 +4,8 @@ public class ResultView { - public static void showBuyLottos(LottoGroup lottoGroup) { - System.out.printf("%d개를 구매했습니다.%n", lottoGroup.getLottoNumbers().size()); + public static void showBuyLottos(LottoGroup lottoGroup, LottoPurChase lottoPurchase) { + System.out.printf("수동으로 %d장, 자동으로 %d개를 구매했습니다.%n", lottoPurchase.getManualCount() ,lottoPurchase.getAutoCount()); for (Lotto lotto : lottoGroup.getLottoNumbers()) { System.out.println(lotto); diff --git a/src/test/java/lotto/domain/LottoCountTest.java b/src/test/java/lotto/domain/LottoCountTest.java index 70d35d0fdf..85eec900c7 100644 --- a/src/test/java/lotto/domain/LottoCountTest.java +++ b/src/test/java/lotto/domain/LottoCountTest.java @@ -5,16 +5,9 @@ public class LottoCountTest { - @Test - void create() { - LottoCount lottoCount = new LottoCount(3); - - Assertions.assertThat(lottoCount.getManualCount()).isEqualTo(3); - } - @Test void 수동_자동_카운트해서_생성() { - LottoCount lottoCount = new LottoCount(new Money(14000), 3); + LottoCount lottoCount = new LottoCount(11, 3); Assertions.assertThat(lottoCount.getAutoCount()).isEqualTo(11); } diff --git a/src/test/java/lotto/domain/LottoPurchaseTest.java b/src/test/java/lotto/domain/LottoPurchaseTest.java new file mode 100644 index 0000000000..a29ed700a0 --- /dev/null +++ b/src/test/java/lotto/domain/LottoPurchaseTest.java @@ -0,0 +1,13 @@ +package lotto.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +public class LottoPurchaseTest { + @Test + void create() { + LottoPurChase lottoPurChase = new LottoPurChase(14000, 11, 3); + + Assertions.assertThat(lottoPurChase.getMoney()).isEqualTo(new Money(14000)); + } +} From 490fe6592bcc049688545dc7e18b2af6b4673807 Mon Sep 17 00:00:00 2001 From: ho-jun97 Date: Wed, 3 Dec 2025 23:45:24 +0900 Subject: [PATCH 4/7] =?UTF-8?q?refactor:=20=EB=A1=9C=EB=98=90=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=8B=9C=20=EC=A4=91=EB=B3=B5,=206=EA=B0=9C=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=20=EC=B2=98=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 | 15 +++++++++++++++ src/test/java/lotto/domain/LottoTest.java | 15 +++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 104acb6dbc..ca70da2b04 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -1,6 +1,7 @@ package lotto.domain; import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Objects; @@ -16,8 +17,22 @@ public Lotto(String... numbers) { } public Lotto(List numbers) { + validation(numbers); this.numbers = numbers; } + private void validation(List numbers) { + if (isDuplication(numbers)) { + throw new IllegalArgumentException("로또 번호는 중복될 수 없습니다."); + } + + if (numbers.size() != 6) { + throw new IllegalArgumentException("로또 번호는 6개여야 합니다."); + } + } + + private boolean isDuplication(List numbers) { + return new HashSet<>(numbers).size() != numbers.size(); + } private static List stringToList(String... numbers) { return Arrays.stream(numbers) diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java index 490ea7e412..f25c9c7a96 100644 --- a/src/test/java/lotto/domain/LottoTest.java +++ b/src/test/java/lotto/domain/LottoTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; public class LottoTest { @@ -30,4 +31,18 @@ public class LottoTest { new Lotto(1, 2, 3, 11, 22, 33) )).isEqualTo(3); } + + @Test + void 로또_번호는_중복_될_수_없음() { + assertThatThrownBy(()-> new Lotto("1", "2", "3", "4", "5", "5")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("로또 번호는 중복될 수 없습니다."); + } + + @Test + void 로또_번호는_6개_이여야_함() { + assertThatThrownBy(()-> new Lotto("1", "2", "3", "4", "5")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("로또 번호는 6개여야 합니다."); + } } From dd72b07ac0eabd908bef7ca38fecfa918afe9bdd Mon Sep 17 00:00:00 2001 From: ho-jun97 Date: Thu, 4 Dec 2025 22:12:38 +0900 Subject: [PATCH 5/7] =?UTF-8?q?refactor:=20=EC=BB=A8=EB=B2=A4=EC=85=98=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=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/domain/Lotto.java | 1 + src/main/java/lotto/domain/LottoCount.java | 2 +- src/main/java/lotto/domain/LottoGroup.java | 6 +++--- src/main/java/lotto/domain/LottoMachine.java | 4 ++-- src/main/java/lotto/domain/LottoNumber.java | 8 ++++---- src/main/java/lotto/domain/LottoPurChase.java | 1 + src/main/java/lotto/domain/LottoResult.java | 5 +++-- src/main/java/lotto/view/ResultView.java | 2 +- 8 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index ca70da2b04..103e8d596d 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -20,6 +20,7 @@ public Lotto(List numbers) { validation(numbers); this.numbers = numbers; } + private void validation(List numbers) { if (isDuplication(numbers)) { throw new IllegalArgumentException("로또 번호는 중복될 수 없습니다."); diff --git a/src/main/java/lotto/domain/LottoCount.java b/src/main/java/lotto/domain/LottoCount.java index b15ad1f094..030d012fcc 100644 --- a/src/main/java/lotto/domain/LottoCount.java +++ b/src/main/java/lotto/domain/LottoCount.java @@ -8,7 +8,7 @@ public LottoCount(Money money, int manualCount) { this(money.getBuyableCount() - manualCount, manualCount); } - public LottoCount(int autoCount,int manualCount) { + public LottoCount(int autoCount, int manualCount) { this.autoCount = autoCount; this.manualCount = manualCount; } diff --git a/src/main/java/lotto/domain/LottoGroup.java b/src/main/java/lotto/domain/LottoGroup.java index 9f5a5b058b..8603e8e54a 100644 --- a/src/main/java/lotto/domain/LottoGroup.java +++ b/src/main/java/lotto/domain/LottoGroup.java @@ -18,10 +18,10 @@ public LottoGroup(List lottos) { this.lottos = lottos; } - private static List buyLotto(LottoPurChase lottoPurchase, List manualLottos) { + private static List buyLotto(LottoPurChase lottoPurchase, List manualLottos) { List lottoArray = new ArrayList<>(manualLottos); - for(int i = 0; i < lottoPurchase.getAutoCount(); i++) { + for (int i = 0; i < lottoPurchase.getAutoCount(); i++) { lottoArray.add(new Lotto(LottoMachine.createLottoNumbers())); } @@ -34,7 +34,7 @@ private static List buyLotto(Money money) { List lottoArray = new ArrayList<>(); - for(int i = 0; i < cnt; i++) { + for (int i = 0; i < cnt; i++) { lottoArray.add(new Lotto(LottoMachine.createLottoNumbers())); } diff --git a/src/main/java/lotto/domain/LottoMachine.java b/src/main/java/lotto/domain/LottoMachine.java index b54ef30e3f..47e331acec 100644 --- a/src/main/java/lotto/domain/LottoMachine.java +++ b/src/main/java/lotto/domain/LottoMachine.java @@ -11,7 +11,7 @@ public class LottoMachine { public static int[] createLottoNumbers() { List nums = new ArrayList<>(); - for(int i = MIN_NUMBER; i <= MAX_NUMBER; i++){ + for (int i = MIN_NUMBER; i <= MAX_NUMBER; i++) { nums.add(i); } @@ -22,7 +22,7 @@ public static int[] createLottoNumbers() { private static int[] selectLottoNumbers(List lottoNumbers) { int[] nums = new int[COUNT]; - for(int i = 0; i < COUNT; i++){ + for (int i = 0; i < COUNT; i++) { nums[i] = lottoNumbers.get(i); } return nums; diff --git a/src/main/java/lotto/domain/LottoNumber.java b/src/main/java/lotto/domain/LottoNumber.java index 4ee5377659..917d3af33e 100644 --- a/src/main/java/lotto/domain/LottoNumber.java +++ b/src/main/java/lotto/domain/LottoNumber.java @@ -9,8 +9,8 @@ public class LottoNumber { private static final int MAX = 45; private static final Map CACHE_NUM = new HashMap<>(); - static{ - for (int i = MIN; i <= MAX; i++){ + static { + for (int i = MIN; i <= MAX; i++) { CACHE_NUM.put(i, new LottoNumber(i)); } } @@ -22,12 +22,12 @@ public LottoNumber(int number) { this.number = number; } - public static LottoNumber valueOf(String number){ + public static LottoNumber valueOf(String number) { validation(Integer.parseInt(number)); return valueOf(Integer.parseInt(number)); } - public static LottoNumber valueOf(int number){ + public static LottoNumber valueOf(int number) { validation(number); return CACHE_NUM.get(number); } diff --git a/src/main/java/lotto/domain/LottoPurChase.java b/src/main/java/lotto/domain/LottoPurChase.java index 3bded5082f..5be369cb2d 100644 --- a/src/main/java/lotto/domain/LottoPurChase.java +++ b/src/main/java/lotto/domain/LottoPurChase.java @@ -8,6 +8,7 @@ public class LottoPurChase { public LottoPurChase(int money, int autoCount, int manualCount) { this(new Money(money), new LottoCount(autoCount, manualCount)); } + public LottoPurChase(Money money, LottoCount lottoCount) { this.money = money; this.lottoCount = lottoCount; diff --git a/src/main/java/lotto/domain/LottoResult.java b/src/main/java/lotto/domain/LottoResult.java index 827f80fa20..522de57a06 100644 --- a/src/main/java/lotto/domain/LottoResult.java +++ b/src/main/java/lotto/domain/LottoResult.java @@ -9,7 +9,8 @@ public class LottoResult { public LottoResult() { this(initResult()); } - public LottoResult(Map result) { + + public LottoResult(Map result) { this.result = result; } @@ -36,7 +37,7 @@ private static Map initResult() { } public void rank(LottoRank rank) { - if(rank.isAddAble()) { + if (rank.isAddAble()) { result.put(rank, result.get(rank) + 1); } } diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index bd2b59b8df..80bbc60212 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -5,7 +5,7 @@ public class ResultView { public static void showBuyLottos(LottoGroup lottoGroup, LottoPurChase lottoPurchase) { - System.out.printf("수동으로 %d장, 자동으로 %d개를 구매했습니다.%n", lottoPurchase.getManualCount() ,lottoPurchase.getAutoCount()); + System.out.printf("수동으로 %d장, 자동으로 %d개를 구매했습니다.%n", lottoPurchase.getManualCount(), lottoPurchase.getAutoCount()); for (Lotto lotto : lottoGroup.getLottoNumbers()) { System.out.println(lotto); From 3f9d019b80dfcd45089be435f99b02bf8660afd2 Mon Sep 17 00:00:00 2001 From: ho-jun97 Date: Fri, 5 Dec 2025 00:15:39 +0900 Subject: [PATCH 6/7] =?UTF-8?q?refactor:=20LottoGenerator=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4,=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=EB=A7=8C=20=EB=A1=9C=EB=98=90=20=EB=A7=8C?= =?UTF-8?q?=EB=93=9C=EB=8A=94=20=EA=B5=AC=ED=98=84=EC=B2=B4(AutoLottoGener?= =?UTF-8?q?ator),=20(=EC=9E=90=EB=8F=99,=EC=88=98=EB=8F=99)=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=A7=8C=EB=93=9C=EB=8A=94=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EC=B2=B4(MixedLottoGenerator)=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/LottoMain.java | 2 +- .../java/lotto/domain/AutoLottoGenerator.java | 29 +++++++++++++++++ src/main/java/lotto/domain/Lotto.java | 32 ++++++++----------- .../java/lotto/domain/LottoGenerator.java | 7 ++++ src/main/java/lotto/domain/LottoGroup.java | 31 ++---------------- .../lotto/domain/MixedLottoGenerator.java | 25 +++++++++++++++ .../java/lotto/domain/LottoGeneratorTest.java | 28 ++++++++++++++++ .../java/lotto/domain/LottoGroupTest.java | 2 +- src/test/java/lotto/domain/LottoTest.java | 11 ++----- 9 files changed, 108 insertions(+), 59 deletions(-) create mode 100644 src/main/java/lotto/domain/AutoLottoGenerator.java create mode 100644 src/main/java/lotto/domain/LottoGenerator.java create mode 100644 src/main/java/lotto/domain/MixedLottoGenerator.java create mode 100644 src/test/java/lotto/domain/LottoGeneratorTest.java diff --git a/src/main/java/lotto/LottoMain.java b/src/main/java/lotto/LottoMain.java index 5ff3f79a12..ff537b2763 100644 --- a/src/main/java/lotto/LottoMain.java +++ b/src/main/java/lotto/LottoMain.java @@ -18,7 +18,7 @@ public static void main(String[] args) { List manualLottos = InputView.getInputManualLottos(inputManualLottoCount); - LottoGroup lottoGroup = new LottoGroup(lottoPurChase, manualLottos); + LottoGroup lottoGroup = new LottoGroup(new MixedLottoGenerator(lottoPurChase, manualLottos)); ResultView.showBuyLottos(lottoGroup, lottoPurChase); diff --git a/src/main/java/lotto/domain/AutoLottoGenerator.java b/src/main/java/lotto/domain/AutoLottoGenerator.java new file mode 100644 index 0000000000..4299975cd0 --- /dev/null +++ b/src/main/java/lotto/domain/AutoLottoGenerator.java @@ -0,0 +1,29 @@ +package lotto.domain; + +import java.util.ArrayList; +import java.util.List; + +public class AutoLottoGenerator implements LottoGenerator { + private final Money money; + + public AutoLottoGenerator(int number) { + this(new Money(number)); + } + + public AutoLottoGenerator(Money money) { + this.money = money; + } + + @Override + public List generate() { + int cnt = money.getBuyableCount(); + + List lottoArray = new ArrayList<>(); + + for (int i = 0; i < cnt; i++) { + lottoArray.add(new Lotto(LottoMachine.createLottoNumbers())); + } + + return lottoArray; + } +} diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 103e8d596d..1aa24d9f67 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -1,12 +1,10 @@ package lotto.domain; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.stream.Collectors; public class Lotto { - private final List numbers; + private final Set numbers; public Lotto(int... numbers) { this(intToList(numbers)); @@ -16,35 +14,31 @@ public Lotto(String... numbers) { this(stringToList(numbers)); } - public Lotto(List numbers) { + public Lotto(String numbers) { + this(stringToList(numbers.split(","))); + } + + public Lotto(Set numbers) { validation(numbers); this.numbers = numbers; } - private void validation(List numbers) { - if (isDuplication(numbers)) { - throw new IllegalArgumentException("로또 번호는 중복될 수 없습니다."); - } - + private void validation(Set numbers) { if (numbers.size() != 6) { throw new IllegalArgumentException("로또 번호는 6개여야 합니다."); } } - private boolean isDuplication(List numbers) { - return new HashSet<>(numbers).size() != numbers.size(); - } - - private static List stringToList(String... numbers) { + private static Set stringToList(String... numbers) { return Arrays.stream(numbers) .map(LottoNumber::valueOf) - .toList(); + .collect(Collectors.toSet()); } - private static List intToList(int... numbers) { + private static Set intToList(int... numbers) { return Arrays.stream(numbers) .mapToObj(LottoNumber::valueOf) - .toList(); + .collect(Collectors.toSet()); } public int countMatchedNumbers(Lotto winningLotto) { diff --git a/src/main/java/lotto/domain/LottoGenerator.java b/src/main/java/lotto/domain/LottoGenerator.java new file mode 100644 index 0000000000..34a8e2fb07 --- /dev/null +++ b/src/main/java/lotto/domain/LottoGenerator.java @@ -0,0 +1,7 @@ +package lotto.domain; + +import java.util.List; + +public interface LottoGenerator { + List generate(); +} diff --git a/src/main/java/lotto/domain/LottoGroup.java b/src/main/java/lotto/domain/LottoGroup.java index 8603e8e54a..90432269db 100644 --- a/src/main/java/lotto/domain/LottoGroup.java +++ b/src/main/java/lotto/domain/LottoGroup.java @@ -6,41 +6,14 @@ public class LottoGroup { private final List lottos; - public LottoGroup(LottoPurChase lottoPurchase, List manualLottos) { - this(buyLotto(lottoPurchase, manualLottos)); - } - - public LottoGroup(Money money) { - this(buyLotto(money)); + public LottoGroup(LottoGenerator lottoGenerator) { + this(lottoGenerator.generate()); } public LottoGroup(List lottos) { this.lottos = lottos; } - private static List buyLotto(LottoPurChase lottoPurchase, List manualLottos) { - List lottoArray = new ArrayList<>(manualLottos); - - for (int i = 0; i < lottoPurchase.getAutoCount(); i++) { - lottoArray.add(new Lotto(LottoMachine.createLottoNumbers())); - } - - return lottoArray; - } - - - private static List buyLotto(Money money) { - int cnt = money.getBuyableCount(); - - List lottoArray = new ArrayList<>(); - - for (int i = 0; i < cnt; i++) { - lottoArray.add(new Lotto(LottoMachine.createLottoNumbers())); - } - - return lottoArray; - } - public List getLottoNumbers() { return lottos; } diff --git a/src/main/java/lotto/domain/MixedLottoGenerator.java b/src/main/java/lotto/domain/MixedLottoGenerator.java new file mode 100644 index 0000000000..7e9b939af7 --- /dev/null +++ b/src/main/java/lotto/domain/MixedLottoGenerator.java @@ -0,0 +1,25 @@ +package lotto.domain; + +import java.util.ArrayList; +import java.util.List; + +public class MixedLottoGenerator implements LottoGenerator { + private final LottoPurChase lottoPurchase; + private final List manualLottos; + + public MixedLottoGenerator(LottoPurChase lottoPurchase, List manualLottos) { + this.lottoPurchase = lottoPurchase; + this.manualLottos = manualLottos; + } + + @Override + public List generate() { + List lottoArray = new ArrayList<>(manualLottos); + + for (int i = 0; i < lottoPurchase.getAutoCount(); i++) { + lottoArray.add(new Lotto(LottoMachine.createLottoNumbers())); + } + + return lottoArray; + } +} diff --git a/src/test/java/lotto/domain/LottoGeneratorTest.java b/src/test/java/lotto/domain/LottoGeneratorTest.java new file mode 100644 index 0000000000..4a05e8a6a0 --- /dev/null +++ b/src/test/java/lotto/domain/LottoGeneratorTest.java @@ -0,0 +1,28 @@ +package lotto.domain; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.List; + +public class LottoGeneratorTest { + + @Test + @DisplayName("돈을 입력하여 자동으로 몇장 살 수 있는지") + void AutoGenerator() { + LottoGenerator autoLottoGenerator = new AutoLottoGenerator(14000); + + Assertions.assertThat(autoLottoGenerator.generate()).hasSize(14); + } + + @Test + @DisplayName("돈을 입력하여 자동과 수동으로 몇장 살 수 있는지") + void mixGenerator() { + LottoGenerator mixedLottoGenerator = new MixedLottoGenerator( + new LottoPurChase(3000, 2, 1), List.of(new Lotto(1,2,3,4,5,6)) + ); + + Assertions.assertThat(mixedLottoGenerator.generate()).hasSize(3); + } +} diff --git a/src/test/java/lotto/domain/LottoGroupTest.java b/src/test/java/lotto/domain/LottoGroupTest.java index fe36d35a41..4b56ddd2ec 100644 --- a/src/test/java/lotto/domain/LottoGroupTest.java +++ b/src/test/java/lotto/domain/LottoGroupTest.java @@ -7,7 +7,7 @@ public class LottoGroupTest { @Test void 로또_몇장_구매할_수_있는지() { - LottoGroup lottoGroup = new LottoGroup(new Money(14000)); + LottoGroup lottoGroup = new LottoGroup(new AutoLottoGenerator(new Money(14000))); assertThat(lottoGroup.getLottoNumbers()).hasSize(14); } diff --git a/src/test/java/lotto/domain/LottoTest.java b/src/test/java/lotto/domain/LottoTest.java index f25c9c7a96..ecc9430e3c 100644 --- a/src/test/java/lotto/domain/LottoTest.java +++ b/src/test/java/lotto/domain/LottoTest.java @@ -25,23 +25,16 @@ public class LottoTest { @Test void 로또_스트링으로_받기() { - Lotto lotto = new Lotto("1", "2", "3", "4", "5", "6"); + Lotto lotto = new Lotto("1,2,3,4,5,6"); assertThat(lotto.countMatchedNumbers( new Lotto(1, 2, 3, 11, 22, 33) )).isEqualTo(3); } - @Test - void 로또_번호는_중복_될_수_없음() { - assertThatThrownBy(()-> new Lotto("1", "2", "3", "4", "5", "5")) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("로또 번호는 중복될 수 없습니다."); - } - @Test void 로또_번호는_6개_이여야_함() { - assertThatThrownBy(()-> new Lotto("1", "2", "3", "4", "5")) + assertThatThrownBy(()-> new Lotto("1,2,3,4,5")) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("로또 번호는 6개여야 합니다."); } From f8de414b7be863a82a71eb10fd1911e7d8d52ca7 Mon Sep 17 00:00:00 2001 From: ho-jun97 Date: Sat, 6 Dec 2025 15:09:43 +0900 Subject: [PATCH 7/7] =?UTF-8?q?refactor:=20LottoGenerator=20=EC=9D=B8?= =?UTF-8?q?=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4,=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=EB=A7=8C=20=EB=A1=9C=EB=98=90=20=EB=A7=8C?= =?UTF-8?q?=EB=93=9C=EB=8A=94=20=EA=B5=AC=ED=98=84=EC=B2=B4(AutoLottoGener?= =?UTF-8?q?ator),=20(=EC=9E=90=EB=8F=99,=EC=88=98=EB=8F=99)=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=A7=8C=EB=93=9C=EB=8A=94=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EC=B2=B4(MixedLottoGenerator)=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/LottoMain.java | 4 +-- .../java/lotto/domain/AutoLottoGenerator.java | 8 +++--- src/main/java/lotto/domain/Lotto.java | 13 +++++++++- src/main/java/lotto/domain/LottoPurChase.java | 3 +++ .../lotto/domain/LottosBundleGenerator.java | 26 +++++++++++++++++++ .../lotto/domain/ManualLottosGenerator.java | 19 ++++++++++++++ .../lotto/domain/MixedLottoGenerator.java | 25 ------------------ src/main/java/lotto/domain/Money.java | 4 +++ src/main/java/lotto/view/InputView.java | 6 ++--- .../java/lotto/domain/LottoGeneratorTest.java | 4 +-- 10 files changed, 74 insertions(+), 38 deletions(-) create mode 100644 src/main/java/lotto/domain/LottosBundleGenerator.java create mode 100644 src/main/java/lotto/domain/ManualLottosGenerator.java delete mode 100644 src/main/java/lotto/domain/MixedLottoGenerator.java diff --git a/src/main/java/lotto/LottoMain.java b/src/main/java/lotto/LottoMain.java index ff537b2763..03f0a81567 100644 --- a/src/main/java/lotto/LottoMain.java +++ b/src/main/java/lotto/LottoMain.java @@ -16,9 +16,9 @@ public static void main(String[] args) { LottoPurChase lottoPurChase = new LottoPurChase(money, lottoCount); - List manualLottos = InputView.getInputManualLottos(inputManualLottoCount); + List manualLottos = InputView.getInputManualLottos(inputManualLottoCount); - LottoGroup lottoGroup = new LottoGroup(new MixedLottoGenerator(lottoPurChase, manualLottos)); + LottoGroup lottoGroup = new LottoGroup(new LottosBundleGenerator(lottoPurChase, manualLottos)); ResultView.showBuyLottos(lottoGroup, lottoPurChase); diff --git a/src/main/java/lotto/domain/AutoLottoGenerator.java b/src/main/java/lotto/domain/AutoLottoGenerator.java index 4299975cd0..cafd7dbb2c 100644 --- a/src/main/java/lotto/domain/AutoLottoGenerator.java +++ b/src/main/java/lotto/domain/AutoLottoGenerator.java @@ -6,8 +6,8 @@ public class AutoLottoGenerator implements LottoGenerator { private final Money money; - public AutoLottoGenerator(int number) { - this(new Money(number)); + public AutoLottoGenerator(int money) { + this(new Money(money)); } public AutoLottoGenerator(Money money) { @@ -16,11 +16,9 @@ public AutoLottoGenerator(Money money) { @Override public List generate() { - int cnt = money.getBuyableCount(); - List lottoArray = new ArrayList<>(); - for (int i = 0; i < cnt; i++) { + for (int i = 0; i < money.getBuyableCount(); i++) { lottoArray.add(new Lotto(LottoMachine.createLottoNumbers())); } diff --git a/src/main/java/lotto/domain/Lotto.java b/src/main/java/lotto/domain/Lotto.java index 1aa24d9f67..a382aca165 100644 --- a/src/main/java/lotto/domain/Lotto.java +++ b/src/main/java/lotto/domain/Lotto.java @@ -15,10 +15,21 @@ public Lotto(String... numbers) { } public Lotto(String numbers) { - this(stringToList(numbers.split(","))); + this(stringToList(parse(numbers))); + } + + private static String[] parse(String s) { + String[] strs = s.split(","); + + for (int i = 0; i < strs.length; i++) { + strs[i] = strs[i].trim(); + } + + return strs; } public Lotto(Set numbers) { + System.out.println(numbers); validation(numbers); this.numbers = numbers; } diff --git a/src/main/java/lotto/domain/LottoPurChase.java b/src/main/java/lotto/domain/LottoPurChase.java index 5be369cb2d..32c649bb56 100644 --- a/src/main/java/lotto/domain/LottoPurChase.java +++ b/src/main/java/lotto/domain/LottoPurChase.java @@ -13,6 +13,9 @@ public LottoPurChase(Money money, LottoCount lottoCount) { this.money = money; this.lottoCount = lottoCount; } + public Money deductManualLottoCost() { + return this.money.deductManualLottoCost(lottoCount.getManualCount()); + } public Money getMoney() { return this.money; diff --git a/src/main/java/lotto/domain/LottosBundleGenerator.java b/src/main/java/lotto/domain/LottosBundleGenerator.java new file mode 100644 index 0000000000..fc8ee1bf80 --- /dev/null +++ b/src/main/java/lotto/domain/LottosBundleGenerator.java @@ -0,0 +1,26 @@ +package lotto.domain; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class LottosBundleGenerator implements LottoGenerator{ + private final LottoPurChase lottoPurChase; + private final List manualLottoText; + + public LottosBundleGenerator(LottoPurChase lottoPurChase, List manualLottoText) { + this.lottoPurChase = lottoPurChase; + this.manualLottoText = manualLottoText; + } + + @Override + public List generate() { + // ManualLottosGenerator 활용해 수동 로또 생성 + List manualLottos = new ManualLottosGenerator(manualLottoText).generate(); + + // AutoLottosGenerator 활용해 자동 로또 생성(수동 로또 수 만큼 Money 차감) + List autoLottos = new AutoLottoGenerator(lottoPurChase.deductManualLottoCost()).generate(); + + return Stream.concat(manualLottos.stream(), autoLottos.stream()).collect(Collectors.toList()); + } +} diff --git a/src/main/java/lotto/domain/ManualLottosGenerator.java b/src/main/java/lotto/domain/ManualLottosGenerator.java new file mode 100644 index 0000000000..086946823d --- /dev/null +++ b/src/main/java/lotto/domain/ManualLottosGenerator.java @@ -0,0 +1,19 @@ +package lotto.domain; + +import java.util.List; +import java.util.stream.Collectors; + +public class ManualLottosGenerator implements LottoGenerator { + private final List manualLottos; + + public ManualLottosGenerator(List manualLottos) { + this.manualLottos = manualLottos; + } + + @Override + public List generate() { + return manualLottos.stream() + .map(Lotto::new) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/lotto/domain/MixedLottoGenerator.java b/src/main/java/lotto/domain/MixedLottoGenerator.java deleted file mode 100644 index 7e9b939af7..0000000000 --- a/src/main/java/lotto/domain/MixedLottoGenerator.java +++ /dev/null @@ -1,25 +0,0 @@ -package lotto.domain; - -import java.util.ArrayList; -import java.util.List; - -public class MixedLottoGenerator implements LottoGenerator { - private final LottoPurChase lottoPurchase; - private final List manualLottos; - - public MixedLottoGenerator(LottoPurChase lottoPurchase, List manualLottos) { - this.lottoPurchase = lottoPurchase; - this.manualLottos = manualLottos; - } - - @Override - public List generate() { - List lottoArray = new ArrayList<>(manualLottos); - - for (int i = 0; i < lottoPurchase.getAutoCount(); i++) { - lottoArray.add(new Lotto(LottoMachine.createLottoNumbers())); - } - - return lottoArray; - } -} diff --git a/src/main/java/lotto/domain/Money.java b/src/main/java/lotto/domain/Money.java index f16a0fbc84..003e965534 100644 --- a/src/main/java/lotto/domain/Money.java +++ b/src/main/java/lotto/domain/Money.java @@ -29,6 +29,10 @@ public double getYield(Money total) { return total.value() / (double) this.money; } + public Money deductManualLottoCost(int manualCount) { + return new Money(this.money - (manualCount * PRICE)); + } + @Override public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 26240435d5..81733798a8 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -19,12 +19,12 @@ public static int getInputManualLottoCount() { return Integer.parseInt(scanner.nextLine()); } - public static List getInputManualLottos(int manualLottoCount) { + public static List getInputManualLottos(int manualLottoCount) { System.out.println("수동으로 구매할 번호를 입력해 주세요."); - List manualLottos = new ArrayList<>(); + List manualLottos = new ArrayList<>(); for (int i = 0; i < manualLottoCount; i++) { - manualLottos.add(new Lotto(parse(scanner.nextLine()))); + manualLottos.add(scanner.nextLine()); } return manualLottos; diff --git a/src/test/java/lotto/domain/LottoGeneratorTest.java b/src/test/java/lotto/domain/LottoGeneratorTest.java index 4a05e8a6a0..b0d8b73c3b 100644 --- a/src/test/java/lotto/domain/LottoGeneratorTest.java +++ b/src/test/java/lotto/domain/LottoGeneratorTest.java @@ -19,8 +19,8 @@ void AutoGenerator() { @Test @DisplayName("돈을 입력하여 자동과 수동으로 몇장 살 수 있는지") void mixGenerator() { - LottoGenerator mixedLottoGenerator = new MixedLottoGenerator( - new LottoPurChase(3000, 2, 1), List.of(new Lotto(1,2,3,4,5,6)) + LottoGenerator mixedLottoGenerator = new LottosBundleGenerator( + new LottoPurChase(3000, 2, 1), List.of("1, 2, 3, 4, 5, 6") ); Assertions.assertThat(mixedLottoGenerator.generate()).hasSize(3);