From d6529c25d001dfe438dd948e3683257738fa492b Mon Sep 17 00:00:00 2001 From: SangHoon Date: Thu, 27 Jun 2024 10:40:44 +0900 Subject: [PATCH 01/23] =?UTF-8?q?chore:=20=EC=88=98=EB=8F=99=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EB=B2=88=ED=98=B8=20=EA=B5=AC=EB=A7=A4=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/LottoApplication.java | 20 +++++++- src/main/java/lotto/domain/LottoConsumer.java | 46 ++++++++++++++++--- src/main/java/lotto/service/LottoService.java | 27 +++++++++++ src/main/java/lotto/view/InputView.java | 44 ++++++++++++++++++ src/main/java/lotto/view/OutputView.java | 11 ++--- 5 files changed, 134 insertions(+), 14 deletions(-) diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index fc78e6043c2..d5de1d7834b 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -26,12 +26,28 @@ public LottoApplication(InputView inputView, OutputView outputView, LottoService public void run() { LottoConsumer consumer = new LottoConsumer(); - // 로또 구매 금액 입력 및 구매 + // 로또 구매 금액 입력 int money = inputView.insertMoney(); + + // 수동 구매 로또 수 입력 + int manuallyPurchasedLottoTicketCount = inputView.inputManuallyPurchasedLottoTicketCount(); + + if (manuallyPurchasedLottoTicketCount > 0) { + // 수동 로또 번호 입력 + List manuallyPurchasedLottoNumbers = inputView.inputManuallyPurchasedLottoTicketNumbers(manuallyPurchasedLottoTicketCount); + + // 수동 로또 번호를 로또 티켓으로 변환 + List manualLottoTickets = lottoService.manualNumbersToTickets(manuallyPurchasedLottoNumbers); + + // 수동 로또 티켓 구매 + lottoService.buyManualLotto(consumer, manualLottoTickets); + } + + // 자동 티켓 구매 lottoService.buyLotto(consumer, money); // 로또 구매 정보 출력 - outputView.printLottoTicketsInformation(consumer.getLottoTickets()); + outputView.printLottoTicketsInformation(consumer); // 지난 주 당첨번호 입력 String[] LastWeekWinningNumbers = inputView.inputLastWeekWinningLottoNumbers(); diff --git a/src/main/java/lotto/domain/LottoConsumer.java b/src/main/java/lotto/domain/LottoConsumer.java index a3b6f87fb8b..105f7898479 100644 --- a/src/main/java/lotto/domain/LottoConsumer.java +++ b/src/main/java/lotto/domain/LottoConsumer.java @@ -6,29 +6,63 @@ import static lotto.domain.LottoTicket.LOTTO_PRICE; public class LottoConsumer { - /** 구매한 로또 티켓 목록 */ - private final List lottoTickets = new ArrayList<>(); + /** 자동 구매한 로또 티켓 목록 */ + private final List autoLottoTickets = new ArrayList<>(); + + /** 수동 구매한 로또 티켓 목록 */ + private final List manualLottoTickets = new ArrayList<>(); /** - * 로또 번호 생성하고 반환 합니다. + * 자동 로또 티켓을 구매합니다. * * @param money 구매할 금액 * */ public void buyLotto(int money) { int purchasedCount = money / LOTTO_PRICE; + int autoPurchasedCount = purchasedCount - manualLottoTickets.size(); - for (int i = 0; i < purchasedCount; i++) { + for (int i = 0; i < autoPurchasedCount; i++) { LottoGenerator generator = new LottoGenerator(); - lottoTickets.add(new LottoTicket(generator.generate())); + autoLottoTickets.add(new LottoTicket(generator.generate())); } } + /** + * 수동 로또 티켓을 구매합니다. + * + * @param lottoTickets 수동 로또 티켓 목록 + * */ + public void buyManualLotto(List lottoTickets) { + manualLottoTickets.addAll(lottoTickets); + } + + /** + * 자동 로또 티켓 수 반환 합니다. + * + * @return int + * */ + public int getAutoLottoTicketsCount() { + return autoLottoTickets.size(); + } + + /** + * 수동 로또 티켓 수 반환 합니다. + * + * @return int + * */ + public int getManualLottoTicketsCount() { + return manualLottoTickets.size(); + } + /** * 구매한 로또 티켓 목록을 반환 합니다. * * @return List * */ public List getLottoTickets() { - return lottoTickets; + List allLottoTickets = new ArrayList<>(manualLottoTickets); + allLottoTickets.addAll(autoLottoTickets); + + return allLottoTickets; } } diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index 3a1e5a83041..2cbf6e9357e 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -31,6 +31,17 @@ public void buyLotto(LottoConsumer consumer, int money) { consumer.buyLotto(money); } + /** + * 수동 로또 티켓을 구매합니다. + * + * @param consumer LottoConsumer + * @param manualLottoTickets 수동 로또 티켓 목록 + * */ + public void buyManualLotto(LottoConsumer consumer, List manualLottoTickets) { + consumer.buyManualLotto(manualLottoTickets); + } + + /** * 지난 주 당첨 로또를 가공하여 LottoTicket 으로 만듭니다. * @@ -48,6 +59,22 @@ public LottoTicket winningNumberToTicket(String[] numbers) { return new LottoTicket(lottoNumbers); } + /** + * 수동 로또 번호를 가공하여 List 으로 만듭니다. + * + * @param numbers 수동 로또 번호 목록 + * @return List + * */ + public List manualNumbersToTickets(List numbers) { + List manualLottoTickets = new ArrayList<>(); + + for (String[] number : numbers) { + manualLottoTickets.add(this.winningNumberToTicket(number)); + } + + return manualLottoTickets; + } + /** * 로또를 계산하여 일치하는 개수의 목록을 반환합니다. * diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 2a1e3f34546..b36d7e522e7 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -1,6 +1,8 @@ package lotto.view; +import java.util.ArrayList; import java.util.InputMismatchException; +import java.util.List; import java.util.Scanner; import static lotto.domain.LottoTicket.LOTTO_PRICE; @@ -57,4 +59,46 @@ public int inputBonusNumber() { return scanner.nextInt(); } + + /** + * 수동으로 구매할 로또 수를 입력 받아 반환 합니다. + * + * @return int + * */ + public int inputManuallyPurchasedLottoTicketCount() { + int scanValue; + + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + + try { + Scanner scanner = new Scanner(System.in); + scanValue = scanner.nextInt(); + } catch (InputMismatchException e) { + throw new IllegalArgumentException("숫자만 입력할 수 있습니다."); + } + + return scanValue; + } + + /** + * 수동으로 구매할 로또 번호를 입력 받아 반환 합니다. + * + * @param purchasedCount 수동 로또 구매 수 + * @return List + * */ + public List inputManuallyPurchasedLottoTicketNumbers(int purchasedCount) { + List numbers = new ArrayList<>(); + + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + Scanner scanner = new Scanner(System.in); + + for (int i=0 ; i < purchasedCount ; i++) { + String scanValue = scanner.nextLine(); + numbers.add(scanValue + .replace(" ", "") + .split(",")); + } + + return numbers; + } } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index c0cf084bbed..552fe5215cb 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -1,20 +1,19 @@ package lotto.view; +import lotto.domain.LottoConsumer; import lotto.domain.LottoPrize; import lotto.domain.LottoTicket; -import java.util.List; - public class OutputView { /** * 로또 구매 개수와 로또 번호를 출력합니다. * - * @param lottoTickets 로또 티켓 목록 + * @param consumer 로또 구매자 * */ - public void printLottoTicketsInformation(List lottoTickets) { - System.out.println(lottoTickets.size() + "개를 구매했습니다."); + public void printLottoTicketsInformation(LottoConsumer consumer) { + System.out.println("수동으로 " + consumer.getManualLottoTicketsCount() + "개, 자동으로 " + consumer.getAutoLottoTicketsCount() + "를 구매했습니다."); - for (LottoTicket lottoTicket : lottoTickets) { + for (LottoTicket lottoTicket : consumer.getLottoTickets()) { System.out.println(lottoTicket.get()); } } From 02dde32e636b7a36496c97b47e500aa4432def15 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Thu, 27 Jun 2024 10:47:54 +0900 Subject: [PATCH 02/23] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/domain/LottoConsumerTest.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/test/java/lotto/domain/LottoConsumerTest.java b/src/test/java/lotto/domain/LottoConsumerTest.java index 69edd76e832..8f04e48b837 100644 --- a/src/test/java/lotto/domain/LottoConsumerTest.java +++ b/src/test/java/lotto/domain/LottoConsumerTest.java @@ -3,6 +3,8 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @@ -22,4 +24,37 @@ class LottoConsumerTest { // then assertThat(LottoTickets).hasSize(2); } + + @Test + @DisplayName("수동_로또_티켓을_구매_합니다") + void 수동_로또_티켓을_구매_합니다() { + // given + LottoTicket lottoTicket_1 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + LottoTicket lottoTicket_2 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + + List LottoTickets = new ArrayList<>(); + LottoTickets.add(lottoTicket_1); + LottoTickets.add(lottoTicket_2); + + // when + LottoConsumer consumer = new LottoConsumer(); + consumer.buyManualLotto(LottoTickets); + + // then + assertThat(consumer.getManualLottoTicketsCount()).isEqualTo(2); + } + + @Test + @DisplayName("자동_로또_티켓_수를_반환_합니다") + void 자동_로또_티켓_수를_반환_합니다() { + // given + int money = 3000; + + // when + LottoConsumer consumer = new LottoConsumer(); + consumer.buyLotto(money); + + // then + assertThat(consumer.getAutoLottoTicketsCount()).isEqualTo(3); + } } From e25d0e0be90fcc789cd0ca00b52cdc470686a8be Mon Sep 17 00:00:00 2001 From: SangHoon Date: Thu, 27 Jun 2024 10:48:34 +0900 Subject: [PATCH 03/23] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=98=A4=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/test/java/lotto/domain/LottoConsumerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/lotto/domain/LottoConsumerTest.java b/src/test/java/lotto/domain/LottoConsumerTest.java index 8f04e48b837..9b0250cfe01 100644 --- a/src/test/java/lotto/domain/LottoConsumerTest.java +++ b/src/test/java/lotto/domain/LottoConsumerTest.java @@ -14,11 +14,11 @@ class LottoConsumerTest { @DisplayName("전달받은_금액으로_살_수_있는_로또의_개수를_반환합니다") void 전달받은_금액으로_살_수_있는_로또의_개수를_반환합니다() { // given - int moeny = 2000; + int money = 2000; // when LottoConsumer consumer = new LottoConsumer(); - consumer.buyLotto(moeny); + consumer.buyLotto(money); List LottoTickets = consumer.getLottoTickets(); // then From 9dc4cce094978255f3599e8538518a857a73556e Mon Sep 17 00:00:00 2001 From: SangHoon Date: Fri, 28 Jun 2024 15:04:47 +0900 Subject: [PATCH 04/23] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=BB=A8=EB=B2=A4=EC=85=98=EC=97=90=20=EB=A7=9E=EC=B6=94?= =?UTF-8?q?=EC=96=B4=20format=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/LottoApplication.java | 4 +- .../lotto/domain/LastWeekLottoValidator.java | 40 ++++++++++-------- .../java/lotto/domain/LottoCalculator.java | 17 ++++---- src/main/java/lotto/domain/LottoConsumer.java | 17 ++++---- .../java/lotto/domain/LottoGenerator.java | 3 +- src/main/java/lotto/domain/LottoPrize.java | 19 +++++---- src/main/java/lotto/domain/LottoTicket.java | 10 +++-- .../factory/LottoApplicationFactory.java | 1 + src/main/java/lotto/service/LottoService.java | 41 +++++++++++-------- src/main/java/lotto/view/InputView.java | 26 ++++++------ src/main/java/lotto/view/OutputView.java | 11 ++--- .../domain/LastWeekLottoValidatorTest.java | 20 ++++----- .../lotto/domain/LottoCalculatorTest.java | 8 ++-- .../java/lotto/domain/LottoConsumerTest.java | 14 +++---- .../java/lotto/domain/LottoGeneratorTest.java | 11 +++-- .../java/lotto/domain/LottoTicketTest.java | 12 +++--- 16 files changed, 137 insertions(+), 117 deletions(-) diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index d5de1d7834b..4d0d5f40e54 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -1,5 +1,6 @@ package lotto; +import java.util.List; import lotto.domain.LottoConsumer; import lotto.domain.LottoPrize; import lotto.domain.LottoTicket; @@ -8,9 +9,8 @@ import lotto.view.InputView; import lotto.view.OutputView; -import java.util.List; - public class LottoApplication { + private final InputView inputView; private final OutputView outputView; diff --git a/src/main/java/lotto/domain/LastWeekLottoValidator.java b/src/main/java/lotto/domain/LastWeekLottoValidator.java index d121a99573b..d13dd14f4e4 100644 --- a/src/main/java/lotto/domain/LastWeekLottoValidator.java +++ b/src/main/java/lotto/domain/LastWeekLottoValidator.java @@ -1,16 +1,17 @@ package lotto.domain; +import static lotto.domain.LottoGenerator.MAX_LOTTO_NUMBER; +import static lotto.domain.LottoGenerator.MIN_LOTTO_NUMBER; + import java.util.ArrayList; import java.util.HashSet; import java.util.List; -import static lotto.domain.LottoGenerator.MAX_LOTTO_NUMBER; -import static lotto.domain.LottoGenerator.MIN_LOTTO_NUMBER; - /** * 지난 주 로또 번호의 유효성을 체크하는 클래스입니다. - * */ + */ public class LastWeekLottoValidator { + /** 로또 티켓의 숫자 개수 */ public static final int LOTTO_NUMBER_SIZE = 6; @@ -25,10 +26,11 @@ public class LastWeekLottoValidator { *

3. 중복된 수가 없는지

* * @param numbers 지난 주 당첨 번호 - * @exception IllegalArgumentException 당첨번호는 콤마로 구분된 숫자 6개이어야 합니다. - * @exception IllegalArgumentException 각 당첨번호는 1과 45 사이의 정수이어야 합니다. - * @exception IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. - * */ + * + * @throws IllegalArgumentException 당첨번호는 콤마로 구분된 숫자 6개이어야 합니다. + * @throws IllegalArgumentException 각 당첨번호는 1과 45 사이의 정수이어야 합니다. + * @throws IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. + */ public void winningNumbersValidation(List numbers) { // 숫자 개수 검사 this.checkCorrectLottoFormat(numbers); @@ -43,11 +45,12 @@ public void winningNumbersValidation(List numbers) { /** * 보너스 번호의 유효성을 검사합니다. * - * @param numbers 지난 주 당첨 번호 + * @param numbers 지난 주 당첨 번호 * @param bonusNumber 보너스 번호 - * @exception IllegalArgumentException 각 당첨번호는 1과 45 사이의 정수이어야 합니다. - * @exception IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. - * */ + * + * @throws IllegalArgumentException 각 당첨번호는 1과 45 사이의 정수이어야 합니다. + * @throws IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. + */ public void bonusNumberValidation(List numbers, int bonusNumber) { // 범위 검사 this.checkCorrectRange(bonusNumber); @@ -62,7 +65,8 @@ public void bonusNumberValidation(List numbers, int bonusNumber) { * 지난 주 당첨 번호는 6개의 숫자이어야 합니다. * * @param numbers 지난 주 당첨 번호 - * @exception IllegalArgumentException 당첨번호는 콤마로 구분된 숫자 6개이어야 합니다. + * + * @throws IllegalArgumentException 당첨번호는 콤마로 구분된 숫자 6개이어야 합니다. */ private void checkCorrectLottoFormat(List numbers) { if (numbers.size() != LOTTO_NUMBER_SIZE) { @@ -74,8 +78,9 @@ private void checkCorrectLottoFormat(List numbers) { * 당첨 번호가 1 ~ 45 사이의 수 인지 확인합니다. * * @param number 당첨 번호 - * @exception IllegalArgumentException 당첨번호는 1과 45 사이의 정수이어야 합니다. - * */ + * + * @throws IllegalArgumentException 당첨번호는 1과 45 사이의 정수이어야 합니다. + */ private void checkCorrectRange(int number) { if (number > MAX_LOTTO_NUMBER || number < MIN_LOTTO_NUMBER) { throw new IllegalArgumentException(AN_INTEGER_BETWEEN_1_AND_45); @@ -86,8 +91,9 @@ private void checkCorrectRange(int number) { * 중복된 번호가 없는지 확인합니다. * * @param numbers 당첨 번호 - * @exception IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. - * */ + * + * @throws IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. + */ private void checkUniqueNumber(List numbers) { int numberSize = new HashSet<>(numbers).size(); diff --git a/src/main/java/lotto/domain/LottoCalculator.java b/src/main/java/lotto/domain/LottoCalculator.java index fec51631437..ffe935c1e7c 100644 --- a/src/main/java/lotto/domain/LottoCalculator.java +++ b/src/main/java/lotto/domain/LottoCalculator.java @@ -3,16 +3,17 @@ import java.util.List; public class LottoCalculator { + /** * 전달받은 수 만큼 맞은 로또의 개수를 반환합니다. * - * @param prizes 로또 티켓의 결과 목록 + * @param prizes 로또 티켓의 결과 목록 * @param checkedPrize 확인할 로또 티켓 + * * @return int - * */ + */ public int getCountOfWin(List prizes, LottoPrize checkedPrize) { - return (int) prizes - .stream() + return (int) prizes.stream() .filter(prize -> LottoPrize.isMatched(prize, checkedPrize.getMatches(), checkedPrize.getIsWonBonusNumber())) .count(); } @@ -21,8 +22,9 @@ public int getCountOfWin(List prizes, LottoPrize checkedPrize) { * 당첨금을 계산하여 반환 합니다. * * @param prizes 로또 결과 객체 + * * @return int - * */ + */ public int getPrizeMoney(List prizes) { int prizeMoney = 0; @@ -37,9 +39,10 @@ public int getPrizeMoney(List prizes) { * 로또 수익률을 계산하여 반환 합니다. * * @param prizeMoney 당첨금 - * @param money 로또 구매 금액 + * @param money 로또 구매 금액 + * * @return double - * */ + */ public double getProfit(int prizeMoney, int money) { double rateOfReturn = (double) prizeMoney / (double) money; diff --git a/src/main/java/lotto/domain/LottoConsumer.java b/src/main/java/lotto/domain/LottoConsumer.java index 105f7898479..35c7a9485e2 100644 --- a/src/main/java/lotto/domain/LottoConsumer.java +++ b/src/main/java/lotto/domain/LottoConsumer.java @@ -1,11 +1,12 @@ package lotto.domain; +import static lotto.domain.LottoTicket.LOTTO_PRICE; + import java.util.ArrayList; import java.util.List; -import static lotto.domain.LottoTicket.LOTTO_PRICE; - public class LottoConsumer { + /** 자동 구매한 로또 티켓 목록 */ private final List autoLottoTickets = new ArrayList<>(); @@ -16,12 +17,12 @@ public class LottoConsumer { * 자동 로또 티켓을 구매합니다. * * @param money 구매할 금액 - * */ + */ public void buyLotto(int money) { int purchasedCount = money / LOTTO_PRICE; int autoPurchasedCount = purchasedCount - manualLottoTickets.size(); - for (int i = 0; i < autoPurchasedCount; i++) { + for (int i = 0 ; i < autoPurchasedCount ; i++) { LottoGenerator generator = new LottoGenerator(); autoLottoTickets.add(new LottoTicket(generator.generate())); } @@ -31,7 +32,7 @@ public void buyLotto(int money) { * 수동 로또 티켓을 구매합니다. * * @param lottoTickets 수동 로또 티켓 목록 - * */ + */ public void buyManualLotto(List lottoTickets) { manualLottoTickets.addAll(lottoTickets); } @@ -40,7 +41,7 @@ public void buyManualLotto(List lottoTickets) { * 자동 로또 티켓 수 반환 합니다. * * @return int - * */ + */ public int getAutoLottoTicketsCount() { return autoLottoTickets.size(); } @@ -49,7 +50,7 @@ public int getAutoLottoTicketsCount() { * 수동 로또 티켓 수 반환 합니다. * * @return int - * */ + */ public int getManualLottoTicketsCount() { return manualLottoTickets.size(); } @@ -58,7 +59,7 @@ public int getManualLottoTicketsCount() { * 구매한 로또 티켓 목록을 반환 합니다. * * @return List - * */ + */ public List getLottoTickets() { List allLottoTickets = new ArrayList<>(manualLottoTickets); allLottoTickets.addAll(autoLottoTickets); diff --git a/src/main/java/lotto/domain/LottoGenerator.java b/src/main/java/lotto/domain/LottoGenerator.java index ee7936da84a..0b9e7d0e069 100644 --- a/src/main/java/lotto/domain/LottoGenerator.java +++ b/src/main/java/lotto/domain/LottoGenerator.java @@ -5,6 +5,7 @@ import java.util.List; public class LottoGenerator { + /** 로또 숫자의 최솟값 */ public static final int MIN_LOTTO_NUMBER = 1; @@ -15,7 +16,7 @@ public class LottoGenerator { * 로또 번호를 생성하고 반환합니다. * * @return List 생성된 로또 티켓 목록 - * */ + */ public List generate() { List numbers = new ArrayList<>(); diff --git a/src/main/java/lotto/domain/LottoPrize.java b/src/main/java/lotto/domain/LottoPrize.java index bb80e506b55..cfedea9f512 100644 --- a/src/main/java/lotto/domain/LottoPrize.java +++ b/src/main/java/lotto/domain/LottoPrize.java @@ -35,10 +35,11 @@ public boolean getIsWonBonusNumber() { /** * matches 와 bonus 에 맞는 값을 반환 합니다. * - * @param matches 맞춘 개수 + * @param matches 맞춘 개수 * @param isWonBonusNumber 보너스 번호 맞춘 여부 + * * @return LottoPrize - * */ + */ public static LottoPrize findByMatchesAndBonus(int matches, boolean isWonBonusNumber) { return Arrays.stream(values()) .filter(prize -> isMatched(prize, matches, isWonBonusNumber)) @@ -49,11 +50,12 @@ public static LottoPrize findByMatchesAndBonus(int matches, boolean isWonBonusNu /** * 로또 티켓을 확인 합니다. * - * @param prize 로또 티켓의 결과 - * @param checkedCount 확인할 맞춘 개수 + * @param prize 로또 티켓의 결과 + * @param checkedCount 확인할 맞춘 개수 * @param isWonBonusNumber 보너스 번호 맞춘 여부 + * * @return boolean - * */ + */ public static boolean isMatched(LottoPrize prize, int checkedCount, boolean isWonBonusNumber) { if (checkedCount == SECOND_MATCHED_COUNT) { return checkSecond(prize, checkedCount, isWonBonusNumber); @@ -65,11 +67,12 @@ public static boolean isMatched(LottoPrize prize, int checkedCount, boolean isWo /** * 로또 티켓의 2등을 확인합니다. * - * @param prize 로또 티켓의 결과 - * @param checkedCount 확인할 맞춘 개수 + * @param prize 로또 티켓의 결과 + * @param checkedCount 확인할 맞춘 개수 * @param isMatchedBonusNumber 보너스 번호 맞춘 여부 + * * @return boolean - * */ + */ private static boolean checkSecond(LottoPrize prize, int checkedCount, boolean isMatchedBonusNumber) { if (isMatchedBonusNumber) { return prize.getIsWonBonusNumber() && prize.getMatches() == checkedCount; diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/LottoTicket.java index 897d62b76bd..6631b887c5b 100644 --- a/src/main/java/lotto/domain/LottoTicket.java +++ b/src/main/java/lotto/domain/LottoTicket.java @@ -6,8 +6,9 @@ /** * 로또 티켓을 관리하는 클래스 입니다. - * */ + */ public class LottoTicket { + /** 로또 가격 */ public static final int LOTTO_PRICE = 1000; @@ -22,7 +23,7 @@ public LottoTicket(List numbers) { * 로또 티켓을 반환 합니다. * * @return List - * */ + */ public List get() { return numbers; } @@ -31,9 +32,10 @@ public List get() { * 맞춘 결과를 반환 합니다. * * @param winningLottoTicket 당첨된 로또 티켓 - * @param bonusNumber 보너스 번호 + * @param bonusNumber 보너스 번호 + * * @return LottoPrize - * */ + */ public LottoPrize win(LottoTicket winningLottoTicket, int bonusNumber) { Set intersection = new HashSet<>(numbers); intersection.retainAll(winningLottoTicket.get()); diff --git a/src/main/java/lotto/factory/LottoApplicationFactory.java b/src/main/java/lotto/factory/LottoApplicationFactory.java index 8a91356e27d..cd748f2e709 100644 --- a/src/main/java/lotto/factory/LottoApplicationFactory.java +++ b/src/main/java/lotto/factory/LottoApplicationFactory.java @@ -8,6 +8,7 @@ import lotto.view.OutputView; public class LottoApplicationFactory { + private InputView createInputView() { return new InputView(); } diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index 2cbf6e9357e..99c9834c067 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -1,15 +1,19 @@ package lotto.service; -import lotto.domain.*; -import lotto.view.OutputView; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import lotto.domain.LastWeekLottoValidator; +import lotto.domain.LottoCalculator; +import lotto.domain.LottoConsumer; +import lotto.domain.LottoPrize; +import lotto.domain.LottoTicket; +import lotto.view.OutputView; public class LottoService { + /** 로또 계산기 */ private final LottoCalculator calculator; @@ -25,8 +29,8 @@ public LottoService(LottoCalculator calculator, LastWeekLottoValidator validator * 로또 티켓을 구매합니다. * * @param consumer 로또 구매자 객체 - * @param money 구매 금액 - * */ + * @param money 구매 금액 + */ public void buyLotto(LottoConsumer consumer, int money) { consumer.buyLotto(money); } @@ -34,9 +38,9 @@ public void buyLotto(LottoConsumer consumer, int money) { /** * 수동 로또 티켓을 구매합니다. * - * @param consumer LottoConsumer + * @param consumer LottoConsumer * @param manualLottoTickets 수동 로또 티켓 목록 - * */ + */ public void buyManualLotto(LottoConsumer consumer, List manualLottoTickets) { consumer.buyManualLotto(manualLottoTickets); } @@ -46,8 +50,9 @@ public void buyManualLotto(LottoConsumer consumer, List manualLotto * 지난 주 당첨 로또를 가공하여 LottoTicket 으로 만듭니다. * * @param numbers 지난 주 당첨 번호 + * * @return LottoTicket - * */ + */ public LottoTicket winningNumberToTicket(String[] numbers) { List lottoNumbers = Arrays.stream(numbers) .map(Integer::parseInt) @@ -63,8 +68,9 @@ public LottoTicket winningNumberToTicket(String[] numbers) { * 수동 로또 번호를 가공하여 List 으로 만듭니다. * * @param numbers 수동 로또 번호 목록 + * * @return List - * */ + */ public List manualNumbersToTickets(List numbers) { List manualLottoTickets = new ArrayList<>(); @@ -78,11 +84,12 @@ public List manualNumbersToTickets(List numbers) { /** * 로또를 계산하여 일치하는 개수의 목록을 반환합니다. * - * @param lottoTickets 구매한 로또 티켓 + * @param lottoTickets 구매한 로또 티켓 * @param winningTicket 지난 주 당첨 로또 티켓 - * @param bonusNumber 보너스 번호 + * @param bonusNumber 보너스 번호 + * * @return List - * */ + */ public List calculate(List lottoTickets, LottoTicket winningTicket, int bonusNumber) { List winningResult = new ArrayList<>(); @@ -100,7 +107,7 @@ public List calculate(List lottoTickets, LottoTicket wi * List 에서 null 값을 제거 합니다. * * @param lottoPrizes 로또 맞춘 결과 목록 - * */ + */ private void removeNullList(List lottoPrizes) { lottoPrizes.removeIf(Objects::isNull); } @@ -110,8 +117,8 @@ private void removeNullList(List lottoPrizes) { * 반복하여 view 에 결과를 전달하여 텍스트를 출력합니다. * * @param prizes 로또 결과 객체 목록 - * @param view 결과 view instance - * */ + * @param view 결과 view instance + */ public void printWinningInformation(List prizes, OutputView view) { for (LottoPrize prize : LottoPrize.values()) { view.printWinningInformation(prize, calculator.getCountOfWin(prizes, prize)); @@ -122,8 +129,8 @@ public void printWinningInformation(List prizes, OutputView view) { * 로또 수익률을 계산 합니다. * * @param prizes 로또 결과 객체 목록 - * @param money 구매 금액 - * */ + * @param money 구매 금액 + */ public Double getProfit(List prizes, int money) { int prizeMoney = calculator.getPrizeMoney(prizes); diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index b36d7e522e7..0e2cdff5338 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -1,18 +1,19 @@ package lotto.view; +import static lotto.domain.LottoTicket.LOTTO_PRICE; + import java.util.ArrayList; import java.util.InputMismatchException; import java.util.List; import java.util.Scanner; -import static lotto.domain.LottoTicket.LOTTO_PRICE; - public class InputView { + /** * 구매할 금액을 입력 받아 반환합니다. * * @return int - * */ + */ public int insertMoney() { int scanValue; @@ -36,15 +37,14 @@ public int insertMoney() { * 지난 주 당첨 번호를 입력 받아 반환 합니다. * * @return String[] - * */ + */ public String[] inputLastWeekWinningLottoNumbers() { System.out.println("지난 주 당첨 번호를 입력해 주세요."); Scanner scanner = new Scanner(System.in); String scanValue = scanner.nextLine(); - return scanValue - .replace(" ", "") + return scanValue.replace(" ", "") .split(","); } @@ -52,7 +52,7 @@ public String[] inputLastWeekWinningLottoNumbers() { * 보너스 볼을 입력 받아 반환 합니다. * * @return int - * */ + */ public int inputBonusNumber() { System.out.println("보너스 볼을 입력해 주세요."); Scanner scanner = new Scanner(System.in); @@ -64,7 +64,7 @@ public int inputBonusNumber() { * 수동으로 구매할 로또 수를 입력 받아 반환 합니다. * * @return int - * */ + */ public int inputManuallyPurchasedLottoTicketCount() { int scanValue; @@ -84,18 +84,18 @@ public int inputManuallyPurchasedLottoTicketCount() { * 수동으로 구매할 로또 번호를 입력 받아 반환 합니다. * * @param purchasedCount 수동 로또 구매 수 - * @return List - * */ + * + * @return List + */ public List inputManuallyPurchasedLottoTicketNumbers(int purchasedCount) { List numbers = new ArrayList<>(); System.out.println("수동으로 구매할 번호를 입력해 주세요."); Scanner scanner = new Scanner(System.in); - for (int i=0 ; i < purchasedCount ; i++) { + for (int i = 0 ; i < purchasedCount ; i++) { String scanValue = scanner.nextLine(); - numbers.add(scanValue - .replace(" ", "") + numbers.add(scanValue.replace(" ", "") .split(",")); } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 552fe5215cb..4dec9bf795c 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -5,11 +5,12 @@ import lotto.domain.LottoTicket; public class OutputView { + /** * 로또 구매 개수와 로또 번호를 출력합니다. * * @param consumer 로또 구매자 - * */ + */ public void printLottoTicketsInformation(LottoConsumer consumer) { System.out.println("수동으로 " + consumer.getManualLottoTicketsCount() + "개, 자동으로 " + consumer.getAutoLottoTicketsCount() + "를 구매했습니다."); @@ -31,15 +32,15 @@ public void printResultTitle() { * * @param prize 로또 결과 * @param count 일치하는 개수 - * */ + */ public void printWinningInformation(LottoPrize prize, int count) { - System.out.print(prize.getMatches() +"개 일치"); + System.out.print(prize.getMatches() + "개 일치"); if (prize.getMatches() == 5 && prize.getIsWonBonusNumber()) { System.out.print(", 보너스 볼 일치"); } - System.out.println(" ("+ prize.getPrize() +"원) - " + count + "개"); + System.out.println(" (" + prize.getPrize() + "원) - " + count + "개"); } @@ -47,7 +48,7 @@ public void printWinningInformation(LottoPrize prize, int count) { * 수익률을 출력합니다. * * @param rate 수익률 - * */ + */ public void printProfit(Double rate) { System.out.println("총 수익률은 " + rate + "입니다."); } diff --git a/src/test/java/lotto/domain/LastWeekLottoValidatorTest.java b/src/test/java/lotto/domain/LastWeekLottoValidatorTest.java index 16f8f010a0d..9c23b14fbf2 100644 --- a/src/test/java/lotto/domain/LastWeekLottoValidatorTest.java +++ b/src/test/java/lotto/domain/LastWeekLottoValidatorTest.java @@ -1,15 +1,15 @@ package lotto.domain; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import java.util.Arrays; import java.util.List; - -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; @DisplayName("지난 주 당첨 로또 번호의 유효성을 테스트 합니다.") class LastWeekLottoValidatorTest { + @Test @DisplayName("지난_주_당첨_번호는_6개의_숫자입니다") void 지난_주_당첨_번호는_6개의_숫자입니다() { @@ -20,8 +20,7 @@ class LastWeekLottoValidatorTest { LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); // then - assertThatIllegalArgumentException() - .isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); + assertThatIllegalArgumentException().isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); } @Test @@ -34,8 +33,7 @@ class LastWeekLottoValidatorTest { LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); // then - assertThatIllegalArgumentException() - .isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); + assertThatIllegalArgumentException().isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); } @Test @@ -48,8 +46,7 @@ class LastWeekLottoValidatorTest { LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); // then - assertThatIllegalArgumentException() - .isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); + assertThatIllegalArgumentException().isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); } @Test @@ -63,7 +60,6 @@ class LastWeekLottoValidatorTest { LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); // then - assertThatIllegalArgumentException() - .isThrownBy(() -> lastWeekLottoValidator.bonusNumberValidation(numbers, bonusNumber)); + assertThatIllegalArgumentException().isThrownBy(() -> lastWeekLottoValidator.bonusNumberValidation(numbers, bonusNumber)); } } diff --git a/src/test/java/lotto/domain/LottoCalculatorTest.java b/src/test/java/lotto/domain/LottoCalculatorTest.java index 3a26862b53c..2f5d62291b0 100644 --- a/src/test/java/lotto/domain/LottoCalculatorTest.java +++ b/src/test/java/lotto/domain/LottoCalculatorTest.java @@ -1,14 +1,14 @@ package lotto.domain; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import java.util.ArrayList; import java.util.List; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; class LottoCalculatorTest { + @Test @DisplayName("로또_티켓의_당첨_결과를_반환합니다") void 로또_티켓의_당첨_결과를_반환합니다() { diff --git a/src/test/java/lotto/domain/LottoConsumerTest.java b/src/test/java/lotto/domain/LottoConsumerTest.java index 9b0250cfe01..e2f2aa45c55 100644 --- a/src/test/java/lotto/domain/LottoConsumerTest.java +++ b/src/test/java/lotto/domain/LottoConsumerTest.java @@ -1,15 +1,15 @@ package lotto.domain; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import java.util.ArrayList; import java.util.Arrays; import java.util.List; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; class LottoConsumerTest { + @Test @DisplayName("전달받은_금액으로_살_수_있는_로또의_개수를_반환합니다") void 전달받은_금액으로_살_수_있는_로또의_개수를_반환합니다() { @@ -17,7 +17,7 @@ class LottoConsumerTest { int money = 2000; // when - LottoConsumer consumer = new LottoConsumer(); + LottoConsumer consumer = new LottoConsumer(); consumer.buyLotto(money); List LottoTickets = consumer.getLottoTickets(); @@ -37,7 +37,7 @@ class LottoConsumerTest { LottoTickets.add(lottoTicket_2); // when - LottoConsumer consumer = new LottoConsumer(); + LottoConsumer consumer = new LottoConsumer(); consumer.buyManualLotto(LottoTickets); // then @@ -51,7 +51,7 @@ class LottoConsumerTest { int money = 3000; // when - LottoConsumer consumer = new LottoConsumer(); + LottoConsumer consumer = new LottoConsumer(); consumer.buyLotto(money); // then diff --git a/src/test/java/lotto/domain/LottoGeneratorTest.java b/src/test/java/lotto/domain/LottoGeneratorTest.java index c937ce6025b..071d151d006 100644 --- a/src/test/java/lotto/domain/LottoGeneratorTest.java +++ b/src/test/java/lotto/domain/LottoGeneratorTest.java @@ -1,13 +1,13 @@ package lotto.domain; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import java.util.List; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; class LottoGeneratorTest { + @Test @DisplayName("로또_번호는_6개_입니다") void 로또_번호는_6개_입니다() { @@ -29,8 +29,7 @@ class LottoGeneratorTest { // when List numbers = generator.generate(); - long count = numbers - .stream() + long count = numbers.stream() .distinct() .count(); diff --git a/src/test/java/lotto/domain/LottoTicketTest.java b/src/test/java/lotto/domain/LottoTicketTest.java index c9da698da8d..0158037b227 100644 --- a/src/test/java/lotto/domain/LottoTicketTest.java +++ b/src/test/java/lotto/domain/LottoTicketTest.java @@ -1,15 +1,15 @@ package lotto.domain; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import java.util.Arrays; import java.util.List; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; @DisplayName("로또 티켓에 대한 테스트 코드") class LottoTicketTest { + @Test @DisplayName("로또_번호로_로또_티켓을_생성합니다") void 로또_번호로_로또_티켓을_생성합니다() { @@ -25,7 +25,7 @@ class LottoTicketTest { @Test @DisplayName("맞춘_결과를_반환_합니다") - void 맞춘_결과를_반환_합니다(){ + void 맞춘_결과를_반환_합니다() { // given LottoTicket purchasedLottoTicket = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); LottoTicket winningLottoTicket = new LottoTicket(Arrays.asList(1, 2, 3, 4, 9, 10)); @@ -38,4 +38,4 @@ class LottoTicketTest { assertThat(result.getMatches()).isEqualTo(4); assertThat(result.getIsWonBonusNumber()).isFalse(); } -} \ No newline at end of file +} From f0e2d5cdfe5b99dde281ea77bc12f3b1e34ed75f Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 1 Jul 2024 09:42:29 +0900 Subject: [PATCH 05/23] =?UTF-8?q?chore:=20=EB=A1=9C=EB=98=90=20=ED=8B=B0?= =?UTF-8?q?=EC=BC=93=20=ED=95=A9=EC=B9=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 수동, 자동 로또 티켓으로 나누지 않고 하나로 관리 --- src/main/java/lotto/domain/LottoConsumer.java | 40 +++++++++---------- src/main/java/lotto/view/OutputView.java | 3 +- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/main/java/lotto/domain/LottoConsumer.java b/src/main/java/lotto/domain/LottoConsumer.java index 35c7a9485e2..9ba282def8f 100644 --- a/src/main/java/lotto/domain/LottoConsumer.java +++ b/src/main/java/lotto/domain/LottoConsumer.java @@ -7,11 +7,11 @@ public class LottoConsumer { - /** 자동 구매한 로또 티켓 목록 */ - private final List autoLottoTickets = new ArrayList<>(); + /** 구매한 로또 티켓 목록 */ + private final List lottoTickets = new ArrayList<>(); - /** 수동 구매한 로또 티켓 목록 */ - private final List manualLottoTickets = new ArrayList<>(); + /** 수동 로또 구매 개수 */ + private int manualLottoCount = 0; /** * 자동 로또 티켓을 구매합니다. @@ -20,11 +20,11 @@ public class LottoConsumer { */ public void buyLotto(int money) { int purchasedCount = money / LOTTO_PRICE; - int autoPurchasedCount = purchasedCount - manualLottoTickets.size(); + int autoPurchasedCount = purchasedCount - manualLottoCount; for (int i = 0 ; i < autoPurchasedCount ; i++) { LottoGenerator generator = new LottoGenerator(); - autoLottoTickets.add(new LottoTicket(generator.generate())); + lottoTickets.add(new LottoTicket(generator.generate())); } } @@ -34,36 +34,34 @@ public void buyLotto(int money) { * @param lottoTickets 수동 로또 티켓 목록 */ public void buyManualLotto(List lottoTickets) { - manualLottoTickets.addAll(lottoTickets); + this.lottoTickets.addAll(lottoTickets); + manualLottoCount = lottoTickets.size(); } /** - * 자동 로또 티켓 수 반환 합니다. + * 구매한 로또 티켓 목록을 반환 합니다. * - * @return int + * @return List */ - public int getAutoLottoTicketsCount() { - return autoLottoTickets.size(); + public List getLottoTickets() { + return lottoTickets; } /** - * 수동 로또 티켓 수 반환 합니다. + * 자동 로또 티켓 개수를 반환합니다. * * @return int */ - public int getManualLottoTicketsCount() { - return manualLottoTickets.size(); + public int getAutoLottoTicketCount() { + return lottoTickets.size() - manualLottoCount; } /** - * 구매한 로또 티켓 목록을 반환 합니다. + * 수동 로또 티켓 개수를 반환합니다. * - * @return List + * @return int */ - public List getLottoTickets() { - List allLottoTickets = new ArrayList<>(manualLottoTickets); - allLottoTickets.addAll(autoLottoTickets); - - return allLottoTickets; + public int getManualLottoTicketCount() { + return manualLottoCount; } } diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 4dec9bf795c..049a8f376d1 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -12,7 +12,7 @@ public class OutputView { * @param consumer 로또 구매자 */ public void printLottoTicketsInformation(LottoConsumer consumer) { - System.out.println("수동으로 " + consumer.getManualLottoTicketsCount() + "개, 자동으로 " + consumer.getAutoLottoTicketsCount() + "를 구매했습니다."); + System.out.println("수동으로 " + consumer.getManualLottoTicketCount() + "개, 자동으로 " + consumer.getAutoLottoTicketCount() + "를 구매했습니다."); for (LottoTicket lottoTicket : consumer.getLottoTickets()) { System.out.println(lottoTicket.get()); @@ -41,7 +41,6 @@ public void printWinningInformation(LottoPrize prize, int count) { } System.out.println(" (" + prize.getPrize() + "원) - " + count + "개"); - } /** From 2338e369e87a149e3baea86ade55003306b21cb8 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 1 Jul 2024 09:46:16 +0900 Subject: [PATCH 06/23] =?UTF-8?q?test:=20=EB=A1=9C=EB=98=90=20=ED=8B=B0?= =?UTF-8?q?=EC=BC=93=20=EA=B0=9C=EC=88=98=20=ED=99=95=EC=9D=B8=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/lotto/domain/LottoConsumerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/lotto/domain/LottoConsumerTest.java b/src/test/java/lotto/domain/LottoConsumerTest.java index e2f2aa45c55..f1e580a28d6 100644 --- a/src/test/java/lotto/domain/LottoConsumerTest.java +++ b/src/test/java/lotto/domain/LottoConsumerTest.java @@ -41,7 +41,7 @@ class LottoConsumerTest { consumer.buyManualLotto(LottoTickets); // then - assertThat(consumer.getManualLottoTicketsCount()).isEqualTo(2); + assertThat(consumer.getManualLottoTicketCount()).isEqualTo(2); } @Test @@ -55,6 +55,6 @@ class LottoConsumerTest { consumer.buyLotto(money); // then - assertThat(consumer.getAutoLottoTicketsCount()).isEqualTo(3); + assertThat(consumer.getAutoLottoTicketCount()).isEqualTo(3); } } From 5dbd0e7d8834a4a1497431113541ba37c42e5491 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 1 Jul 2024 09:50:26 +0900 Subject: [PATCH 07/23] =?UTF-8?q?refactor:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...lidator.java => LottoNumberValidator.java} | 32 +++++++++---------- .../factory/LottoApplicationFactory.java | 4 +-- ...est.java => LottoNumberValidatorTest.java} | 18 +++++------ 3 files changed, 27 insertions(+), 27 deletions(-) rename src/main/java/lotto/domain/{LastWeekLottoValidator.java => LottoNumberValidator.java} (66%) rename src/test/java/lotto/domain/{LastWeekLottoValidatorTest.java => LottoNumberValidatorTest.java} (62%) diff --git a/src/main/java/lotto/domain/LastWeekLottoValidator.java b/src/main/java/lotto/domain/LottoNumberValidator.java similarity index 66% rename from src/main/java/lotto/domain/LastWeekLottoValidator.java rename to src/main/java/lotto/domain/LottoNumberValidator.java index d13dd14f4e4..a84bee6f104 100644 --- a/src/main/java/lotto/domain/LastWeekLottoValidator.java +++ b/src/main/java/lotto/domain/LottoNumberValidator.java @@ -8,28 +8,28 @@ import java.util.List; /** - * 지난 주 로또 번호의 유효성을 체크하는 클래스입니다. + * 로또 번호의 유효성을 체크하는 클래스입니다. */ -public class LastWeekLottoValidator { +public class LottoNumberValidator { /** 로또 티켓의 숫자 개수 */ public static final int LOTTO_NUMBER_SIZE = 6; - private static final String COMMA_SEPARATED_NUMBERS = "당첨번호는 콤마로 구분된 숫자 6개이어야 합니다."; - private static final String AN_INTEGER_BETWEEN_1_AND_45 = "당첨번호는 1과 45 사이의 정수이어야 합니다."; - private static final String NOT_DUPLICATE_NUMBERS = "당첨번호에 중복된 숫자가 없어야 합니다."; + private static final String COMMA_SEPARATED_NUMBERS = "로또 번호는 콤마로 구분된 숫자 6개이어야 합니다."; + private static final String AN_INTEGER_BETWEEN_1_AND_45 = "로또 번호는 1과 45 사이의 정수이어야 합니다."; + private static final String NOT_DUPLICATE_NUMBERS = "로또 번호에 중복된 숫자가 없어야 합니다."; /** - * 지난 주 당첨 번호에 대한 유효성을 확인 합니다. + * 로또 번호에 대한 유효성을 확인 합니다. *

1. 번호가 6개 인지

*

2. 숫자로 되어있는지

*

3. 중복된 수가 없는지

* * @param numbers 지난 주 당첨 번호 * - * @throws IllegalArgumentException 당첨번호는 콤마로 구분된 숫자 6개이어야 합니다. + * @throws IllegalArgumentException 로또 번호는 콤마로 구분된 숫자 6개이어야 합니다. * @throws IllegalArgumentException 각 당첨번호는 1과 45 사이의 정수이어야 합니다. - * @throws IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. + * @throws IllegalArgumentException 로또 번호에 중복된 숫자가 없어야 합니다. */ public void winningNumbersValidation(List numbers) { // 숫자 개수 검사 @@ -62,11 +62,11 @@ public void bonusNumberValidation(List numbers, int bonusNumber) { } /** - * 지난 주 당첨 번호는 6개의 숫자이어야 합니다. + * 로또 번호는 6개의 숫자이어야 합니다. * - * @param numbers 지난 주 당첨 번호 + * @param numbers 로또 번호 * - * @throws IllegalArgumentException 당첨번호는 콤마로 구분된 숫자 6개이어야 합니다. + * @throws IllegalArgumentException 로또 번호는 콤마로 구분된 숫자 6개이어야 합니다. */ private void checkCorrectLottoFormat(List numbers) { if (numbers.size() != LOTTO_NUMBER_SIZE) { @@ -75,11 +75,11 @@ private void checkCorrectLottoFormat(List numbers) { } /** - * 당첨 번호가 1 ~ 45 사이의 수 인지 확인합니다. + * 로또 번호가 1 ~ 45 사이의 수 인지 확인합니다. * - * @param number 당첨 번호 + * @param number 로또 번호 * - * @throws IllegalArgumentException 당첨번호는 1과 45 사이의 정수이어야 합니다. + * @throws IllegalArgumentException 로또 번호는 1과 45 사이의 정수이어야 합니다. */ private void checkCorrectRange(int number) { if (number > MAX_LOTTO_NUMBER || number < MIN_LOTTO_NUMBER) { @@ -90,9 +90,9 @@ private void checkCorrectRange(int number) { /** * 중복된 번호가 없는지 확인합니다. * - * @param numbers 당첨 번호 + * @param numbers 로또 번호 * - * @throws IllegalArgumentException 당첨번호에 중복된 숫자가 없어야 합니다. + * @throws IllegalArgumentException 로또 번호에 중복된 숫자가 없어야 합니다. */ private void checkUniqueNumber(List numbers) { int numberSize = new HashSet<>(numbers).size(); diff --git a/src/main/java/lotto/factory/LottoApplicationFactory.java b/src/main/java/lotto/factory/LottoApplicationFactory.java index cd748f2e709..36d8cd8d6e2 100644 --- a/src/main/java/lotto/factory/LottoApplicationFactory.java +++ b/src/main/java/lotto/factory/LottoApplicationFactory.java @@ -1,8 +1,8 @@ package lotto.factory; import lotto.LottoApplication; -import lotto.domain.LastWeekLottoValidator; import lotto.domain.LottoCalculator; +import lotto.domain.LottoNumberValidator; import lotto.service.LottoService; import lotto.view.InputView; import lotto.view.OutputView; @@ -19,7 +19,7 @@ private OutputView createOutputView() { private LottoService createLottoService() { LottoCalculator calculator = new LottoCalculator(); - LastWeekLottoValidator validator = new LastWeekLottoValidator(); + LottoNumberValidator validator = new LottoNumberValidator(); return new LottoService(calculator, validator); } diff --git a/src/test/java/lotto/domain/LastWeekLottoValidatorTest.java b/src/test/java/lotto/domain/LottoNumberValidatorTest.java similarity index 62% rename from src/test/java/lotto/domain/LastWeekLottoValidatorTest.java rename to src/test/java/lotto/domain/LottoNumberValidatorTest.java index 9c23b14fbf2..20bbe7548a3 100644 --- a/src/test/java/lotto/domain/LastWeekLottoValidatorTest.java +++ b/src/test/java/lotto/domain/LottoNumberValidatorTest.java @@ -8,7 +8,7 @@ import org.junit.jupiter.api.Test; @DisplayName("지난 주 당첨 로또 번호의 유효성을 테스트 합니다.") -class LastWeekLottoValidatorTest { +class LottoNumberValidatorTest { @Test @DisplayName("지난_주_당첨_번호는_6개의_숫자입니다") @@ -17,10 +17,10 @@ class LastWeekLottoValidatorTest { List numbers = Arrays.asList(1, 2, 3, 4, 5); // when - LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); + LottoNumberValidator lottoNumberValidator = new LottoNumberValidator(); // then - assertThatIllegalArgumentException().isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); + assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.winningNumbersValidation(numbers)); } @Test @@ -30,10 +30,10 @@ class LastWeekLottoValidatorTest { List numbers = Arrays.asList(1, 2, 3, 4, 5, 70); // when - LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); + LottoNumberValidator lottoNumberValidator = new LottoNumberValidator(); // then - assertThatIllegalArgumentException().isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); + assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.winningNumbersValidation(numbers)); } @Test @@ -43,10 +43,10 @@ class LastWeekLottoValidatorTest { List numbers = Arrays.asList(1, 2, 3, 4, 5, 5); // when - LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); + LottoNumberValidator lottoNumberValidator = new LottoNumberValidator(); // then - assertThatIllegalArgumentException().isThrownBy(() -> lastWeekLottoValidator.winningNumbersValidation(numbers)); + assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.winningNumbersValidation(numbers)); } @Test @@ -57,9 +57,9 @@ class LastWeekLottoValidatorTest { int bonusNumber = 6; // when - LastWeekLottoValidator lastWeekLottoValidator = new LastWeekLottoValidator(); + LottoNumberValidator lottoNumberValidator = new LottoNumberValidator(); // then - assertThatIllegalArgumentException().isThrownBy(() -> lastWeekLottoValidator.bonusNumberValidation(numbers, bonusNumber)); + assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.bonusNumberValidation(numbers, bonusNumber)); } } From c6429fb570c63ec77fb320a34c7dc23d13de0ad0 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 1 Jul 2024 09:51:01 +0900 Subject: [PATCH 08/23] =?UTF-8?q?refactor:=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=9D=B4=EB=A6=84=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/LottoApplication.java | 2 +- src/main/java/lotto/service/LottoService.java | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index 4d0d5f40e54..1904ce9f24a 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -56,7 +56,7 @@ public void run() { int bonusNumber = inputView.inputBonusNumber(); // 지난 주 당첨 티켓 생성 - LottoTicket winningTicket = lottoService.winningNumberToTicket(LastWeekWinningNumbers); + LottoTicket winningTicket = lottoService.lottoNumberToTicket(LastWeekWinningNumbers); // 맞춘 번호 개수와 맞춘 보너스 번호 결과 List winningResult = lottoService.calculate(consumer.getLottoTickets(), winningTicket, bonusNumber); diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index 99c9834c067..43d82d067a3 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -5,9 +5,9 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; -import lotto.domain.LastWeekLottoValidator; import lotto.domain.LottoCalculator; import lotto.domain.LottoConsumer; +import lotto.domain.LottoNumberValidator; import lotto.domain.LottoPrize; import lotto.domain.LottoTicket; import lotto.view.OutputView; @@ -17,10 +17,10 @@ public class LottoService { /** 로또 계산기 */ private final LottoCalculator calculator; - /** 지난 주 당첨 번호 유효성 검사기 */ - private final LastWeekLottoValidator validator; + /** 로또 번호 유효성 검사기 */ + private final LottoNumberValidator validator; - public LottoService(LottoCalculator calculator, LastWeekLottoValidator validator) { + public LottoService(LottoCalculator calculator, LottoNumberValidator validator) { this.calculator = calculator; this.validator = validator; } @@ -47,13 +47,13 @@ public void buyManualLotto(LottoConsumer consumer, List manualLotto /** - * 지난 주 당첨 로또를 가공하여 LottoTicket 으로 만듭니다. + * 로또 번호를 가공하여 LottoTicket 으로 만듭니다. * * @param numbers 지난 주 당첨 번호 * * @return LottoTicket */ - public LottoTicket winningNumberToTicket(String[] numbers) { + public LottoTicket lottoNumberToTicket(String[] numbers) { List lottoNumbers = Arrays.stream(numbers) .map(Integer::parseInt) .collect(Collectors.toList()); @@ -75,7 +75,7 @@ public List manualNumbersToTickets(List numbers) { List manualLottoTickets = new ArrayList<>(); for (String[] number : numbers) { - manualLottoTickets.add(this.winningNumberToTicket(number)); + manualLottoTickets.add(this.lottoNumberToTicket(number)); } return manualLottoTickets; From 6576481e43b2dabaaee990eecdadda180612e881 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 1 Jul 2024 09:56:59 +0900 Subject: [PATCH 09/23] =?UTF-8?q?refactor:=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EA=B5=AC=EB=AC=B8=20=EC=9C=84=EC=B9=98?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/lotto/domain/LottoConsumerTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/lotto/domain/LottoConsumerTest.java b/src/test/java/lotto/domain/LottoConsumerTest.java index f1e580a28d6..e7c20e2bbbb 100644 --- a/src/test/java/lotto/domain/LottoConsumerTest.java +++ b/src/test/java/lotto/domain/LottoConsumerTest.java @@ -36,8 +36,9 @@ class LottoConsumerTest { LottoTickets.add(lottoTicket_1); LottoTickets.add(lottoTicket_2); - // when LottoConsumer consumer = new LottoConsumer(); + + // when consumer.buyManualLotto(LottoTickets); // then From e94b1141f3b9f08dcfcb84a6f51f2b35990dd17d Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 1 Jul 2024 11:39:13 +0900 Subject: [PATCH 10/23] =?UTF-8?q?refactor:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=83=9D=EC=84=B1=20=EC=A3=BC=EC=B2=B4=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LottoGenerator 클래스에 자동/수동 생성 이동 - LottoValidator 클래스 이름 변경 --- src/main/java/lotto/domain/LottoConsumer.java | 2 +- .../java/lotto/domain/LottoGenerator.java | 27 ++++++++++++++++--- ...mberValidator.java => LottoValidator.java} | 2 +- .../factory/LottoApplicationFactory.java | 6 ++--- src/main/java/lotto/service/LottoService.java | 23 +++++----------- .../java/lotto/domain/LottoGeneratorTest.java | 12 +++++---- .../domain/LottoNumberValidatorTest.java | 8 +++--- 7 files changed, 47 insertions(+), 33 deletions(-) rename src/main/java/lotto/domain/{LottoNumberValidator.java => LottoValidator.java} (99%) diff --git a/src/main/java/lotto/domain/LottoConsumer.java b/src/main/java/lotto/domain/LottoConsumer.java index 9ba282def8f..9798240dce6 100644 --- a/src/main/java/lotto/domain/LottoConsumer.java +++ b/src/main/java/lotto/domain/LottoConsumer.java @@ -24,7 +24,7 @@ public void buyLotto(int money) { for (int i = 0 ; i < autoPurchasedCount ; i++) { LottoGenerator generator = new LottoGenerator(); - lottoTickets.add(new LottoTicket(generator.generate())); + lottoTickets.add(generator.autoGenerate()); } } diff --git a/src/main/java/lotto/domain/LottoGenerator.java b/src/main/java/lotto/domain/LottoGenerator.java index 0b9e7d0e069..70e321794f5 100644 --- a/src/main/java/lotto/domain/LottoGenerator.java +++ b/src/main/java/lotto/domain/LottoGenerator.java @@ -1,8 +1,10 @@ package lotto.domain; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public class LottoGenerator { @@ -13,11 +15,11 @@ public class LottoGenerator { public static final int MAX_LOTTO_NUMBER = 45; /** - * 로또 번호를 생성하고 반환합니다. + * 자동 로또 번호를 생성하고 반환합니다. * * @return List 생성된 로또 티켓 목록 */ - public List generate() { + public LottoTicket autoGenerate() { List numbers = new ArrayList<>(); for (int i = MIN_LOTTO_NUMBER ; i <= MAX_LOTTO_NUMBER ; i++) { @@ -30,6 +32,25 @@ public List generate() { Collections.sort(shuffledNumber); - return shuffledNumber; + return new LottoTicket(shuffledNumber); + } + + /** + * 수동 로또 번호를 전달 받아 LottoTicket 객체로 반환 합니다. + * + * @param numbers 로또 번호 + * + * @return LottoTicket + */ + public LottoTicket manualGenerate(String[] numbers) { + List lottoNumbers = Arrays.stream(numbers) + .map(Integer::parseInt) + .collect(Collectors.toList()); + + // 유효성 체크 + LottoValidator validator = new LottoValidator(); + validator.winningNumbersValidation(lottoNumbers); + + return new LottoTicket(lottoNumbers); } } diff --git a/src/main/java/lotto/domain/LottoNumberValidator.java b/src/main/java/lotto/domain/LottoValidator.java similarity index 99% rename from src/main/java/lotto/domain/LottoNumberValidator.java rename to src/main/java/lotto/domain/LottoValidator.java index a84bee6f104..52953d6be82 100644 --- a/src/main/java/lotto/domain/LottoNumberValidator.java +++ b/src/main/java/lotto/domain/LottoValidator.java @@ -10,7 +10,7 @@ /** * 로또 번호의 유효성을 체크하는 클래스입니다. */ -public class LottoNumberValidator { +public class LottoValidator { /** 로또 티켓의 숫자 개수 */ public static final int LOTTO_NUMBER_SIZE = 6; diff --git a/src/main/java/lotto/factory/LottoApplicationFactory.java b/src/main/java/lotto/factory/LottoApplicationFactory.java index 36d8cd8d6e2..2964f15cccd 100644 --- a/src/main/java/lotto/factory/LottoApplicationFactory.java +++ b/src/main/java/lotto/factory/LottoApplicationFactory.java @@ -2,7 +2,7 @@ import lotto.LottoApplication; import lotto.domain.LottoCalculator; -import lotto.domain.LottoNumberValidator; +import lotto.domain.LottoGenerator; import lotto.service.LottoService; import lotto.view.InputView; import lotto.view.OutputView; @@ -19,9 +19,9 @@ private OutputView createOutputView() { private LottoService createLottoService() { LottoCalculator calculator = new LottoCalculator(); - LottoNumberValidator validator = new LottoNumberValidator(); + LottoGenerator generator = new LottoGenerator(); - return new LottoService(calculator, validator); + return new LottoService(calculator, generator); } /** LottoApplication 파라미터 생성을 위한 Factory */ diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index 43d82d067a3..e0c99986fa6 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -1,13 +1,11 @@ package lotto.service; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; import lotto.domain.LottoCalculator; import lotto.domain.LottoConsumer; -import lotto.domain.LottoNumberValidator; +import lotto.domain.LottoGenerator; import lotto.domain.LottoPrize; import lotto.domain.LottoTicket; import lotto.view.OutputView; @@ -17,12 +15,12 @@ public class LottoService { /** 로또 계산기 */ private final LottoCalculator calculator; - /** 로또 번호 유효성 검사기 */ - private final LottoNumberValidator validator; + /** 로또 번호 생성기 */ + private final LottoGenerator generator; - public LottoService(LottoCalculator calculator, LottoNumberValidator validator) { + public LottoService(LottoCalculator calculator, LottoGenerator generator) { this.calculator = calculator; - this.validator = validator; + this.generator = generator; } /** @@ -54,14 +52,7 @@ public void buyManualLotto(LottoConsumer consumer, List manualLotto * @return LottoTicket */ public LottoTicket lottoNumberToTicket(String[] numbers) { - List lottoNumbers = Arrays.stream(numbers) - .map(Integer::parseInt) - .collect(Collectors.toList()); - - // 유효성 체크 - validator.winningNumbersValidation(lottoNumbers); - - return new LottoTicket(lottoNumbers); + return generator.manualGenerate(numbers); } /** @@ -75,7 +66,7 @@ public List manualNumbersToTickets(List numbers) { List manualLottoTickets = new ArrayList<>(); for (String[] number : numbers) { - manualLottoTickets.add(this.lottoNumberToTicket(number)); + manualLottoTickets.add(generator.manualGenerate(number)); } return manualLottoTickets; diff --git a/src/test/java/lotto/domain/LottoGeneratorTest.java b/src/test/java/lotto/domain/LottoGeneratorTest.java index 071d151d006..e3ca46bb403 100644 --- a/src/test/java/lotto/domain/LottoGeneratorTest.java +++ b/src/test/java/lotto/domain/LottoGeneratorTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -15,10 +14,11 @@ class LottoGeneratorTest { LottoGenerator generator = new LottoGenerator(); // when - List numbers = generator.generate(); + LottoTicket lottoTicket = generator.autoGenerate(); // then - assertThat(numbers).hasSize(6); + assertThat(lottoTicket.get() + .size()).isEqualTo(6); } @Test @@ -28,8 +28,10 @@ class LottoGeneratorTest { LottoGenerator generator = new LottoGenerator(); // when - List numbers = generator.generate(); - long count = numbers.stream() + LottoTicket lottoTicket = generator.autoGenerate(); + + long count = lottoTicket.get() + .stream() .distinct() .count(); diff --git a/src/test/java/lotto/domain/LottoNumberValidatorTest.java b/src/test/java/lotto/domain/LottoNumberValidatorTest.java index 20bbe7548a3..4327e08dc46 100644 --- a/src/test/java/lotto/domain/LottoNumberValidatorTest.java +++ b/src/test/java/lotto/domain/LottoNumberValidatorTest.java @@ -17,7 +17,7 @@ class LottoNumberValidatorTest { List numbers = Arrays.asList(1, 2, 3, 4, 5); // when - LottoNumberValidator lottoNumberValidator = new LottoNumberValidator(); + LottoValidator lottoNumberValidator = new LottoValidator(); // then assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.winningNumbersValidation(numbers)); @@ -30,7 +30,7 @@ class LottoNumberValidatorTest { List numbers = Arrays.asList(1, 2, 3, 4, 5, 70); // when - LottoNumberValidator lottoNumberValidator = new LottoNumberValidator(); + LottoValidator lottoNumberValidator = new LottoValidator(); // then assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.winningNumbersValidation(numbers)); @@ -43,7 +43,7 @@ class LottoNumberValidatorTest { List numbers = Arrays.asList(1, 2, 3, 4, 5, 5); // when - LottoNumberValidator lottoNumberValidator = new LottoNumberValidator(); + LottoValidator lottoNumberValidator = new LottoValidator(); // then assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.winningNumbersValidation(numbers)); @@ -57,7 +57,7 @@ class LottoNumberValidatorTest { int bonusNumber = 6; // when - LottoNumberValidator lottoNumberValidator = new LottoNumberValidator(); + LottoValidator lottoNumberValidator = new LottoValidator(); // then assertThatIllegalArgumentException().isThrownBy(() -> lottoNumberValidator.bonusNumberValidation(numbers, bonusNumber)); From 2a6e1b65b6ef571f446df50f5418fb4a4e69c4cc Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 1 Jul 2024 11:40:33 +0900 Subject: [PATCH 11/23] =?UTF-8?q?refactor:=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A4=84=EB=B0=94=EA=BF=88=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/service/LottoService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index e0c99986fa6..dffea3dc587 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -43,11 +43,10 @@ public void buyManualLotto(LottoConsumer consumer, List manualLotto consumer.buyManualLotto(manualLottoTickets); } - /** * 로또 번호를 가공하여 LottoTicket 으로 만듭니다. * - * @param numbers 지난 주 당첨 번호 + * @param numbers 로또 번호 * * @return LottoTicket */ From e3c822c59a36e9b306b337f78733a85d0f809b69 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 1 Jul 2024 13:27:12 +0900 Subject: [PATCH 12/23] =?UTF-8?q?refactor:=20=EC=88=98=EB=8F=99=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=20=ED=8B=B0=EC=BC=93=20=EA=B5=AC=EB=A7=A4=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=84=B8=EC=8A=A4=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/LottoApplication.java | 5 +--- src/main/java/lotto/domain/LottoConsumer.java | 16 ++++++++---- src/main/java/lotto/service/LottoService.java | 25 +++---------------- .../java/lotto/domain/LottoConsumerTest.java | 11 ++++---- 4 files changed, 21 insertions(+), 36 deletions(-) diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index 1904ce9f24a..d196c59191c 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -36,11 +36,8 @@ public void run() { // 수동 로또 번호 입력 List manuallyPurchasedLottoNumbers = inputView.inputManuallyPurchasedLottoTicketNumbers(manuallyPurchasedLottoTicketCount); - // 수동 로또 번호를 로또 티켓으로 변환 - List manualLottoTickets = lottoService.manualNumbersToTickets(manuallyPurchasedLottoNumbers); - // 수동 로또 티켓 구매 - lottoService.buyManualLotto(consumer, manualLottoTickets); + lottoService.buyManualLotto(consumer, manuallyPurchasedLottoNumbers); } // 자동 티켓 구매 diff --git a/src/main/java/lotto/domain/LottoConsumer.java b/src/main/java/lotto/domain/LottoConsumer.java index 9798240dce6..384b0bf5353 100644 --- a/src/main/java/lotto/domain/LottoConsumer.java +++ b/src/main/java/lotto/domain/LottoConsumer.java @@ -19,11 +19,12 @@ public class LottoConsumer { * @param money 구매할 금액 */ public void buyLotto(int money) { + LottoGenerator generator = new LottoGenerator(); + int purchasedCount = money / LOTTO_PRICE; int autoPurchasedCount = purchasedCount - manualLottoCount; for (int i = 0 ; i < autoPurchasedCount ; i++) { - LottoGenerator generator = new LottoGenerator(); lottoTickets.add(generator.autoGenerate()); } } @@ -31,11 +32,16 @@ public void buyLotto(int money) { /** * 수동 로또 티켓을 구매합니다. * - * @param lottoTickets 수동 로또 티켓 목록 + * @param lottoNumbers 수동 로또 티켓 목록 */ - public void buyManualLotto(List lottoTickets) { - this.lottoTickets.addAll(lottoTickets); - manualLottoCount = lottoTickets.size(); + public void buyManualLotto(List lottoNumbers) { + manualLottoCount = lottoNumbers.size(); + + LottoGenerator generator = new LottoGenerator(); + + for (String[] lottoNumber : lottoNumbers) { + lottoTickets.add(generator.manualGenerate(lottoNumber)); + } } /** diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index dffea3dc587..4cdf3c962ca 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -36,11 +36,11 @@ public void buyLotto(LottoConsumer consumer, int money) { /** * 수동 로또 티켓을 구매합니다. * - * @param consumer LottoConsumer - * @param manualLottoTickets 수동 로또 티켓 목록 + * @param consumer LottoConsumer + * @param lottoNumbers 로또 번호 목록 */ - public void buyManualLotto(LottoConsumer consumer, List manualLottoTickets) { - consumer.buyManualLotto(manualLottoTickets); + public void buyManualLotto(LottoConsumer consumer, List lottoNumbers) { + consumer.buyManualLotto(lottoNumbers); } /** @@ -54,23 +54,6 @@ public LottoTicket lottoNumberToTicket(String[] numbers) { return generator.manualGenerate(numbers); } - /** - * 수동 로또 번호를 가공하여 List 으로 만듭니다. - * - * @param numbers 수동 로또 번호 목록 - * - * @return List - */ - public List manualNumbersToTickets(List numbers) { - List manualLottoTickets = new ArrayList<>(); - - for (String[] number : numbers) { - manualLottoTickets.add(generator.manualGenerate(number)); - } - - return manualLottoTickets; - } - /** * 로또를 계산하여 일치하는 개수의 목록을 반환합니다. * diff --git a/src/test/java/lotto/domain/LottoConsumerTest.java b/src/test/java/lotto/domain/LottoConsumerTest.java index e7c20e2bbbb..01b945f0c2b 100644 --- a/src/test/java/lotto/domain/LottoConsumerTest.java +++ b/src/test/java/lotto/domain/LottoConsumerTest.java @@ -3,7 +3,6 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -29,12 +28,12 @@ class LottoConsumerTest { @DisplayName("수동_로또_티켓을_구매_합니다") void 수동_로또_티켓을_구매_합니다() { // given - LottoTicket lottoTicket_1 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); - LottoTicket lottoTicket_2 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + String[] lottoNumber_1 = {"1", "2", "3", "4", "5", "6"}; + String[] lottoNumber_2 = {"1", "2", "3", "4", "5", "6"}; - List LottoTickets = new ArrayList<>(); - LottoTickets.add(lottoTicket_1); - LottoTickets.add(lottoTicket_2); + List LottoTickets = new ArrayList<>(); + LottoTickets.add(lottoNumber_1); + LottoTickets.add(lottoNumber_2); LottoConsumer consumer = new LottoConsumer(); From ab0412299bffe204b1a70608d242f8a5fca3a5ba Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 1 Jul 2024 13:59:11 +0900 Subject: [PATCH 13/23] =?UTF-8?q?test:=20LottoService=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/lotto/service/LottoServiceTest.java | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 src/test/java/lotto/service/LottoServiceTest.java diff --git a/src/test/java/lotto/service/LottoServiceTest.java b/src/test/java/lotto/service/LottoServiceTest.java new file mode 100644 index 00000000000..90f49af321a --- /dev/null +++ b/src/test/java/lotto/service/LottoServiceTest.java @@ -0,0 +1,118 @@ +package lotto.service; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import lotto.domain.LottoCalculator; +import lotto.domain.LottoConsumer; +import lotto.domain.LottoGenerator; +import lotto.domain.LottoPrize; +import lotto.domain.LottoTicket; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class LottoServiceTest { + + @Test + @DisplayName("자동_로또_티켓을_구매합니다") + void 자동_로또_티켓을_구매합니다() { + // given + int money = 4_000; + + LottoConsumer consumer = new LottoConsumer(); + LottoCalculator calculator = new LottoCalculator(); + LottoGenerator generator = new LottoGenerator(); + LottoService lottoService = new LottoService(calculator, generator); + + // when + lottoService.buyLotto(consumer, money); + + // then + assertThat(consumer.getLottoTickets() + .size()).isEqualTo(4); + } + + @Test + @DisplayName("수동_로또_티켓을_구매합니다") + void 수동_로또_티켓을_구매합니다() { + // given + String[] lottoNumber_1 = {"1", "2", "3", "4", "5", "6"}; + String[] lottoNumber_2 = {"1", "2", "3", "4", "5", "6"}; + + List LottoTickets = new ArrayList<>(); + LottoTickets.add(lottoNumber_1); + LottoTickets.add(lottoNumber_2); + + LottoConsumer consumer = new LottoConsumer(); + LottoCalculator calculator = new LottoCalculator(); + LottoGenerator generator = new LottoGenerator(); + LottoService lottoService = new LottoService(calculator, generator); + + // when + lottoService.buyManualLotto(consumer, LottoTickets); + + // then + assertThat(consumer.getLottoTickets() + .size()).isEqualTo(2); + } + + @Test + @DisplayName("로또_번호를_가공하여_로또_티켓을_만듭니다.") + void 로또_번호를_가공하여_로또_티켓을_만듭니다() { + // given + String[] lottoNumber = {"1", "2", "3", "4", "5", "6"}; + + LottoCalculator calculator = new LottoCalculator(); + LottoGenerator generator = new LottoGenerator(); + LottoService lottoService = new LottoService(calculator, generator); + + // when + LottoTicket lottoTicket = lottoService.lottoNumberToTicket(lottoNumber); + + // then + assertThat(lottoTicket.get()).isNotNull(); + } + + @Test + @DisplayName("로또를_계산하여_일치하는_개수의_목록을_반환합니다") + void 로또를_계산하여_일치하는_개수의_목록을_반환합니다() { + // given + int bonusNumber = 24; + + LottoCalculator calculator = new LottoCalculator(); + LottoGenerator generator = new LottoGenerator(); + LottoService lottoService = new LottoService(calculator, generator); + + LottoTicket winningTicket = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + + List lottoTickets = new ArrayList<>(); + LottoTicket lottoTicket_1 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + LottoTicket lottoTicket_2 = new LottoTicket(Arrays.asList(11, 12, 13, 14, 15, 16)); + lottoTickets.add(lottoTicket_1); + lottoTickets.add(lottoTicket_2); + + // when + List lottoPrizes = lottoService.calculate(lottoTickets, winningTicket, bonusNumber); + + // then + assertThat(lottoPrizes).hasSize(1); + assertThat(lottoPrizes.get(0)).isEqualTo(LottoPrize.SIX_MATCHES); + } + + @Test + @DisplayName("로또_수익률을_계산_합니다") + void 로또_수익률을_계산_합니다() { + // given + LottoCalculator calculator = new LottoCalculator(); + LottoGenerator generator = new LottoGenerator(); + LottoService lottoService = new LottoService(calculator, generator); + + // when + Double profit = lottoService.getProfit(List.of(LottoPrize.THREE_MATCHES), 1_000); + + // then + assertThat(profit).isEqualTo(5.0); + } +} From 0471dfb11049dd8dd75a1c146ac0096cd2732e87 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Thu, 11 Jul 2024 15:38:48 +0900 Subject: [PATCH 14/23] =?UTF-8?q?test:=20LottoCalculator=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가독성을 위해 enum 사용 --- .../lotto/domain/LottoCalculatorTest.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/test/java/lotto/domain/LottoCalculatorTest.java b/src/test/java/lotto/domain/LottoCalculatorTest.java index 2f5d62291b0..5bb7c04856d 100644 --- a/src/test/java/lotto/domain/LottoCalculatorTest.java +++ b/src/test/java/lotto/domain/LottoCalculatorTest.java @@ -14,19 +14,16 @@ class LottoCalculatorTest { void 로또_티켓의_당첨_결과를_반환합니다() { // given List result = new ArrayList<>(); - result.add(LottoPrize.findByMatchesAndBonus(3, false)); - result.add(LottoPrize.findByMatchesAndBonus(3, false)); - result.add(LottoPrize.findByMatchesAndBonus(3, true)); - result.add(LottoPrize.findByMatchesAndBonus(4, false)); - result.add(LottoPrize.findByMatchesAndBonus(5, true)); - result.add(LottoPrize.findByMatchesAndBonus(5, false)); + result.add(LottoPrize.THREE_MATCHES); + result.add(LottoPrize.THREE_MATCHES); + result.add(LottoPrize.FIVE_MATCHES); // when LottoCalculator calculator = new LottoCalculator(); int count = calculator.getCountOfWin(result, LottoPrize.THREE_MATCHES); // then - assertThat(count).isEqualTo(3); + assertThat(count).isEqualTo(2); } @Test @@ -34,17 +31,15 @@ class LottoCalculatorTest { void 당첨금을_계산하여_반환합니다() { // given List result = new ArrayList<>(); - result.add(LottoPrize.findByMatchesAndBonus(3, false)); - result.add(LottoPrize.findByMatchesAndBonus(3, false)); - result.add(LottoPrize.findByMatchesAndBonus(3, true)); - result.add(LottoPrize.findByMatchesAndBonus(4, false)); + result.add(LottoPrize.THREE_MATCHES); + result.add(LottoPrize.FOUR_MATCHES); // when LottoCalculator calculator = new LottoCalculator(); int prizeMoney = calculator.getPrizeMoney(result); // then - assertThat(prizeMoney).isEqualTo(65000); + assertThat(prizeMoney).isEqualTo(55_000); } @Test From 442c41c2ae374c484662bef26e331871c9753b21 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Thu, 11 Jul 2024 16:01:33 +0900 Subject: [PATCH 15/23] =?UTF-8?q?chore:=20=EC=88=98=EB=8F=99=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EA=B0=9C=EC=88=98=20final=20=EC=84=A0=EC=96=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/LottoApplication.java | 4 ++-- src/main/java/lotto/domain/LottoConsumer.java | 11 +++++++---- src/test/java/lotto/domain/LottoConsumerTest.java | 6 +++--- src/test/java/lotto/service/LottoServiceTest.java | 4 ++-- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index d196c59191c..5460a1d2971 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -24,14 +24,14 @@ public LottoApplication(InputView inputView, OutputView outputView, LottoService } public void run() { - LottoConsumer consumer = new LottoConsumer(); - // 로또 구매 금액 입력 int money = inputView.insertMoney(); // 수동 구매 로또 수 입력 int manuallyPurchasedLottoTicketCount = inputView.inputManuallyPurchasedLottoTicketCount(); + LottoConsumer consumer = new LottoConsumer(manuallyPurchasedLottoTicketCount); + if (manuallyPurchasedLottoTicketCount > 0) { // 수동 로또 번호 입력 List manuallyPurchasedLottoNumbers = inputView.inputManuallyPurchasedLottoTicketNumbers(manuallyPurchasedLottoTicketCount); diff --git a/src/main/java/lotto/domain/LottoConsumer.java b/src/main/java/lotto/domain/LottoConsumer.java index 384b0bf5353..c0aa72d3b79 100644 --- a/src/main/java/lotto/domain/LottoConsumer.java +++ b/src/main/java/lotto/domain/LottoConsumer.java @@ -8,10 +8,15 @@ public class LottoConsumer { /** 구매한 로또 티켓 목록 */ - private final List lottoTickets = new ArrayList<>(); + private final List lottoTickets; /** 수동 로또 구매 개수 */ - private int manualLottoCount = 0; + private final int manualLottoCount; + + public LottoConsumer(int manualLottoCount) { + this.lottoTickets = new ArrayList<>(); + this.manualLottoCount = manualLottoCount; + } /** * 자동 로또 티켓을 구매합니다. @@ -35,8 +40,6 @@ public void buyLotto(int money) { * @param lottoNumbers 수동 로또 티켓 목록 */ public void buyManualLotto(List lottoNumbers) { - manualLottoCount = lottoNumbers.size(); - LottoGenerator generator = new LottoGenerator(); for (String[] lottoNumber : lottoNumbers) { diff --git a/src/test/java/lotto/domain/LottoConsumerTest.java b/src/test/java/lotto/domain/LottoConsumerTest.java index 01b945f0c2b..6ac86bdcbcd 100644 --- a/src/test/java/lotto/domain/LottoConsumerTest.java +++ b/src/test/java/lotto/domain/LottoConsumerTest.java @@ -16,7 +16,7 @@ class LottoConsumerTest { int money = 2000; // when - LottoConsumer consumer = new LottoConsumer(); + LottoConsumer consumer = new LottoConsumer(0); consumer.buyLotto(money); List LottoTickets = consumer.getLottoTickets(); @@ -35,7 +35,7 @@ class LottoConsumerTest { LottoTickets.add(lottoNumber_1); LottoTickets.add(lottoNumber_2); - LottoConsumer consumer = new LottoConsumer(); + LottoConsumer consumer = new LottoConsumer(2); // when consumer.buyManualLotto(LottoTickets); @@ -51,7 +51,7 @@ class LottoConsumerTest { int money = 3000; // when - LottoConsumer consumer = new LottoConsumer(); + LottoConsumer consumer = new LottoConsumer(0); consumer.buyLotto(money); // then diff --git a/src/test/java/lotto/service/LottoServiceTest.java b/src/test/java/lotto/service/LottoServiceTest.java index 90f49af321a..26f4a9803a5 100644 --- a/src/test/java/lotto/service/LottoServiceTest.java +++ b/src/test/java/lotto/service/LottoServiceTest.java @@ -21,7 +21,7 @@ class LottoServiceTest { // given int money = 4_000; - LottoConsumer consumer = new LottoConsumer(); + LottoConsumer consumer = new LottoConsumer(0); LottoCalculator calculator = new LottoCalculator(); LottoGenerator generator = new LottoGenerator(); LottoService lottoService = new LottoService(calculator, generator); @@ -45,7 +45,7 @@ class LottoServiceTest { LottoTickets.add(lottoNumber_1); LottoTickets.add(lottoNumber_2); - LottoConsumer consumer = new LottoConsumer(); + LottoConsumer consumer = new LottoConsumer(0); LottoCalculator calculator = new LottoCalculator(); LottoGenerator generator = new LottoGenerator(); LottoService lottoService = new LottoService(calculator, generator); From d3d0aba664c1fbbb29c911bb3f6359a3bce55130 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 15 Jul 2024 09:24:46 +0900 Subject: [PATCH 16/23] =?UTF-8?q?chore:=20=EC=88=98=EB=8F=99=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EA=B0=9C=EC=88=98=20final=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=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/LottoApplication.java | 2 +- src/main/java/lotto/domain/LottoConsumer.java | 8 +++++--- src/test/java/lotto/domain/LottoConsumerTest.java | 6 +++--- src/test/java/lotto/service/LottoServiceTest.java | 4 ++-- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index 5460a1d2971..b5e16f263df 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -30,7 +30,7 @@ public void run() { // 수동 구매 로또 수 입력 int manuallyPurchasedLottoTicketCount = inputView.inputManuallyPurchasedLottoTicketCount(); - LottoConsumer consumer = new LottoConsumer(manuallyPurchasedLottoTicketCount); + LottoConsumer consumer = new LottoConsumer(); if (manuallyPurchasedLottoTicketCount > 0) { // 수동 로또 번호 입력 diff --git a/src/main/java/lotto/domain/LottoConsumer.java b/src/main/java/lotto/domain/LottoConsumer.java index c0aa72d3b79..77cbb73b609 100644 --- a/src/main/java/lotto/domain/LottoConsumer.java +++ b/src/main/java/lotto/domain/LottoConsumer.java @@ -11,11 +11,10 @@ public class LottoConsumer { private final List lottoTickets; /** 수동 로또 구매 개수 */ - private final int manualLottoCount; + private int manualLottoCount = 0; - public LottoConsumer(int manualLottoCount) { + public LottoConsumer() { this.lottoTickets = new ArrayList<>(); - this.manualLottoCount = manualLottoCount; } /** @@ -45,6 +44,9 @@ public void buyManualLotto(List lottoNumbers) { for (String[] lottoNumber : lottoNumbers) { lottoTickets.add(generator.manualGenerate(lottoNumber)); } + + // 수동 로또 티켓 수 저장 + manualLottoCount = lottoNumbers.size(); } /** diff --git a/src/test/java/lotto/domain/LottoConsumerTest.java b/src/test/java/lotto/domain/LottoConsumerTest.java index 6ac86bdcbcd..01b945f0c2b 100644 --- a/src/test/java/lotto/domain/LottoConsumerTest.java +++ b/src/test/java/lotto/domain/LottoConsumerTest.java @@ -16,7 +16,7 @@ class LottoConsumerTest { int money = 2000; // when - LottoConsumer consumer = new LottoConsumer(0); + LottoConsumer consumer = new LottoConsumer(); consumer.buyLotto(money); List LottoTickets = consumer.getLottoTickets(); @@ -35,7 +35,7 @@ class LottoConsumerTest { LottoTickets.add(lottoNumber_1); LottoTickets.add(lottoNumber_2); - LottoConsumer consumer = new LottoConsumer(2); + LottoConsumer consumer = new LottoConsumer(); // when consumer.buyManualLotto(LottoTickets); @@ -51,7 +51,7 @@ class LottoConsumerTest { int money = 3000; // when - LottoConsumer consumer = new LottoConsumer(0); + LottoConsumer consumer = new LottoConsumer(); consumer.buyLotto(money); // then diff --git a/src/test/java/lotto/service/LottoServiceTest.java b/src/test/java/lotto/service/LottoServiceTest.java index 26f4a9803a5..90f49af321a 100644 --- a/src/test/java/lotto/service/LottoServiceTest.java +++ b/src/test/java/lotto/service/LottoServiceTest.java @@ -21,7 +21,7 @@ class LottoServiceTest { // given int money = 4_000; - LottoConsumer consumer = new LottoConsumer(0); + LottoConsumer consumer = new LottoConsumer(); LottoCalculator calculator = new LottoCalculator(); LottoGenerator generator = new LottoGenerator(); LottoService lottoService = new LottoService(calculator, generator); @@ -45,7 +45,7 @@ class LottoServiceTest { LottoTickets.add(lottoNumber_1); LottoTickets.add(lottoNumber_2); - LottoConsumer consumer = new LottoConsumer(0); + LottoConsumer consumer = new LottoConsumer(); LottoCalculator calculator = new LottoCalculator(); LottoGenerator generator = new LottoGenerator(); LottoService lottoService = new LottoService(calculator, generator); From 167e34afaafe526785949d21a59fc139e110c509 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 15 Jul 2024 09:26:51 +0900 Subject: [PATCH 17/23] =?UTF-8?q?refactor:=20LottoGenerator=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=EB=AA=85=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/LottoConsumer.java | 4 ++-- ...LottoGenerator.java => LottoTicketGenerator.java} | 2 +- src/main/java/lotto/domain/LottoValidator.java | 4 ++-- .../java/lotto/factory/LottoApplicationFactory.java | 4 ++-- src/main/java/lotto/service/LottoService.java | 6 +++--- ...eratorTest.java => LottoTicketGeneratorTest.java} | 6 +++--- src/test/java/lotto/service/LottoServiceTest.java | 12 ++++++------ 7 files changed, 19 insertions(+), 19 deletions(-) rename src/main/java/lotto/domain/{LottoGenerator.java => LottoTicketGenerator.java} (97%) rename src/test/java/lotto/domain/{LottoGeneratorTest.java => LottoTicketGeneratorTest.java} (83%) diff --git a/src/main/java/lotto/domain/LottoConsumer.java b/src/main/java/lotto/domain/LottoConsumer.java index 77cbb73b609..5381f8936cd 100644 --- a/src/main/java/lotto/domain/LottoConsumer.java +++ b/src/main/java/lotto/domain/LottoConsumer.java @@ -23,7 +23,7 @@ public LottoConsumer() { * @param money 구매할 금액 */ public void buyLotto(int money) { - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); int purchasedCount = money / LOTTO_PRICE; int autoPurchasedCount = purchasedCount - manualLottoCount; @@ -39,7 +39,7 @@ public void buyLotto(int money) { * @param lottoNumbers 수동 로또 티켓 목록 */ public void buyManualLotto(List lottoNumbers) { - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); for (String[] lottoNumber : lottoNumbers) { lottoTickets.add(generator.manualGenerate(lottoNumber)); diff --git a/src/main/java/lotto/domain/LottoGenerator.java b/src/main/java/lotto/domain/LottoTicketGenerator.java similarity index 97% rename from src/main/java/lotto/domain/LottoGenerator.java rename to src/main/java/lotto/domain/LottoTicketGenerator.java index 70e321794f5..15881a4a5c2 100644 --- a/src/main/java/lotto/domain/LottoGenerator.java +++ b/src/main/java/lotto/domain/LottoTicketGenerator.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.stream.Collectors; -public class LottoGenerator { +public class LottoTicketGenerator { /** 로또 숫자의 최솟값 */ public static final int MIN_LOTTO_NUMBER = 1; diff --git a/src/main/java/lotto/domain/LottoValidator.java b/src/main/java/lotto/domain/LottoValidator.java index 52953d6be82..7472793907c 100644 --- a/src/main/java/lotto/domain/LottoValidator.java +++ b/src/main/java/lotto/domain/LottoValidator.java @@ -1,7 +1,7 @@ package lotto.domain; -import static lotto.domain.LottoGenerator.MAX_LOTTO_NUMBER; -import static lotto.domain.LottoGenerator.MIN_LOTTO_NUMBER; +import static lotto.domain.LottoTicketGenerator.MAX_LOTTO_NUMBER; +import static lotto.domain.LottoTicketGenerator.MIN_LOTTO_NUMBER; import java.util.ArrayList; import java.util.HashSet; diff --git a/src/main/java/lotto/factory/LottoApplicationFactory.java b/src/main/java/lotto/factory/LottoApplicationFactory.java index 2964f15cccd..a159eeae55c 100644 --- a/src/main/java/lotto/factory/LottoApplicationFactory.java +++ b/src/main/java/lotto/factory/LottoApplicationFactory.java @@ -2,7 +2,7 @@ import lotto.LottoApplication; import lotto.domain.LottoCalculator; -import lotto.domain.LottoGenerator; +import lotto.domain.LottoTicketGenerator; import lotto.service.LottoService; import lotto.view.InputView; import lotto.view.OutputView; @@ -19,7 +19,7 @@ private OutputView createOutputView() { private LottoService createLottoService() { LottoCalculator calculator = new LottoCalculator(); - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); return new LottoService(calculator, generator); } diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index 4cdf3c962ca..c08c9fa7626 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -5,9 +5,9 @@ import java.util.Objects; import lotto.domain.LottoCalculator; import lotto.domain.LottoConsumer; -import lotto.domain.LottoGenerator; import lotto.domain.LottoPrize; import lotto.domain.LottoTicket; +import lotto.domain.LottoTicketGenerator; import lotto.view.OutputView; public class LottoService { @@ -16,9 +16,9 @@ public class LottoService { private final LottoCalculator calculator; /** 로또 번호 생성기 */ - private final LottoGenerator generator; + private final LottoTicketGenerator generator; - public LottoService(LottoCalculator calculator, LottoGenerator generator) { + public LottoService(LottoCalculator calculator, LottoTicketGenerator generator) { this.calculator = calculator; this.generator = generator; } diff --git a/src/test/java/lotto/domain/LottoGeneratorTest.java b/src/test/java/lotto/domain/LottoTicketGeneratorTest.java similarity index 83% rename from src/test/java/lotto/domain/LottoGeneratorTest.java rename to src/test/java/lotto/domain/LottoTicketGeneratorTest.java index e3ca46bb403..74d98104a33 100644 --- a/src/test/java/lotto/domain/LottoGeneratorTest.java +++ b/src/test/java/lotto/domain/LottoTicketGeneratorTest.java @@ -5,13 +5,13 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -class LottoGeneratorTest { +class LottoTicketGeneratorTest { @Test @DisplayName("로또_번호는_6개_입니다") void 로또_번호는_6개_입니다() { // given - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); // when LottoTicket lottoTicket = generator.autoGenerate(); @@ -25,7 +25,7 @@ class LottoGeneratorTest { @DisplayName("로또_번호는_중복되지_않습니다") void 로또_번호는_중복되지_않습니다() { // given - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); // when LottoTicket lottoTicket = generator.autoGenerate(); diff --git a/src/test/java/lotto/service/LottoServiceTest.java b/src/test/java/lotto/service/LottoServiceTest.java index 90f49af321a..c675322967f 100644 --- a/src/test/java/lotto/service/LottoServiceTest.java +++ b/src/test/java/lotto/service/LottoServiceTest.java @@ -7,9 +7,9 @@ import java.util.List; import lotto.domain.LottoCalculator; import lotto.domain.LottoConsumer; -import lotto.domain.LottoGenerator; import lotto.domain.LottoPrize; import lotto.domain.LottoTicket; +import lotto.domain.LottoTicketGenerator; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -23,7 +23,7 @@ class LottoServiceTest { LottoConsumer consumer = new LottoConsumer(); LottoCalculator calculator = new LottoCalculator(); - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); LottoService lottoService = new LottoService(calculator, generator); // when @@ -47,7 +47,7 @@ class LottoServiceTest { LottoConsumer consumer = new LottoConsumer(); LottoCalculator calculator = new LottoCalculator(); - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); LottoService lottoService = new LottoService(calculator, generator); // when @@ -65,7 +65,7 @@ class LottoServiceTest { String[] lottoNumber = {"1", "2", "3", "4", "5", "6"}; LottoCalculator calculator = new LottoCalculator(); - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); LottoService lottoService = new LottoService(calculator, generator); // when @@ -82,7 +82,7 @@ class LottoServiceTest { int bonusNumber = 24; LottoCalculator calculator = new LottoCalculator(); - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); LottoService lottoService = new LottoService(calculator, generator); LottoTicket winningTicket = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); @@ -106,7 +106,7 @@ class LottoServiceTest { void 로또_수익률을_계산_합니다() { // given LottoCalculator calculator = new LottoCalculator(); - LottoGenerator generator = new LottoGenerator(); + LottoTicketGenerator generator = new LottoTicketGenerator(); LottoService lottoService = new LottoService(calculator, generator); // when From 37aa7fb488a308d198d08aeb7e83cf7b7cb40f78 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 15 Jul 2024 09:41:24 +0900 Subject: [PATCH 18/23] =?UTF-8?q?chore:=20LottoTicketGenerator=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LottoService 에 정의된 LottoTicketGenerator 를 사용하도록 변경 - Loose Coupling --- src/main/java/lotto/domain/LottoConsumer.java | 8 ++------ src/main/java/lotto/service/LottoService.java | 4 ++-- src/test/java/lotto/domain/LottoConsumerTest.java | 13 ++++++++----- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/lotto/domain/LottoConsumer.java b/src/main/java/lotto/domain/LottoConsumer.java index 5381f8936cd..f59c18f5a32 100644 --- a/src/main/java/lotto/domain/LottoConsumer.java +++ b/src/main/java/lotto/domain/LottoConsumer.java @@ -22,9 +22,7 @@ public LottoConsumer() { * * @param money 구매할 금액 */ - public void buyLotto(int money) { - LottoTicketGenerator generator = new LottoTicketGenerator(); - + public void buyLotto(int money, LottoTicketGenerator generator) { int purchasedCount = money / LOTTO_PRICE; int autoPurchasedCount = purchasedCount - manualLottoCount; @@ -38,9 +36,7 @@ public void buyLotto(int money) { * * @param lottoNumbers 수동 로또 티켓 목록 */ - public void buyManualLotto(List lottoNumbers) { - LottoTicketGenerator generator = new LottoTicketGenerator(); - + public void buyManualLotto(List lottoNumbers, LottoTicketGenerator generator) { for (String[] lottoNumber : lottoNumbers) { lottoTickets.add(generator.manualGenerate(lottoNumber)); } diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index c08c9fa7626..bb19cf7dd82 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -30,7 +30,7 @@ public LottoService(LottoCalculator calculator, LottoTicketGenerator generator) * @param money 구매 금액 */ public void buyLotto(LottoConsumer consumer, int money) { - consumer.buyLotto(money); + consumer.buyLotto(money, generator); } /** @@ -40,7 +40,7 @@ public void buyLotto(LottoConsumer consumer, int money) { * @param lottoNumbers 로또 번호 목록 */ public void buyManualLotto(LottoConsumer consumer, List lottoNumbers) { - consumer.buyManualLotto(lottoNumbers); + consumer.buyManualLotto(lottoNumbers, generator); } /** diff --git a/src/test/java/lotto/domain/LottoConsumerTest.java b/src/test/java/lotto/domain/LottoConsumerTest.java index 01b945f0c2b..62294bb3e23 100644 --- a/src/test/java/lotto/domain/LottoConsumerTest.java +++ b/src/test/java/lotto/domain/LottoConsumerTest.java @@ -14,10 +14,11 @@ class LottoConsumerTest { void 전달받은_금액으로_살_수_있는_로또의_개수를_반환합니다() { // given int money = 2000; + LottoTicketGenerator generator = new LottoTicketGenerator(); + LottoConsumer consumer = new LottoConsumer(); // when - LottoConsumer consumer = new LottoConsumer(); - consumer.buyLotto(money); + consumer.buyLotto(money, generator); List LottoTickets = consumer.getLottoTickets(); // then @@ -36,9 +37,10 @@ class LottoConsumerTest { LottoTickets.add(lottoNumber_2); LottoConsumer consumer = new LottoConsumer(); + LottoTicketGenerator generator = new LottoTicketGenerator(); // when - consumer.buyManualLotto(LottoTickets); + consumer.buyManualLotto(LottoTickets, generator); // then assertThat(consumer.getManualLottoTicketCount()).isEqualTo(2); @@ -49,10 +51,11 @@ class LottoConsumerTest { void 자동_로또_티켓_수를_반환_합니다() { // given int money = 3000; + LottoTicketGenerator generator = new LottoTicketGenerator(); + LottoConsumer consumer = new LottoConsumer(); // when - LottoConsumer consumer = new LottoConsumer(); - consumer.buyLotto(money); + consumer.buyLotto(money, generator); // then assertThat(consumer.getAutoLottoTicketCount()).isEqualTo(3); From 51a569e74ed32d382cfedb77a68c26a8c1aa4ce6 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 15 Jul 2024 09:44:27 +0900 Subject: [PATCH 19/23] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20=EB=8C=80=EC=83=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - LottoValidator -> LottoTicket (MAX_LOTTO_NUMBER, MIN_LOTTO_NUMBER) --- src/main/java/lotto/domain/LottoTicket.java | 6 ++++++ src/main/java/lotto/domain/LottoTicketGenerator.java | 9 +++------ src/main/java/lotto/domain/LottoValidator.java | 4 ++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/lotto/domain/LottoTicket.java b/src/main/java/lotto/domain/LottoTicket.java index 6631b887c5b..13ff5c933a8 100644 --- a/src/main/java/lotto/domain/LottoTicket.java +++ b/src/main/java/lotto/domain/LottoTicket.java @@ -12,6 +12,12 @@ public class LottoTicket { /** 로또 가격 */ public static final int LOTTO_PRICE = 1000; + /** 로또 숫자의 최솟값 */ + public static final int MIN_LOTTO_NUMBER = 1; + + /** 로또 숫자의 최댓값 */ + public static final int MAX_LOTTO_NUMBER = 45; + /** 로또 번호 */ private final List numbers; diff --git a/src/main/java/lotto/domain/LottoTicketGenerator.java b/src/main/java/lotto/domain/LottoTicketGenerator.java index 15881a4a5c2..250288a8307 100644 --- a/src/main/java/lotto/domain/LottoTicketGenerator.java +++ b/src/main/java/lotto/domain/LottoTicketGenerator.java @@ -1,5 +1,8 @@ package lotto.domain; +import static lotto.domain.LottoTicket.MAX_LOTTO_NUMBER; +import static lotto.domain.LottoTicket.MIN_LOTTO_NUMBER; + import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -8,12 +11,6 @@ public class LottoTicketGenerator { - /** 로또 숫자의 최솟값 */ - public static final int MIN_LOTTO_NUMBER = 1; - - /** 로또 숫자의 최댓값 */ - public static final int MAX_LOTTO_NUMBER = 45; - /** * 자동 로또 번호를 생성하고 반환합니다. * diff --git a/src/main/java/lotto/domain/LottoValidator.java b/src/main/java/lotto/domain/LottoValidator.java index 7472793907c..29c1be46aea 100644 --- a/src/main/java/lotto/domain/LottoValidator.java +++ b/src/main/java/lotto/domain/LottoValidator.java @@ -1,7 +1,7 @@ package lotto.domain; -import static lotto.domain.LottoTicketGenerator.MAX_LOTTO_NUMBER; -import static lotto.domain.LottoTicketGenerator.MIN_LOTTO_NUMBER; +import static lotto.domain.LottoTicket.MAX_LOTTO_NUMBER; +import static lotto.domain.LottoTicket.MIN_LOTTO_NUMBER; import java.util.ArrayList; import java.util.HashSet; From eb6d32932b418f6dbce67e68688ec62f7f9e8f21 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 15 Jul 2024 14:19:59 +0900 Subject: [PATCH 20/23] =?UTF-8?q?refactor:=20=EC=A0=84=EB=9E=B5=20?= =?UTF-8?q?=ED=8C=A8=ED=84=B4=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 자동, 수동 로또 구매애 대해 전략 패턴 적용 --- src/main/java/lotto/LottoApplication.java | 28 ++++++---- src/main/java/lotto/domain/LottoConsumer.java | 53 ++++++++----------- .../domain/purchaseStrategy/AutoStrategy.java | 28 ++++++++++ .../purchaseStrategy/ManualStrategy.java | 23 ++++++++ .../purchaseStrategy/PurchaseStrategy.java | 10 ++++ src/main/java/lotto/dto/LottoPurchaseDto.java | 27 ++++++++++ src/main/java/lotto/service/LottoService.java | 24 +++++---- src/main/java/lotto/view/InputView.java | 4 ++ src/main/java/lotto/view/OutputView.java | 2 +- 9 files changed, 148 insertions(+), 51 deletions(-) create mode 100644 src/main/java/lotto/domain/purchaseStrategy/AutoStrategy.java create mode 100644 src/main/java/lotto/domain/purchaseStrategy/ManualStrategy.java create mode 100644 src/main/java/lotto/domain/purchaseStrategy/PurchaseStrategy.java create mode 100644 src/main/java/lotto/dto/LottoPurchaseDto.java diff --git a/src/main/java/lotto/LottoApplication.java b/src/main/java/lotto/LottoApplication.java index b5e16f263df..1c48f259730 100644 --- a/src/main/java/lotto/LottoApplication.java +++ b/src/main/java/lotto/LottoApplication.java @@ -4,6 +4,9 @@ import lotto.domain.LottoConsumer; import lotto.domain.LottoPrize; import lotto.domain.LottoTicket; +import lotto.domain.purchaseStrategy.AutoStrategy; +import lotto.domain.purchaseStrategy.ManualStrategy; +import lotto.dto.LottoPurchaseDto; import lotto.factory.LottoApplicationFactory; import lotto.service.LottoService; import lotto.view.InputView; @@ -24,24 +27,31 @@ public LottoApplication(InputView inputView, OutputView outputView, LottoService } public void run() { + LottoConsumer consumer = new LottoConsumer(); + // 로또 구매 금액 입력 int money = inputView.insertMoney(); // 수동 구매 로또 수 입력 int manuallyPurchasedLottoTicketCount = inputView.inputManuallyPurchasedLottoTicketCount(); - LottoConsumer consumer = new LottoConsumer(); + // 수동 로또 번호 입력 + List manuallyPurchasedLottoNumbers = inputView.inputManuallyPurchasedLottoTicketNumbers(manuallyPurchasedLottoTicketCount); + + // 구매 정보 DTO + LottoPurchaseDto purchaseDto = new LottoPurchaseDto(money, manuallyPurchasedLottoNumbers); + + // 수동 구매로 전략 변경 + lottoService.setPurchaseStrategy(new ManualStrategy()); - if (manuallyPurchasedLottoTicketCount > 0) { - // 수동 로또 번호 입력 - List manuallyPurchasedLottoNumbers = inputView.inputManuallyPurchasedLottoTicketNumbers(manuallyPurchasedLottoTicketCount); + // 수동 로또 티켓 구매 + lottoService.buyLottoTicket(consumer, purchaseDto); - // 수동 로또 티켓 구매 - lottoService.buyManualLotto(consumer, manuallyPurchasedLottoNumbers); - } + // 자동 구매로 전략 변경 + lottoService.setPurchaseStrategy(new AutoStrategy()); - // 자동 티켓 구매 - lottoService.buyLotto(consumer, money); + // 자동 로또 티켓 구매 + lottoService.buyLottoTicket(consumer, purchaseDto); // 로또 구매 정보 출력 outputView.printLottoTicketsInformation(consumer); diff --git a/src/main/java/lotto/domain/LottoConsumer.java b/src/main/java/lotto/domain/LottoConsumer.java index f59c18f5a32..358a2667e50 100644 --- a/src/main/java/lotto/domain/LottoConsumer.java +++ b/src/main/java/lotto/domain/LottoConsumer.java @@ -1,56 +1,49 @@ package lotto.domain; -import static lotto.domain.LottoTicket.LOTTO_PRICE; - import java.util.ArrayList; import java.util.List; public class LottoConsumer { - /** 구매한 로또 티켓 목록 */ - private final List lottoTickets; + /** 자동 로또 티켓 목록 */ + private final List lottoTicketsByAuto; - /** 수동 로또 구매 개수 */ - private int manualLottoCount = 0; + /** 수동 로또 티켓 목록 */ + private final List lottoTicketsByManual; public LottoConsumer() { - this.lottoTickets = new ArrayList<>(); + this.lottoTicketsByAuto = new ArrayList<>(); + this.lottoTicketsByManual = new ArrayList<>(); } /** - * 자동 로또 티켓을 구매합니다. + * 자동 로또 티켓을 추가합니다. * - * @param money 구매할 금액 + * @param lottoTickets 로또 티켓 목록 */ - public void buyLotto(int money, LottoTicketGenerator generator) { - int purchasedCount = money / LOTTO_PRICE; - int autoPurchasedCount = purchasedCount - manualLottoCount; - - for (int i = 0 ; i < autoPurchasedCount ; i++) { - lottoTickets.add(generator.autoGenerate()); - } + public void addAutoLottoTickets(List lottoTickets) { + this.lottoTicketsByAuto.addAll(lottoTickets); } /** - * 수동 로또 티켓을 구매합니다. + * 수동 로또 티켓을 추가합니다. * - * @param lottoNumbers 수동 로또 티켓 목록 + * @param lottoTickets 로또 티켓 목록 */ - public void buyManualLotto(List lottoNumbers, LottoTicketGenerator generator) { - for (String[] lottoNumber : lottoNumbers) { - lottoTickets.add(generator.manualGenerate(lottoNumber)); - } - - // 수동 로또 티켓 수 저장 - manualLottoCount = lottoNumbers.size(); + public void addManualLottoTickets(List lottoTickets) { + this.lottoTicketsByManual.addAll(lottoTickets); } /** - * 구매한 로또 티켓 목록을 반환 합니다. + * 전체 로또 티켓 목록을 반환 합니다. * * @return List */ public List getLottoTickets() { + List lottoTickets = new ArrayList<>(); + lottoTickets.addAll(lottoTicketsByAuto); + lottoTickets.addAll(lottoTicketsByManual); + return lottoTickets; } @@ -59,8 +52,8 @@ public List getLottoTickets() { * * @return int */ - public int getAutoLottoTicketCount() { - return lottoTickets.size() - manualLottoCount; + public int getAutoTicketCount() { + return lottoTicketsByAuto.size(); } /** @@ -68,7 +61,7 @@ public int getAutoLottoTicketCount() { * * @return int */ - public int getManualLottoTicketCount() { - return manualLottoCount; + public int getManualTicketCount() { + return lottoTicketsByManual.size(); } } diff --git a/src/main/java/lotto/domain/purchaseStrategy/AutoStrategy.java b/src/main/java/lotto/domain/purchaseStrategy/AutoStrategy.java new file mode 100644 index 00000000000..ede3edc002b --- /dev/null +++ b/src/main/java/lotto/domain/purchaseStrategy/AutoStrategy.java @@ -0,0 +1,28 @@ +package lotto.domain.purchaseStrategy; + +import static lotto.domain.LottoTicket.LOTTO_PRICE; + +import java.util.ArrayList; +import java.util.List; +import lotto.domain.LottoConsumer; +import lotto.domain.LottoTicket; +import lotto.domain.LottoTicketGenerator; +import lotto.dto.LottoPurchaseDto; + +public class AutoStrategy implements PurchaseStrategy { + + @Override + public void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto purchaseDto, LottoTicketGenerator generator) { + List lottoTickets = new ArrayList<>(); + + int purchasedCount = purchaseDto.getMoney() / LOTTO_PRICE; + int autoPurchasedCount = purchasedCount - consumer.getManualTicketCount(); + + for (int i = 0 ; i < autoPurchasedCount ; i++) { + lottoTickets.add(generator.autoGenerate()); + } + + // 로또 티켓 추가 + consumer.addAutoLottoTickets(lottoTickets); + } +} diff --git a/src/main/java/lotto/domain/purchaseStrategy/ManualStrategy.java b/src/main/java/lotto/domain/purchaseStrategy/ManualStrategy.java new file mode 100644 index 00000000000..7386f0b1aaf --- /dev/null +++ b/src/main/java/lotto/domain/purchaseStrategy/ManualStrategy.java @@ -0,0 +1,23 @@ +package lotto.domain.purchaseStrategy; + +import java.util.ArrayList; +import java.util.List; +import lotto.domain.LottoConsumer; +import lotto.domain.LottoTicket; +import lotto.domain.LottoTicketGenerator; +import lotto.dto.LottoPurchaseDto; + +public class ManualStrategy implements PurchaseStrategy { + + @Override + public void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto purchaseDto, LottoTicketGenerator generator) { + List lottoTickets = new ArrayList<>(); + + for (String[] lottoNumber : purchaseDto.getLottoNumbers()) { + lottoTickets.add(generator.manualGenerate(lottoNumber)); + } + + // 로또 티켓 추가 + consumer.addManualLottoTickets(lottoTickets); + } +} diff --git a/src/main/java/lotto/domain/purchaseStrategy/PurchaseStrategy.java b/src/main/java/lotto/domain/purchaseStrategy/PurchaseStrategy.java new file mode 100644 index 00000000000..d223879e217 --- /dev/null +++ b/src/main/java/lotto/domain/purchaseStrategy/PurchaseStrategy.java @@ -0,0 +1,10 @@ +package lotto.domain.purchaseStrategy; + +import lotto.domain.LottoConsumer; +import lotto.domain.LottoTicketGenerator; +import lotto.dto.LottoPurchaseDto; + +public interface PurchaseStrategy { + + void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto purchaseDto, LottoTicketGenerator generator); +} diff --git a/src/main/java/lotto/dto/LottoPurchaseDto.java b/src/main/java/lotto/dto/LottoPurchaseDto.java new file mode 100644 index 00000000000..adcde09c7dd --- /dev/null +++ b/src/main/java/lotto/dto/LottoPurchaseDto.java @@ -0,0 +1,27 @@ +package lotto.dto; + +import java.util.ArrayList; +import java.util.List; + +public class LottoPurchaseDto { + + private final int money; + + private final List lottoNumbers; + + public LottoPurchaseDto(int money, List lottoNumbers) { + this.money = money; + this.lottoNumbers = new ArrayList<>(); + if (lottoNumbers != null) { + this.lottoNumbers.addAll(lottoNumbers); + } + } + + public int getMoney() { + return money; + } + + public List getLottoNumbers() { + return lottoNumbers; + } +} diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index bb19cf7dd82..7ee635b7e2b 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -8,6 +8,8 @@ import lotto.domain.LottoPrize; import lotto.domain.LottoTicket; import lotto.domain.LottoTicketGenerator; +import lotto.domain.purchaseStrategy.PurchaseStrategy; +import lotto.dto.LottoPurchaseDto; import lotto.view.OutputView; public class LottoService { @@ -18,29 +20,29 @@ public class LottoService { /** 로또 번호 생성기 */ private final LottoTicketGenerator generator; + /** 로또 구매 전략 */ + private PurchaseStrategy strategy; + public LottoService(LottoCalculator calculator, LottoTicketGenerator generator) { this.calculator = calculator; this.generator = generator; } /** - * 로또 티켓을 구매합니다. - * - * @param consumer 로또 구매자 객체 - * @param money 구매 금액 + * 구매 전략 세팅 */ - public void buyLotto(LottoConsumer consumer, int money) { - consumer.buyLotto(money, generator); + public void setPurchaseStrategy(PurchaseStrategy strategy) { + this.strategy = strategy; } /** - * 수동 로또 티켓을 구매합니다. + * 로또 티켓을 구매합니다. * - * @param consumer LottoConsumer - * @param lottoNumbers 로또 번호 목록 + * @param consumer 구매자 + * @param dto 구매정보 DTO */ - public void buyManualLotto(LottoConsumer consumer, List lottoNumbers) { - consumer.buyManualLotto(lottoNumbers, generator); + public void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto dto) { + strategy.buyLottoTicket(consumer, dto, generator); } /** diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 0e2cdff5338..2f150c8061d 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -88,6 +88,10 @@ public int inputManuallyPurchasedLottoTicketCount() { * @return List */ public List inputManuallyPurchasedLottoTicketNumbers(int purchasedCount) { + if (purchasedCount < 1) { + return null; + } + List numbers = new ArrayList<>(); System.out.println("수동으로 구매할 번호를 입력해 주세요."); diff --git a/src/main/java/lotto/view/OutputView.java b/src/main/java/lotto/view/OutputView.java index 049a8f376d1..759108760e2 100644 --- a/src/main/java/lotto/view/OutputView.java +++ b/src/main/java/lotto/view/OutputView.java @@ -12,7 +12,7 @@ public class OutputView { * @param consumer 로또 구매자 */ public void printLottoTicketsInformation(LottoConsumer consumer) { - System.out.println("수동으로 " + consumer.getManualLottoTicketCount() + "개, 자동으로 " + consumer.getAutoLottoTicketCount() + "를 구매했습니다."); + System.out.println("수동으로 " + consumer.getManualTicketCount() + "개, 자동으로 " + consumer.getAutoTicketCount() + "를 구매했습니다."); for (LottoTicket lottoTicket : consumer.getLottoTickets()) { System.out.println(lottoTicket.get()); From a9139577283030a7143af2d9f9377268fa3620d7 Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 15 Jul 2024 14:38:53 +0900 Subject: [PATCH 21/23] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/dto/LottoPurchaseDto.java | 1 + .../java/lotto/domain/LottoConsumerTest.java | 46 ++++++------------- .../java/lotto/domain/LottoPrizeTest.java | 25 ++++++++++ .../java/lotto/service/LottoServiceTest.java | 21 ++++++--- 4 files changed, 55 insertions(+), 38 deletions(-) create mode 100644 src/test/java/lotto/domain/LottoPrizeTest.java diff --git a/src/main/java/lotto/dto/LottoPurchaseDto.java b/src/main/java/lotto/dto/LottoPurchaseDto.java index adcde09c7dd..a2f1ad6243e 100644 --- a/src/main/java/lotto/dto/LottoPurchaseDto.java +++ b/src/main/java/lotto/dto/LottoPurchaseDto.java @@ -12,6 +12,7 @@ public class LottoPurchaseDto { public LottoPurchaseDto(int money, List lottoNumbers) { this.money = money; this.lottoNumbers = new ArrayList<>(); + if (lottoNumbers != null) { this.lottoNumbers.addAll(lottoNumbers); } diff --git a/src/test/java/lotto/domain/LottoConsumerTest.java b/src/test/java/lotto/domain/LottoConsumerTest.java index 62294bb3e23..808c8ff85d9 100644 --- a/src/test/java/lotto/domain/LottoConsumerTest.java +++ b/src/test/java/lotto/domain/LottoConsumerTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -10,54 +10,36 @@ class LottoConsumerTest { @Test - @DisplayName("전달받은_금액으로_살_수_있는_로또의_개수를_반환합니다") - void 전달받은_금액으로_살_수_있는_로또의_개수를_반환합니다() { + @DisplayName("자동_로또_티켓을_추가합니다") + void 자동_로또_티켓을_추가합니다() { // given - int money = 2000; - LottoTicketGenerator generator = new LottoTicketGenerator(); + LottoTicket lottoTicket1 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + LottoTicket lottoTicket2 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + List lottoTickets = Arrays.asList(lottoTicket1, lottoTicket2); + LottoConsumer consumer = new LottoConsumer(); // when - consumer.buyLotto(money, generator); - List LottoTickets = consumer.getLottoTickets(); + consumer.addAutoLottoTickets(lottoTickets); // then - assertThat(LottoTickets).hasSize(2); + assertThat(consumer.getAutoTicketCount()).isEqualTo(2); } @Test @DisplayName("수동_로또_티켓을_구매_합니다") void 수동_로또_티켓을_구매_합니다() { // given - String[] lottoNumber_1 = {"1", "2", "3", "4", "5", "6"}; - String[] lottoNumber_2 = {"1", "2", "3", "4", "5", "6"}; - - List LottoTickets = new ArrayList<>(); - LottoTickets.add(lottoNumber_1); - LottoTickets.add(lottoNumber_2); - - LottoConsumer consumer = new LottoConsumer(); - LottoTicketGenerator generator = new LottoTicketGenerator(); - - // when - consumer.buyManualLotto(LottoTickets, generator); + LottoTicket lottoTicket1 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + LottoTicket lottoTicket2 = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + List lottoTickets = Arrays.asList(lottoTicket1, lottoTicket2); - // then - assertThat(consumer.getManualLottoTicketCount()).isEqualTo(2); - } - - @Test - @DisplayName("자동_로또_티켓_수를_반환_합니다") - void 자동_로또_티켓_수를_반환_합니다() { - // given - int money = 3000; - LottoTicketGenerator generator = new LottoTicketGenerator(); LottoConsumer consumer = new LottoConsumer(); // when - consumer.buyLotto(money, generator); + consumer.addManualLottoTickets(lottoTickets); // then - assertThat(consumer.getAutoLottoTicketCount()).isEqualTo(3); + assertThat(consumer.getManualTicketCount()).isEqualTo(2); } } diff --git a/src/test/java/lotto/domain/LottoPrizeTest.java b/src/test/java/lotto/domain/LottoPrizeTest.java new file mode 100644 index 00000000000..30299afc248 --- /dev/null +++ b/src/test/java/lotto/domain/LottoPrizeTest.java @@ -0,0 +1,25 @@ +package lotto.domain; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +import java.util.Arrays; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class LottoPrizeTest { + + @Test + @DisplayName("이등_당첨을_확인합니다") + void 이등_당첨을_확인합니다() { + // given + LottoTicket purchasedLottoTicket = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 6)); + LottoTicket winningLottoTicket = new LottoTicket(Arrays.asList(1, 2, 3, 4, 5, 10)); + int bonusNumber = 10; + + // when + LottoPrize result = purchasedLottoTicket.win(winningLottoTicket, bonusNumber); + + // then + assertThat(result.getMatches()).isEqualTo(5); + } +} diff --git a/src/test/java/lotto/service/LottoServiceTest.java b/src/test/java/lotto/service/LottoServiceTest.java index c675322967f..661597e5d2c 100644 --- a/src/test/java/lotto/service/LottoServiceTest.java +++ b/src/test/java/lotto/service/LottoServiceTest.java @@ -10,6 +10,9 @@ import lotto.domain.LottoPrize; import lotto.domain.LottoTicket; import lotto.domain.LottoTicketGenerator; +import lotto.domain.purchaseStrategy.AutoStrategy; +import lotto.domain.purchaseStrategy.ManualStrategy; +import lotto.dto.LottoPurchaseDto; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -25,9 +28,11 @@ class LottoServiceTest { LottoCalculator calculator = new LottoCalculator(); LottoTicketGenerator generator = new LottoTicketGenerator(); LottoService lottoService = new LottoService(calculator, generator); + LottoPurchaseDto purchaseDto = new LottoPurchaseDto(money, null); + lottoService.setPurchaseStrategy(new AutoStrategy()); // when - lottoService.buyLotto(consumer, money); + lottoService.buyLottoTicket(consumer, purchaseDto); // then assertThat(consumer.getLottoTickets() @@ -38,20 +43,24 @@ class LottoServiceTest { @DisplayName("수동_로또_티켓을_구매합니다") void 수동_로또_티켓을_구매합니다() { // given - String[] lottoNumber_1 = {"1", "2", "3", "4", "5", "6"}; - String[] lottoNumber_2 = {"1", "2", "3", "4", "5", "6"}; + int money = 2_000; + + String[] lottoNumber1 = {"1", "2", "3", "4", "5", "6"}; + String[] lottoNumber2 = {"1", "2", "3", "4", "5", "6"}; List LottoTickets = new ArrayList<>(); - LottoTickets.add(lottoNumber_1); - LottoTickets.add(lottoNumber_2); + LottoTickets.add(lottoNumber1); + LottoTickets.add(lottoNumber2); LottoConsumer consumer = new LottoConsumer(); LottoCalculator calculator = new LottoCalculator(); LottoTicketGenerator generator = new LottoTicketGenerator(); LottoService lottoService = new LottoService(calculator, generator); + LottoPurchaseDto purchaseDto = new LottoPurchaseDto(money, LottoTickets); + lottoService.setPurchaseStrategy(new ManualStrategy()); // when - lottoService.buyManualLotto(consumer, LottoTickets); + lottoService.buyLottoTicket(consumer, purchaseDto); // then assertThat(consumer.getLottoTickets() From 6d38f29be97cf97caf885bc44e7174686d2b498a Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 15 Jul 2024 15:09:07 +0900 Subject: [PATCH 22/23] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/lotto/domain/LottoCalculatorTest.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/test/java/lotto/domain/LottoCalculatorTest.java b/src/test/java/lotto/domain/LottoCalculatorTest.java index 5bb7c04856d..4ee55b01778 100644 --- a/src/test/java/lotto/domain/LottoCalculatorTest.java +++ b/src/test/java/lotto/domain/LottoCalculatorTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import java.util.ArrayList; import java.util.List; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -13,10 +12,7 @@ class LottoCalculatorTest { @DisplayName("로또_티켓의_당첨_결과를_반환합니다") void 로또_티켓의_당첨_결과를_반환합니다() { // given - List result = new ArrayList<>(); - result.add(LottoPrize.THREE_MATCHES); - result.add(LottoPrize.THREE_MATCHES); - result.add(LottoPrize.FIVE_MATCHES); + List result = List.of(LottoPrize.THREE_MATCHES, LottoPrize.THREE_MATCHES, LottoPrize.FIVE_MATCHES); // when LottoCalculator calculator = new LottoCalculator(); @@ -30,9 +26,7 @@ class LottoCalculatorTest { @DisplayName("당첨금을_계산하여_반환합니다") void 당첨금을_계산하여_반환합니다() { // given - List result = new ArrayList<>(); - result.add(LottoPrize.THREE_MATCHES); - result.add(LottoPrize.FOUR_MATCHES); + List result = List.of(LottoPrize.THREE_MATCHES, LottoPrize.FOUR_MATCHES); // when LottoCalculator calculator = new LottoCalculator(); From 032c611df00dd55f00a4ffb11ce87b9b30bffd4d Mon Sep 17 00:00:00 2001 From: SangHoon Date: Mon, 15 Jul 2024 15:20:21 +0900 Subject: [PATCH 23/23] =?UTF-8?q?refactor:=20javadoc=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/service/LottoService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/lotto/service/LottoService.java b/src/main/java/lotto/service/LottoService.java index 7ee635b7e2b..25b59723198 100644 --- a/src/main/java/lotto/service/LottoService.java +++ b/src/main/java/lotto/service/LottoService.java @@ -30,6 +30,8 @@ public LottoService(LottoCalculator calculator, LottoTicketGenerator generator) /** * 구매 전략 세팅 + * + * @param strategy 구매 전략 (방법) */ public void setPurchaseStrategy(PurchaseStrategy strategy) { this.strategy = strategy;