From 849e2fedfb81cf85b6fa308a331829766bf38c11 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 02:24:03 +0900 Subject: [PATCH 01/59] =?UTF-8?q?RaceLotto=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EC=97=90=20=EA=B8=88=EC=95=A1=20=EC=9E=85=EB=A0=A5=E2=86=92?= =?UTF-8?q?=EB=B2=88=ED=98=B8=20=EC=83=9D=EC=84=B1=E2=86=92=EB=8B=B9?= =?UTF-8?q?=EC=B2=A8=EB=B2=88=ED=98=B8=E2=86=92=ED=86=B5=EA=B3=84=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=EA=B9=8C=EC=A7=80=20=EC=8B=A4=ED=96=89=20?= =?UTF-8?q?=ED=9D=90=EB=A6=84=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/controller/RaceLotto.java | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/controller/RaceLotto.java diff --git a/src/main/java/controller/RaceLotto.java b/src/main/java/controller/RaceLotto.java new file mode 100644 index 000000000..b2d95e396 --- /dev/null +++ b/src/main/java/controller/RaceLotto.java @@ -0,0 +1,31 @@ +package controller; + +import inputView.OutputView; +import inputView.Price; +import model.LottoNumbers; +import model.LottoNumbersRepository; + +public class RaceLotto { + private final RaceLottoMethod race = new RaceLottoMethod(); + private final OutputView outView = new OutputView(); + + public void race() { + // 1. 구입 금액 입력 + Price price = race.readPrice(); + outView.printPriceValue(price.getValue()); + System.out.println(); + outView.printBuyCount(price.howManyLottos()); + + // 2. 로또 번호 생성 + LottoNumbersRepository repository = race.createLottos(price.howManyLottos()); + outView.printLottos(repository.readLottoNumbersRepository()); + System.out.println(); + + // 3. 당첨 번호 입력 + LottoNumbers lastLotto = race.createLastLotto(); + System.out.println(); + + // // 4. 통계 출력 + race.createLotteryStatistics(repository.readLottoNumbersRepository(), lastLotto.getNumbers(), price.getValue()); + } +} From 84ad2df00368f08529f9a4843466b3346bacf6f6 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 02:26:14 +0900 Subject: [PATCH 02/59] =?UTF-8?q?RaceLottoMethod=EC=97=90=20=EB=A1=9C?= =?UTF-8?q?=EB=98=90=20=EA=B2=8C=EC=9E=84=20=ED=95=B5=EC=8B=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81(=EC=9E=85=EB=A0=A5=C2=B7=EC=83=9D=EC=84=B1=C2=B7?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=C2=B7=ED=86=B5=EA=B3=84)=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/RaceLottoMethod.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 src/main/java/controller/RaceLottoMethod.java diff --git a/src/main/java/controller/RaceLottoMethod.java b/src/main/java/controller/RaceLottoMethod.java new file mode 100644 index 000000000..887c6fe8e --- /dev/null +++ b/src/main/java/controller/RaceLottoMethod.java @@ -0,0 +1,92 @@ +package controller; + +import inputView.InputView; +import inputView.OutputView; +import inputView.Price; +import model.LottoNumber; +import model.LottoNumbers; +import model.LottoNumbersRepository; +import util.LottoNumberGenerator; +import util.RandomLottoNumberGenerator; + +import java.util.ArrayList; +import java.util.List; + +public class RaceLottoMethod { + private final InputView inputView = new InputView(); + private final OutputView outView = new OutputView(); + + public Price readPrice() { + outView.printInputPrice(); + while (true) { + Price price = readPriceException(); + if (price != null) { + return price; + } + } + } + + private Price readPriceException() { + try { + return new Price(Integer.parseInt(inputView.inputPrice())); + } catch (NumberFormatException input) { + outView.printInvalidNumber(); + } catch (IllegalArgumentException input) { + outView.printInvalidPrice(); + } + return null; + } + + private LottoNumbers createOneLotto() { + LottoNumberGenerator generator = new RandomLottoNumberGenerator(); + LottoNumbers lottonumbers = generator.generate(); + return lottonumbers; + } + + public LottoNumbersRepository createLottos(int count) { + LottoNumbersRepository repository = new LottoNumbersRepository(); + for (int i = 0; i < count; i++) { + repository.addLottoNumbers(createOneLotto().sortNumbers()); + } + return repository; + } + + public LottoNumbers createLastLotto() { + outView.printInputLastLotto(); + List numbers = new ArrayList<>(); + String[] lastNumbers = inputView.inputLastLotto().split(","); + for (int i = 0; i < lastNumbers.length; i++) { + lastNumbers[i] = lastNumbers[i].trim(); + numbers.add(new LottoNumber(Integer.parseInt(lastNumbers[i]))); + } + return new LottoNumbers(numbers); + } + + public void createLotteryStatistics(List lottos, List lastLotto, int price) { + int[] matchCount = {0, 0, 0, 0, 0, 0}; + for (LottoNumbers lotto : lottos) { + matchCount[matchLottoNumber(lotto.getNumbers(), lastLotto)]++; + } + String three = String.valueOf(matchCount[2]); + String four = String.valueOf(matchCount[3]); + String five = String.valueOf(matchCount[4]); + String six = String.valueOf(matchCount[5]); + double prizeMoney = (matchCount[2] * 5000 + matchCount[3] * 50000 + + matchCount[4] * 150000 + matchCount[5] * 2000000000) / (double) price; + String formatted = String.format("%.2f", prizeMoney); + outView.printLotteryStatistics(three, four, five, six, formatted); + } + + private int matchLottoNumber(List lotto, List lastLotto) { + List lastNumbers = lastLotto.stream() + .map(LottoNumber::getNumber) + .toList(); + int count = 0; + for (LottoNumber number : lotto) { + if (lastNumbers.contains(number.getNumber())) { + count++; + } + } + return count; + } +} From cf566ce00d9441fddefdef9c6c079e92b9b28e9a Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 02:27:32 +0900 Subject: [PATCH 03/59] =?UTF-8?q?InputView=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20(=EA=B5=AC=EC=9E=85=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=C2=B7=EB=8B=B9=EC=B2=A8=20=EB=B2=88=ED=98=B8=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/inputView/InputView.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 src/main/java/inputView/InputView.java diff --git a/src/main/java/inputView/InputView.java b/src/main/java/inputView/InputView.java new file mode 100644 index 000000000..ca5ea72ba --- /dev/null +++ b/src/main/java/inputView/InputView.java @@ -0,0 +1,15 @@ +package inputView; + +import java.util.Scanner; + +public class InputView { + private static final Scanner scanner = new Scanner(System.in); + + public String inputPrice() { + return scanner.nextLine(); + } + + public String inputLastLotto() { + return scanner.nextLine(); + } +} From 84fe5a6cdb55410494f2d79882f85be8f2fa877b Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 02:28:14 +0900 Subject: [PATCH 04/59] =?UTF-8?q?OutputView=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84=20(=EA=B5=AC=EC=9E=85=20=EA=B8=88?= =?UTF-8?q?=EC=95=A1=C2=B7=EB=A1=9C=EB=98=90=C2=B7=ED=86=B5=EA=B3=84=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/inputView/OutputView.java | 47 +++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/main/java/inputView/OutputView.java diff --git a/src/main/java/inputView/OutputView.java b/src/main/java/inputView/OutputView.java new file mode 100644 index 000000000..78d4e4290 --- /dev/null +++ b/src/main/java/inputView/OutputView.java @@ -0,0 +1,47 @@ +package inputView; + +import model.LottoNumbers; + +import java.util.List; + +public class OutputView { + public void printInputPrice() { + System.out.print("구입 금액을 입력해 주세요: "); + } + + public void printInvalidNumber() { + System.out.println("숫자만 입력해 주세요"); + } + + public void printInvalidPrice() { + System.out.println("0원 이상을 입력해 주세요"); + } + + public void printPriceValue(int price) { + System.out.println(price); + } + + public void printBuyCount(int count) { + System.out.println(count + "개를 구매했습니다."); + } + + public void printInputLastLotto() { + System.out.println("지난 주 당첨 번호를 입력해 주세요."); + } + + public void printLottos(List lottos) { + for (LottoNumbers lotto : lottos) { + System.out.println(lotto.getNumbers()); + } + } + + public void printLotteryStatistics(String three, String four, String five, String six, String amount) { + System.out.println("당첨 통계"); + System.out.println("---------"); + System.out.println("3개 일치 (5000원)- " + three + "개"); + System.out.println("4개 일치 (50000원)- " + four + "개"); + System.out.println("5개 일치 (150000원)- " + five + "개"); + System.out.println("6개 일치 (2000000000원)- " + six + "개"); + System.out.println("총 수익률은 " + amount + "입니다."); + } +} From ee9214d3a4b711fa2025072129f4e40d54e66086 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 02:28:53 +0900 Subject: [PATCH 05/59] =?UTF-8?q?=EA=B5=AC=EC=9E=85=20=EA=B8=88=EC=95=A1?= =?UTF-8?q?=EC=9D=84=20=ED=8F=AC=EC=9E=A5=ED=95=98=EB=8A=94=20Price=20?= =?UTF-8?q?=EA=B0=92=20=EA=B0=9D=EC=B2=B4=20=EA=B5=AC=ED=98=84=20(?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=C2=B7=EB=A1=9C=EB=98=90=20=EA=B0=9C=EC=88=98?= =?UTF-8?q?=20=EA=B3=84=EC=82=B0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/inputView/Price.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/inputView/Price.java diff --git a/src/main/java/inputView/Price.java b/src/main/java/inputView/Price.java new file mode 100644 index 000000000..40a8f4466 --- /dev/null +++ b/src/main/java/inputView/Price.java @@ -0,0 +1,24 @@ +package inputView; + +public class Price { + private final int value; + + public Price(int value) { + checkNegative(value); + this.value = value; + } + + private static void checkNegative(int value) { + if (value < 0) { + throw new IllegalArgumentException("구입 금액은 0원 이상입니다."); + } + } + + public int getValue() { + return value; + } + + public int howManyLottos() { + return value / 1000; + } +} From b0320e91da8b65a2e905953983df0be3acb5f29a Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 02:30:30 +0900 Subject: [PATCH 06/59] =?UTF-8?q?LottoNumber=EB=A5=BC=20=EC=9B=90=EC=8B=9C?= =?UTF-8?q?=EA=B0=92=20=ED=8F=AC=EC=9E=A5=20=EA=B0=9D=EC=B2=B4=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(1~45=20=EB=B2=94=EC=9C=84=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=ED=8F=AC=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoNumber.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/model/LottoNumber.java diff --git a/src/main/java/model/LottoNumber.java b/src/main/java/model/LottoNumber.java new file mode 100644 index 000000000..00ad7cf9b --- /dev/null +++ b/src/main/java/model/LottoNumber.java @@ -0,0 +1,25 @@ +package model; + +public class LottoNumber { + private final int number; + + public LottoNumber(int number) { + checkRange(number); + this.number = number; + } + + private void checkRange(int number) { + if (number < 1 || number > 45) { + throw new IllegalArgumentException("로또 번호는 1~45 사이여야 합니다"); + } + } + + public int getNumber() { + return number; + } + + @Override + public String toString() { + return String.valueOf(number); + } +} From caad7b42eebdf262f9316bb1f8136edd3168ee46 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 02:31:27 +0900 Subject: [PATCH 07/59] =?UTF-8?q?LottoNumbers=EB=A5=BC=20=EC=9D=BC?= =?UTF-8?q?=EA=B8=89=20=EC=BB=AC=EB=A0=89=EC=85=98=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20(6=EA=B0=9C=20=EA=B2=80=EC=A6=9D=C2=B7?= =?UTF-8?q?=EC=A0=95=EB=A0=AC=20=EA=B8=B0=EB=8A=A5=20=ED=8F=AC=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoNumbers.java | 31 +++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/model/LottoNumbers.java diff --git a/src/main/java/model/LottoNumbers.java b/src/main/java/model/LottoNumbers.java new file mode 100644 index 000000000..49767654c --- /dev/null +++ b/src/main/java/model/LottoNumbers.java @@ -0,0 +1,31 @@ +package model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class LottoNumbers { + private final List numbers; + + public LottoNumbers(List numbers) { + checkSize(numbers); + this.numbers = List.copyOf(numbers); + } + + private void checkSize(List numbers) { + if (numbers.size() != 6) { + throw new IllegalArgumentException("로또 번호가 6개가 아닙니다"); + } + } + + public LottoNumbers sortNumbers() { + List sortNumber = new ArrayList<>(numbers); + Collections.sort(sortNumber, Comparator.comparingInt(LottoNumber::getNumber)); + return new LottoNumbers(sortNumber); + } + + public List getNumbers() { + return Collections.unmodifiableList(numbers); + } +} From 3625fd2f5478c012182460b238bf7c2d4e2b152f Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 02:32:35 +0900 Subject: [PATCH 08/59] =?UTF-8?q?=EC=97=AC=EB=9F=AC=20LottoNumbers?= =?UTF-8?q?=EB=A5=BC=20=EB=B3=B4=EA=B4=80=C2=B7=EC=A1=B0=ED=9A=8C=ED=95=98?= =?UTF-8?q?=EB=8A=94=20LottoNumbersRepository=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoNumbersRepository.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/model/LottoNumbersRepository.java diff --git a/src/main/java/model/LottoNumbersRepository.java b/src/main/java/model/LottoNumbersRepository.java new file mode 100644 index 000000000..8757fcb77 --- /dev/null +++ b/src/main/java/model/LottoNumbersRepository.java @@ -0,0 +1,17 @@ +package model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class LottoNumbersRepository { + private final List repository = new ArrayList<>(); + + public void addLottoNumbers(LottoNumbers lottoNumbers) { + repository.add(lottoNumbers); + } + + public List readLottoNumbersRepository() { + return Collections.unmodifiableList(repository); + } +} From 3c52ba5c1222dedc1701624395580a8dcbecba1a Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 02:33:51 +0900 Subject: [PATCH 09/59] =?UTF-8?q?=EC=9E=90=EB=8F=99=20=EB=A1=9C=EB=98=90?= =?UTF-8?q?=20=EB=B2=88=ED=98=B8=20=EC=83=9D=EC=84=B1=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/util/LottoNumberGenerator.java | 7 +++++ .../java/util/RandomLottoNumberGenerator.java | 26 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/main/java/util/LottoNumberGenerator.java create mode 100644 src/main/java/util/RandomLottoNumberGenerator.java diff --git a/src/main/java/util/LottoNumberGenerator.java b/src/main/java/util/LottoNumberGenerator.java new file mode 100644 index 000000000..3fbe3ca20 --- /dev/null +++ b/src/main/java/util/LottoNumberGenerator.java @@ -0,0 +1,7 @@ +package util; + +import model.LottoNumbers; + +public interface LottoNumberGenerator { + LottoNumbers generate(); +} diff --git a/src/main/java/util/RandomLottoNumberGenerator.java b/src/main/java/util/RandomLottoNumberGenerator.java new file mode 100644 index 000000000..dc56f3307 --- /dev/null +++ b/src/main/java/util/RandomLottoNumberGenerator.java @@ -0,0 +1,26 @@ +package util; + +import model.LottoNumber; +import model.LottoNumbers; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class RandomLottoNumberGenerator implements LottoNumberGenerator { + + @Override + public LottoNumbers generate() { + List numbers = createLottoNumbers(); + Collections.shuffle(numbers); + return new LottoNumbers(numbers.subList(0, 6)); + } + + public List createLottoNumbers() { + List numbers = new ArrayList<>(); + for (int i = 1; i < 46; i++) { + numbers.add(new LottoNumber(i)); + } + return numbers; + } +} From 52569901adddf469a27ac26fb0d25f9cb6b11fa7 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 02:34:25 +0900 Subject: [PATCH 10/59] =?UTF-8?q?=20Main=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=E2=80=93=20RaceLotto=20=EC=8B=A4=ED=96=89?= =?UTF-8?q?=20=EC=97=94=ED=8A=B8=EB=A6=AC=20=ED=8F=AC=EC=9D=B8=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/Main.java diff --git a/src/main/java/Main.java b/src/main/java/Main.java new file mode 100644 index 000000000..07a0dfebb --- /dev/null +++ b/src/main/java/Main.java @@ -0,0 +1,8 @@ +import controller.RaceLotto; + +public class Main { + public static void main(String[] args) { + RaceLotto controller = new RaceLotto(); + controller.race(); + } +} From 6eaeb8ffeb4e6d64315d3ce0b494fcb1b8644ca1 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 03:10:23 +0900 Subject: [PATCH 11/59] =?UTF-8?q?test:=20Price=20=EA=B0=92=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=83=9D=EC=84=B1=C2=B7=EC=98=88=EC=99=B8=C2=B7?= =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EA=B0=9C=EC=88=98=20=EA=B3=84=EC=82=B0=20?= =?UTF-8?q?=EB=8B=A8=EC=9C=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/inputView/PriceTest.java | 46 ++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/test/java/inputView/PriceTest.java diff --git a/src/test/java/inputView/PriceTest.java b/src/test/java/inputView/PriceTest.java new file mode 100644 index 000000000..ca950f7f6 --- /dev/null +++ b/src/test/java/inputView/PriceTest.java @@ -0,0 +1,46 @@ +package inputView; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class PriceTest { + + @Test + void 올바른_금액이면_Price_객체가_생성된다() { + // given + int value = 1000; + + // when + Price price = new Price(value); + + // then + assertThat(price.getValue()).isEqualTo(1000); + } + + @Test + void _0원_미만이면_예외가_발생한다() { + // given + int negativeValue = -1; + + // when & then + IllegalArgumentException exception = assertThrows( + IllegalArgumentException.class, + () -> new Price(negativeValue) + ); + assertThat(exception.getMessage()).contains("구입 금액은 0원 이상"); + } + + @Test + void 천원_단위로_로또_개수를_계산한다() { + // given + Price price = new Price(6000); + + // when + int count = price.howManyLottos(); + + // then + assertThat(count).isEqualTo(6); + } +} From 35d5b27ef60606933b7bdd23cb499e984c850fa8 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 03:11:04 +0900 Subject: [PATCH 12/59] =?UTF-8?q?test:=20LottoNumbersRepository=EC=97=90?= =?UTF-8?q?=20=EB=A1=9C=EB=98=90=EB=B2=88=ED=98=B8=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EB=B0=8F=20=EB=B6=88=EB=B3=80=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=20=EB=8B=A8=EC=9C=84=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/LottoNumbersRepositoryTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/test/java/model/LottoNumbersRepositoryTest.java diff --git a/src/test/java/model/LottoNumbersRepositoryTest.java b/src/test/java/model/LottoNumbersRepositoryTest.java new file mode 100644 index 000000000..2cae0071c --- /dev/null +++ b/src/test/java/model/LottoNumbersRepositoryTest.java @@ -0,0 +1,43 @@ +package model; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class LottoNumbersRepositoryTest { + + @Test + void 저장소에_로또번호를_추가하면_읽을때_사이즈가_증가한다() { + // given + LottoNumbersRepository repository = new LottoNumbersRepository(); + LottoNumbers lottoNumbers = new LottoNumbers(Arrays.asList( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6))); + + // when + repository.addLottoNumbers(lottoNumbers); + + // then + assertEquals(1, repository.readLottoNumbersRepository().size()); + } + + @Test + void 반환된_리스트는_불변리스트이다() { + // given + LottoNumbersRepository repository = new LottoNumbersRepository(); + LottoNumbers lottoNumbers = new LottoNumbers(Arrays.asList( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6))); + repository.addLottoNumbers(lottoNumbers); + + // when + List list = repository.readLottoNumbersRepository(); + + // then + assertThrows(UnsupportedOperationException.class, + () -> list.add(lottoNumbers)); + } +} From 1925a09c504dae397af56b2aae93a0d3844a8c38 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 03:12:05 +0900 Subject: [PATCH 13/59] =?UTF-8?q?test:=20LottoNumbers=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=C2=B7=EC=98=88=EC=99=B8=C2=B7=EB=B6=88=EB=B3=80=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=C2=B7=EC=A0=95=EB=A0=AC=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EB=8B=A8=EC=9C=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/LottoNumbersTest.java | 57 +++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/test/java/model/LottoNumbersTest.java diff --git a/src/test/java/model/LottoNumbersTest.java b/src/test/java/model/LottoNumbersTest.java new file mode 100644 index 000000000..4d5e6c280 --- /dev/null +++ b/src/test/java/model/LottoNumbersTest.java @@ -0,0 +1,57 @@ +package model; + +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class LottoNumbersTest { + + @Test + void 로또번호가_6개면_정상적으로_생성된다() { + List numbers = Arrays.asList( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6)); + + LottoNumbers lottoNumbers = new LottoNumbers(numbers); + + assertEquals(6, lottoNumbers.getNumbers().size()); + } + + @Test + void 로또번호가_6개가_아니면_예외가_발생한다() { + List numbers = Arrays.asList( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4)); + + assertThrows(IllegalArgumentException.class, + () -> new LottoNumbers(numbers)); + } + + @Test + void getNumbers_반환값은_불변리스트이다() { + List numbers = Arrays.asList( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6)); + + LottoNumbers lottoNumbers = new LottoNumbers(numbers); + + assertThrows(UnsupportedOperationException.class, + () -> lottoNumbers.getNumbers().add(new LottoNumber(7))); + } + + @Test + void sortNumbers는_번호를_오름차순으로_정렬한다() { + List numbers = Arrays.asList( + new LottoNumber(6), new LottoNumber(3), new LottoNumber(5), + new LottoNumber(1), new LottoNumber(4), new LottoNumber(2) + ); + + LottoNumbers sorted = new LottoNumbers(numbers).sortNumbers(); + + assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6), + sorted.getNumbers().stream().map(LottoNumber::getNumber).toList()); + } +} From 59a8dbdb45275601f5f2cf57d4b35c6b500ae337 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 03:12:39 +0900 Subject: [PATCH 14/59] =?UTF-8?q?test:=20LottoNumber=20=EC=9C=A0=ED=9A=A8?= =?UTF-8?q?=EC=84=B1=20=EB=B0=8F=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=20=EB=8B=A8=EC=9C=84=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/LottoNumberTest.java | 33 ++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/test/java/model/LottoNumberTest.java diff --git a/src/test/java/model/LottoNumberTest.java b/src/test/java/model/LottoNumberTest.java new file mode 100644 index 000000000..32c1f1012 --- /dev/null +++ b/src/test/java/model/LottoNumberTest.java @@ -0,0 +1,33 @@ +package model; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class LottoNumberTest { + + @Test + void 유효한_번호면_LottoNumber_객체가_생성된다() { + // given + int validNumber = 20; + + // when + LottoNumber lottoNumber = new LottoNumber(validNumber); + + // then + assertThat(lottoNumber.getNumber()).isEqualTo(20); + assertThat(lottoNumber.toString()).isEqualTo("20"); + } + + @Test + void _1보다_작거나_45보다_크면_예외가_발생한다() { + // given + int invalidMin = 0; + int invalidMax = 46; + + // when & then + assertThrows(IllegalArgumentException.class, () -> new LottoNumber(invalidMin)); + assertThrows(IllegalArgumentException.class, () -> new LottoNumber(invalidMax)); + } +} From 3960e782e1cdc27dc5936c9acbb6f55578433d9d Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 03:13:13 +0900 Subject: [PATCH 15/59] =?UTF-8?q?test:=20RandomLottoNumberGenerator?= =?UTF-8?q?=EA=B0=80=20=ED=95=AD=EC=83=81=206=EA=B0=9C=EC=9D=98=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EB=A5=BC=20=EC=83=9D=EC=84=B1=ED=95=98?= =?UTF-8?q?=EB=8A=94=EC=A7=80=20=EB=8B=A8=EC=9C=84=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../util/RandomLottoNumberGeneratorTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/util/RandomLottoNumberGeneratorTest.java diff --git a/src/test/java/util/RandomLottoNumberGeneratorTest.java b/src/test/java/util/RandomLottoNumberGeneratorTest.java new file mode 100644 index 000000000..f721b4391 --- /dev/null +++ b/src/test/java/util/RandomLottoNumberGeneratorTest.java @@ -0,0 +1,16 @@ +package util; + +import model.LottoNumbers; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class RandomLottoNumberGeneratorTest { + + @Test + void 랜덤생성기는_항상_6개의_번호를_만든다() { + RandomLottoNumberGenerator generator = new RandomLottoNumberGenerator(); + LottoNumbers lottoNumbers = generator.generate(); + assertEquals(6, lottoNumbers.getNumbers().size()); + } +} From 8f7803702fa9c68516d9a2c38605cfed9bafbee5 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 25 Sep 2025 03:24:48 +0900 Subject: [PATCH 16/59] =?UTF-8?q?README=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/README.md | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/README.md diff --git a/src/README.md b/src/README.md new file mode 100644 index 000000000..983bf1262 --- /dev/null +++ b/src/README.md @@ -0,0 +1,58 @@ +# 로또 미션 + +## 클래스 구성 + +### controller + +- **RaceLotto** + 로또 게임 전체 실행 흐름 관리 (금액 입력 → 로또 번호 생성 → 당첨 번호 입력 → 통계 출력) +- **RaceLottoMethod** + 구입 금액 검증·로또 번호 생성·당첨 번호 입력·통계 산출 등 비즈니스 로직 수행 + +### inputView (View) + +- **InputView** + 구입 금액과 지난 주 당첨 번호 입력 받기 +- **OutputView** + 금액 안내, 구매 수량, 로또 번호, 당첨 통계 출력 +- **Price** + 구입 금액을 값 객체로 포장 (0원 이상 검증, 로또 구매 개수 계산) + +### model (Domain) + +- **LottoNumber** + 1~45 사이 번호 하나를 원시값 포장 (범위 검증) +- **LottoNumbers** + LottoNumber 6개를 모은 일급 컬렉션 (6개 검증, 정렬, 불변 리스트) +- **LottoNumbersRepository** + 여러 장의 LottoNumbers를 저장·조회하는 저장소 (읽기 전용 리스트 반환) + +### util (Utility / Strategy) + +- **LottoNumberGenerator (interface)** + 로또 번호 생성 전략 인터페이스 +- **RandomLottoNumberGenerator (implementation)** + 1~45 번호를 섞어 6개를 랜덤으로 생성하는 기본 구현체 + +### Main + +- **Main** + 프로그램 엔트리 포인트 + +### test (JUnit5 단위 테스트) + +- **PriceTest** — 값 객체 생성·예외·로또 개수 계산 테스트 +- **LottoNumberTest** — 원시값 포장(범위 검증) 테스트 +- **LottoNumbersTest** — 일급 컬렉션 생성·예외·불변 리스트·정렬 기능 테스트 +- **LottoNumbersRepositoryTest** — 저장소 추가·조회·불변 리스트 테스트 +- **RandomLottoNumberGeneratorTest** — 랜덤 생성기가 6개 번호를 반환하는지 테스트 + +## 기능 요구사항 + +- 로또 당첨 번호를 받아 일치한 번호 수에 따라 당첨 결과를 보여준다. + +## 프로그래밍 요구사항 + +- 모든 원시 값과 문자열을 포장한다. +- 일급 컬렉션을 쓴다. + From bf9eb51ef0b2ad187c085e4f6c522b76499904d4 Mon Sep 17 00:00:00 2001 From: taewoo Date: Sun, 28 Sep 2025 01:10:13 +0900 Subject: [PATCH 17/59] =?UTF-8?q?Controller=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=AA=85=20RaceLotto=20=E2=86=92=20AutoLotooController?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 4 ++-- .../controller/{RaceLotto.java => AutoLottoController.java} | 4 ++-- .../{RaceLottoMethod.java => AutoLottoControllerMethod.java} | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/controller/{RaceLotto.java => AutoLottoController.java} (88%) rename src/main/java/controller/{RaceLottoMethod.java => AutoLottoControllerMethod.java} (98%) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 07a0dfebb..ec670a71c 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,8 +1,8 @@ -import controller.RaceLotto; +import controller.AutoLottoController; public class Main { public static void main(String[] args) { - RaceLotto controller = new RaceLotto(); + AutoLottoController controller = new AutoLottoController(); controller.race(); } } diff --git a/src/main/java/controller/RaceLotto.java b/src/main/java/controller/AutoLottoController.java similarity index 88% rename from src/main/java/controller/RaceLotto.java rename to src/main/java/controller/AutoLottoController.java index b2d95e396..49eb829c1 100644 --- a/src/main/java/controller/RaceLotto.java +++ b/src/main/java/controller/AutoLottoController.java @@ -5,8 +5,8 @@ import model.LottoNumbers; import model.LottoNumbersRepository; -public class RaceLotto { - private final RaceLottoMethod race = new RaceLottoMethod(); +public class AutoLottoController { + private final AutoLottoControllerMethod race = new AutoLottoControllerMethod(); private final OutputView outView = new OutputView(); public void race() { diff --git a/src/main/java/controller/RaceLottoMethod.java b/src/main/java/controller/AutoLottoControllerMethod.java similarity index 98% rename from src/main/java/controller/RaceLottoMethod.java rename to src/main/java/controller/AutoLottoControllerMethod.java index 887c6fe8e..92aedc3a2 100644 --- a/src/main/java/controller/RaceLottoMethod.java +++ b/src/main/java/controller/AutoLottoControllerMethod.java @@ -12,7 +12,7 @@ import java.util.ArrayList; import java.util.List; -public class RaceLottoMethod { +public class AutoLottoControllerMethod { private final InputView inputView = new InputView(); private final OutputView outView = new OutputView(); From 8a1ed8f4e310c489a069f2a06634dbd6b1c217dd Mon Sep 17 00:00:00 2001 From: taewoo Date: Mon, 29 Sep 2025 01:05:02 +0900 Subject: [PATCH 18/59] =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=AA=85=EC=9D=84=20validate=E2=80=A6=20=ED=8C=A8?= =?UTF-8?q?=ED=84=B4=EC=9C=BC=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoNumber.java | 4 ++-- src/main/java/model/LottoNumbers.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/model/LottoNumber.java b/src/main/java/model/LottoNumber.java index 00ad7cf9b..4cc33e8b0 100644 --- a/src/main/java/model/LottoNumber.java +++ b/src/main/java/model/LottoNumber.java @@ -4,11 +4,11 @@ public class LottoNumber { private final int number; public LottoNumber(int number) { - checkRange(number); + validateRange(number); this.number = number; } - private void checkRange(int number) { + private void validateRange(int number) { if (number < 1 || number > 45) { throw new IllegalArgumentException("로또 번호는 1~45 사이여야 합니다"); } diff --git a/src/main/java/model/LottoNumbers.java b/src/main/java/model/LottoNumbers.java index 49767654c..076941070 100644 --- a/src/main/java/model/LottoNumbers.java +++ b/src/main/java/model/LottoNumbers.java @@ -9,11 +9,11 @@ public class LottoNumbers { private final List numbers; public LottoNumbers(List numbers) { - checkSize(numbers); + validatesize(numbers); this.numbers = List.copyOf(numbers); } - private void checkSize(List numbers) { + private void validatesize(List numbers) { if (numbers.size() != 6) { throw new IllegalArgumentException("로또 번호가 6개가 아닙니다"); } From ea203ae23381c47cb2fc4d19a9de4df14636b594 Mon Sep 17 00:00:00 2001 From: taewoo Date: Mon, 29 Sep 2025 01:25:43 +0900 Subject: [PATCH 19/59] =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EC=9D=BC=EC=B9=98?= =?UTF-8?q?=20=EA=B2=B0=EA=B3=BC=20=EA=B3=84=EC=82=B0=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=AA=85=ED=99=95=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AutoLottoControllerMethod.java | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/src/main/java/controller/AutoLottoControllerMethod.java b/src/main/java/controller/AutoLottoControllerMethod.java index 92aedc3a2..0df4bf8f7 100644 --- a/src/main/java/controller/AutoLottoControllerMethod.java +++ b/src/main/java/controller/AutoLottoControllerMethod.java @@ -62,31 +62,25 @@ public LottoNumbers createLastLotto() { return new LottoNumbers(numbers); } - public void createLotteryStatistics(List lottos, List lastLotto, int price) { - int[] matchCount = {0, 0, 0, 0, 0, 0}; - for (LottoNumbers lotto : lottos) { - matchCount[matchLottoNumber(lotto.getNumbers(), lastLotto)]++; + public int[] countMatchResults(List allLotteries, List lastLotto) { + int[] matchCounts = {0, 0, 0, 0, 0, 0, 0}; + for (LottoNumbers oneLotto : allLotteries) { + matchCounts[matchLottoNumber(oneLotto.getNumbers(), lastLotto)]++; } - String three = String.valueOf(matchCount[2]); - String four = String.valueOf(matchCount[3]); - String five = String.valueOf(matchCount[4]); - String six = String.valueOf(matchCount[5]); - double prizeMoney = (matchCount[2] * 5000 + matchCount[3] * 50000 - + matchCount[4] * 150000 + matchCount[5] * 2000000000) / (double) price; - String formatted = String.format("%.2f", prizeMoney); - outView.printLotteryStatistics(three, four, five, six, formatted); + return matchCounts.clone(); + } - private int matchLottoNumber(List lotto, List lastLotto) { + private int matchLottoNumber(List oneLotto, List lastLotto) { List lastNumbers = lastLotto.stream() .map(LottoNumber::getNumber) .toList(); - int count = 0; - for (LottoNumber number : lotto) { + int matchCount = 0; + for (LottoNumber number : oneLotto) { if (lastNumbers.contains(number.getNumber())) { - count++; + matchCount++; } } - return count; + return matchCount; //일치하는 번호 개수 } } From 53e53c66212afc9fb08d9fac28a0854a7ec7bc35 Mon Sep 17 00:00:00 2001 From: taewoo Date: Mon, 29 Sep 2025 02:03:30 +0900 Subject: [PATCH 20/59] =?UTF-8?q?printLotteryStatistics=EA=B0=80=20matchCo?= =?UTF-8?q?unts=EC=99=80=20profitRate=EB=A5=BC=20=EB=B0=9B=EC=95=84=20?= =?UTF-8?q?=ED=86=B5=EA=B3=84=EC=99=80=20=EC=88=98=EC=9D=B5=EB=A5=A0?= =?UTF-8?q?=EC=9D=84=20=EC=B6=9C=EB=A0=A5=ED=95=98=EB=8F=84=EB=A1=9D=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 --- src/main/java/inputView/OutputView.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/inputView/OutputView.java b/src/main/java/inputView/OutputView.java index 78d4e4290..71c89c8a2 100644 --- a/src/main/java/inputView/OutputView.java +++ b/src/main/java/inputView/OutputView.java @@ -35,13 +35,13 @@ public void printLottos(List lottos) { } } - public void printLotteryStatistics(String three, String four, String five, String six, String amount) { + public void printLotteryStatistics(int[] matchCounts, String profitRate) { System.out.println("당첨 통계"); System.out.println("---------"); - System.out.println("3개 일치 (5000원)- " + three + "개"); - System.out.println("4개 일치 (50000원)- " + four + "개"); - System.out.println("5개 일치 (150000원)- " + five + "개"); - System.out.println("6개 일치 (2000000000원)- " + six + "개"); - System.out.println("총 수익률은 " + amount + "입니다."); + System.out.println("3개 일치 (5000원)- " + matchCounts[3] + "개"); + System.out.println("4개 일치 (50000원)- " + matchCounts[4] + "개"); + System.out.println("5개 일치 (150000원)- " + matchCounts[5] + "개"); + System.out.println("6개 일치 (2000000000원)- " + matchCounts[6] + "개"); + System.out.println("총 수익률은 " + profitRate + "입니다."); } } From c0d24e01b3de650b7ba64afb4f9a4b5560ea009a Mon Sep 17 00:00:00 2001 From: taewoo Date: Mon, 29 Sep 2025 02:04:33 +0900 Subject: [PATCH 21/59] =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EC=9D=BC=EC=B9=98?= =?UTF-8?q?=20=EA=B2=B0=EA=B3=BC/=EC=88=98=EC=9D=B5=EB=A5=A0=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B6=84=EB=A6=AC=20?= =?UTF-8?q?(countMatchResults,=20calculateProfitRate)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/AutoLottoControllerMethod.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/AutoLottoControllerMethod.java b/src/main/java/controller/AutoLottoControllerMethod.java index 0df4bf8f7..310270a21 100644 --- a/src/main/java/controller/AutoLottoControllerMethod.java +++ b/src/main/java/controller/AutoLottoControllerMethod.java @@ -68,7 +68,6 @@ public int[] countMatchResults(List allLotteries, List oneLotto, List lastLotto) { @@ -81,6 +80,12 @@ private int matchLottoNumber(List oneLotto, List lastL matchCount++; } } - return matchCount; //일치하는 번호 개수 + return matchCount; + } + + public String calculateProfitRrate(int[] matchCounts, int money) { + double profitRate = (matchCounts[3] * 5000 + matchCounts[4] * 50000 + + matchCounts[5] * 150000 + matchCounts[6] * 2000000000) / (double) money; + return String.format("%.2f", profitRate); } } From 2578a3e2548ee70e892205ee179a4e6c4ad73c3a Mon Sep 17 00:00:00 2001 From: taewoo Date: Mon, 29 Sep 2025 02:05:22 +0900 Subject: [PATCH 22/59] =?UTF-8?q?AutoLottoController=EC=97=90=20showLotter?= =?UTF-8?q?yStatistics=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=B0=8F=20=ED=86=B5=EA=B3=84=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/AutoLottoController.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/controller/AutoLottoController.java b/src/main/java/controller/AutoLottoController.java index 49eb829c1..745451fe0 100644 --- a/src/main/java/controller/AutoLottoController.java +++ b/src/main/java/controller/AutoLottoController.java @@ -2,9 +2,12 @@ import inputView.OutputView; import inputView.Price; +import model.LottoNumber; import model.LottoNumbers; import model.LottoNumbersRepository; +import java.util.List; + public class AutoLottoController { private final AutoLottoControllerMethod race = new AutoLottoControllerMethod(); private final OutputView outView = new OutputView(); @@ -26,6 +29,12 @@ public void race() { System.out.println(); // // 4. 통계 출력 - race.createLotteryStatistics(repository.readLottoNumbersRepository(), lastLotto.getNumbers(), price.getValue()); + showLotteryStatistics(repository.readLottoNumbersRepository(), lastLotto.getNumbers(), price.getValue()); + } + + public void showLotteryStatistics(List allLotteries, List lastLotto, int money) { + int[] matchCounts = race.countMatchResults(allLotteries, lastLotto); + String profitRate = race.calculateProfitRrate(matchCounts, money); + outView.printLotteryStatistics(matchCounts, profitRate); } } From 3b73ece8d4859b688a4151b12e10cbfcab3b9dbe Mon Sep 17 00:00:00 2001 From: taewoo Date: Mon, 29 Sep 2025 10:45:21 +0900 Subject: [PATCH 23/59] =?UTF-8?q?Controller=20=EB=B3=B4=EC=A1=B0=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=E2=86=92=20=EB=AA=A8=EB=8D=B8=20?= =?UTF-8?q?=EB=B9=84=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4(LottoBusiness)=EB=A1=9C=20=EC=97=AD?= =?UTF-8?q?=ED=95=A0=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20View=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LottoBusiness.java} | 36 +++---------------- 1 file changed, 5 insertions(+), 31 deletions(-) rename src/main/java/{controller/AutoLottoControllerMethod.java => model/LottoBusiness.java} (68%) diff --git a/src/main/java/controller/AutoLottoControllerMethod.java b/src/main/java/model/LottoBusiness.java similarity index 68% rename from src/main/java/controller/AutoLottoControllerMethod.java rename to src/main/java/model/LottoBusiness.java index 310270a21..5748fdfdf 100644 --- a/src/main/java/controller/AutoLottoControllerMethod.java +++ b/src/main/java/model/LottoBusiness.java @@ -1,41 +1,16 @@ -package controller; +package model; import inputView.InputView; import inputView.OutputView; -import inputView.Price; -import model.LottoNumber; -import model.LottoNumbers; -import model.LottoNumbersRepository; import util.LottoNumberGenerator; import util.RandomLottoNumberGenerator; import java.util.ArrayList; import java.util.List; -public class AutoLottoControllerMethod { +public class LottoBusiness { private final InputView inputView = new InputView(); - private final OutputView outView = new OutputView(); - - public Price readPrice() { - outView.printInputPrice(); - while (true) { - Price price = readPriceException(); - if (price != null) { - return price; - } - } - } - - private Price readPriceException() { - try { - return new Price(Integer.parseInt(inputView.inputPrice())); - } catch (NumberFormatException input) { - outView.printInvalidNumber(); - } catch (IllegalArgumentException input) { - outView.printInvalidPrice(); - } - return null; - } + private final OutputView outView = new OutputView( private LottoNumbers createOneLotto() { LottoNumberGenerator generator = new RandomLottoNumberGenerator(); @@ -51,10 +26,9 @@ public LottoNumbersRepository createLottos(int count) { return repository; } - public LottoNumbers createLastLotto() { - outView.printInputLastLotto(); + public LottoNumbers createLastLotto(String LastLotto) { List numbers = new ArrayList<>(); - String[] lastNumbers = inputView.inputLastLotto().split(","); + String[] lastNumbers = LastLotto.split(","); for (int i = 0; i < lastNumbers.length; i++) { lastNumbers[i] = lastNumbers[i].trim(); numbers.add(new LottoNumber(Integer.parseInt(lastNumbers[i]))); From 8f4157d2ac35d474887257e72fdac9e208cbb334 Mon Sep 17 00:00:00 2001 From: taewoo Date: Mon, 29 Sep 2025 13:02:09 +0900 Subject: [PATCH 24/59] =?UTF-8?q?AutoLottoController=EB=A5=BC=20=EB=8B=A8?= =?UTF-8?q?=EA=B3=84=EB=B3=84=20=EB=A9=94=EC=84=9C=EB=93=9C(showPrice,=20s?= =?UTF-8?q?howLottoNumbers,=20readLastLotto,=20showLotteryStatistics)?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/AutoLottoController.java | 56 ++++++++++++++----- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/src/main/java/controller/AutoLottoController.java b/src/main/java/controller/AutoLottoController.java index 745451fe0..1882bc040 100644 --- a/src/main/java/controller/AutoLottoController.java +++ b/src/main/java/controller/AutoLottoController.java @@ -1,7 +1,9 @@ package controller; +import inputView.InputView; import inputView.OutputView; import inputView.Price; +import model.LottoBusiness; import model.LottoNumber; import model.LottoNumbers; import model.LottoNumbersRepository; @@ -9,32 +11,56 @@ import java.util.List; public class AutoLottoController { - private final AutoLottoControllerMethod race = new AutoLottoControllerMethod(); + private final LottoBusiness lottoBusiness = new LottoBusiness(); private final OutputView outView = new OutputView(); + private final InputView inputView = new InputView(); - public void race() { - // 1. 구입 금액 입력 - Price price = race.readPrice(); - outView.printPriceValue(price.getValue()); + private Price readPrice() { + outView.printInputPrice(); + while (true) { + Price price = readPriceException(); + if (price != null) { + return price; + } + } + } + + private Price readPriceException() { + try { + return new Price(Integer.parseInt(inputView.inputPrice())); + } catch (NumberFormatException input) { + outView.printInvalidNumber(); + } catch (IllegalArgumentException input) { + outView.printInvalidPrice(); + } + return null; + } + + public Price showPrice() { + Price money = readPrice(); + outView.printPriceValue(money.getValue()); System.out.println(); - outView.printBuyCount(price.howManyLottos()); + outView.printBuyCount(money.howManyLottos()); + return money; + } - // 2. 로또 번호 생성 - LottoNumbersRepository repository = race.createLottos(price.howManyLottos()); + public LottoNumbersRepository showLottoNumbers(int ticketCount) { + LottoNumbersRepository repository = lottoBusiness.createLottos(ticketCount); outView.printLottos(repository.readLottoNumbersRepository()); System.out.println(); + return repository; + } - // 3. 당첨 번호 입력 - LottoNumbers lastLotto = race.createLastLotto(); + public LottoNumbers readLastLotto() { + outView.printInputLastLotto(); + LottoNumbers lastLotto = lottoBusiness.createLastLotto(inputView.inputLastLotto()); System.out.println(); - - // // 4. 통계 출력 - showLotteryStatistics(repository.readLottoNumbersRepository(), lastLotto.getNumbers(), price.getValue()); + return lastLotto; } public void showLotteryStatistics(List allLotteries, List lastLotto, int money) { - int[] matchCounts = race.countMatchResults(allLotteries, lastLotto); - String profitRate = race.calculateProfitRrate(matchCounts, money); + int[] matchCounts = lottoBusiness.countMatchResults(allLotteries, lastLotto); + String profitRate = lottoBusiness.calculateProfitRrate(matchCounts, money); outView.printLotteryStatistics(matchCounts, profitRate); } } From fa8c3ae770b18b1d26155c572f6f6aa174ccaf01 Mon Sep 17 00:00:00 2001 From: taewoo Date: Mon, 29 Sep 2025 13:05:05 +0900 Subject: [PATCH 25/59] =?UTF-8?q?=EB=B3=80=EC=88=98=EB=AA=85=EC=9D=84=20?= =?UTF-8?q?=EB=8D=94=20=EC=9D=98=EB=AF=B8=20=EC=9E=88=EA=B2=8C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoBusiness.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/model/LottoBusiness.java b/src/main/java/model/LottoBusiness.java index 5748fdfdf..1d785bd2f 100644 --- a/src/main/java/model/LottoBusiness.java +++ b/src/main/java/model/LottoBusiness.java @@ -10,12 +10,12 @@ public class LottoBusiness { private final InputView inputView = new InputView(); - private final OutputView outView = new OutputView( + private final OutputView outView = new OutputView(); - private LottoNumbers createOneLotto() { + public LottoNumbers createOneLotto() { LottoNumberGenerator generator = new RandomLottoNumberGenerator(); - LottoNumbers lottonumbers = generator.generate(); - return lottonumbers; + LottoNumbers lottoNumbers = generator.generate(); + return lottoNumbers; } public LottoNumbersRepository createLottos(int count) { From dcc3c701d89aac72430bf9f7d5253214d00a8c64 Mon Sep 17 00:00:00 2001 From: taewoo Date: Mon, 29 Sep 2025 13:06:35 +0900 Subject: [PATCH 26/59] =?UTF-8?q?=EB=B3=80=EC=88=98=EB=AA=85=EC=9D=84=20?= =?UTF-8?q?=EB=8D=94=20=EC=9D=98=EB=AF=B8=20=EC=9E=88=EA=B2=8C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoBusiness.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/model/LottoBusiness.java b/src/main/java/model/LottoBusiness.java index 1d785bd2f..b9cb6f90a 100644 --- a/src/main/java/model/LottoBusiness.java +++ b/src/main/java/model/LottoBusiness.java @@ -9,13 +9,10 @@ import java.util.List; public class LottoBusiness { - private final InputView inputView = new InputView(); - private final OutputView outView = new OutputView(); - public LottoNumbers createOneLotto() { LottoNumberGenerator generator = new RandomLottoNumberGenerator(); - LottoNumbers lottoNumbers = generator.generate(); - return lottoNumbers; + LottoNumbers oneLotto = generator.generate(); + return oneLotto; } public LottoNumbersRepository createLottos(int count) { From 32ff258bf0a0a0c4bf7e874fcdeb907443655059 Mon Sep 17 00:00:00 2001 From: taewoo Date: Mon, 29 Sep 2025 13:08:18 +0900 Subject: [PATCH 27/59] =?UTF-8?q?Main=EC=97=90=EC=84=9C=20AutoLottoControl?= =?UTF-8?q?ler=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=93=A4=EC=9D=84=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=ED=95=B4=20=ED=94=84=EB=A1=9C=EA=B7=B8=EB=9E=A8=20?= =?UTF-8?q?=EC=8B=A4=ED=96=89=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B5=AC?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index ec670a71c..c1fccc428 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,8 +1,24 @@ import controller.AutoLottoController; +import inputView.Price; +import model.LottoNumbers; +import model.LottoNumbersRepository; public class Main { public static void main(String[] args) { AutoLottoController controller = new AutoLottoController(); - controller.race(); + + // 1. 구입 금액 입력 + Price money = controller.showPrice(); + + // 2. 로또 번호 생성 + LottoNumbersRepository allLotteries = controller.showLottoNumbers(money.howManyLottos()); + + // 3. 당첨 번호 입력 + LottoNumbers lastLotto = controller.readLastLotto(); + + // 4. 통계 출력 + controller.showLotteryStatistics(allLotteries.readLottoNumbersRepository() + , lastLotto.getNumbers() + , money.getValue()); } } From 0293eee8239e09ce87bfa545cbf5dfa340dd73f1 Mon Sep 17 00:00:00 2001 From: taewoo Date: Wed, 1 Oct 2025 07:29:32 +0900 Subject: [PATCH 28/59] =?UTF-8?q?=EB=A1=9C=EB=98=90=20=EB=B2=88=ED=98=B8?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=EC=9D=84=20=EB=AA=A8?= =?UTF-8?q?=EB=8D=B8=EB=A1=9C=20=EC=9D=B4=EB=8F=99=ED=95=98=EA=B3=A0=20?= =?UTF-8?q?=EC=A0=84=EB=9E=B5=20=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 --- .../java/model/FixedLottoNumberGenerator.java | 21 +++++++++++++++++++ .../{util => model}/LottoNumberGenerator.java | 4 +--- .../RandomLottoNumberGenerator.java | 5 +---- 3 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 src/main/java/model/FixedLottoNumberGenerator.java rename src/main/java/{util => model}/LottoNumberGenerator.java (63%) rename src/main/java/{util => model}/RandomLottoNumberGenerator.java (89%) diff --git a/src/main/java/model/FixedLottoNumberGenerator.java b/src/main/java/model/FixedLottoNumberGenerator.java new file mode 100644 index 000000000..31182625e --- /dev/null +++ b/src/main/java/model/FixedLottoNumberGenerator.java @@ -0,0 +1,21 @@ +package model; + +import java.util.List; + +public class FixedLottoNumberGenerator implements LottoNumberGenerator { + private final List fixedNumbers; + + public FixedLottoNumberGenerator(List numbers) { + if (numbers.size() != 6) { + throw new IllegalArgumentException("로또 번호는 6개여야 합니다."); + } + this.fixedNumbers = numbers.stream() + .map(LottoNumber::new) + .toList(); + } + + @Override + public LottoNumbers generate() { + return new LottoNumbers(fixedNumbers); + } +} diff --git a/src/main/java/util/LottoNumberGenerator.java b/src/main/java/model/LottoNumberGenerator.java similarity index 63% rename from src/main/java/util/LottoNumberGenerator.java rename to src/main/java/model/LottoNumberGenerator.java index 3fbe3ca20..c387ede47 100644 --- a/src/main/java/util/LottoNumberGenerator.java +++ b/src/main/java/model/LottoNumberGenerator.java @@ -1,6 +1,4 @@ -package util; - -import model.LottoNumbers; +package model; public interface LottoNumberGenerator { LottoNumbers generate(); diff --git a/src/main/java/util/RandomLottoNumberGenerator.java b/src/main/java/model/RandomLottoNumberGenerator.java similarity index 89% rename from src/main/java/util/RandomLottoNumberGenerator.java rename to src/main/java/model/RandomLottoNumberGenerator.java index dc56f3307..2e6d23fa1 100644 --- a/src/main/java/util/RandomLottoNumberGenerator.java +++ b/src/main/java/model/RandomLottoNumberGenerator.java @@ -1,7 +1,4 @@ -package util; - -import model.LottoNumber; -import model.LottoNumbers; +package model; import java.util.ArrayList; import java.util.Collections; From 5dcf37f1834ccaab3692cb98d190f45ee3cc94d1 Mon Sep 17 00:00:00 2001 From: taewoo Date: Wed, 1 Oct 2025 22:28:55 +0900 Subject: [PATCH 29/59] =?UTF-8?q?=EB=AA=87=20=EA=B0=9C=EC=9D=98=20?= =?UTF-8?q?=EB=B2=88=ED=98=B8=EA=B0=80=20=EB=A7=9E=EC=95=98=EB=8A=94?= =?UTF-8?q?=EC=A7=80=EB=A5=BC=20=ED=91=9C=ED=98=84=ED=95=98=EB=8A=94=20Mat?= =?UTF-8?q?chResult=20enum=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/model/MatchResult.java | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/main/java/model/MatchResult.java diff --git a/src/main/java/model/MatchResult.java b/src/main/java/model/MatchResult.java new file mode 100644 index 000000000..14ba13fd8 --- /dev/null +++ b/src/main/java/model/MatchResult.java @@ -0,0 +1,40 @@ +package model; + +public enum MatchResult { + ZERO(0, "0개 일치", 0), + ONE(1, "1개 일치", 0), + TWO(2, "2개 일치", 0), + THREE(3, "3개 일치", 5000), + FOUR(4, "4개 일치", 50000), + FIVE(5, "5개 일치", 150000), + SIX(6, "6개 일치", 2000000000); + + private final int count; + private final String description; + private final int reward; + + MatchResult(int count, String description, int reward) { + this.count = count; + this.description = description; + this.reward = reward; + } + + public int getCount() { + return count; + } + + public String getDescription() { + return description; + } + + public int getReward() { + return reward; + } + + public static MatchResult fromCount(int count) { + for (MatchResult result : values()) { + if (result.count == count) return result; + } + return ZERO; + } +} From a45f213e9863f6f72b5b666c9888f96a80309d55 Mon Sep 17 00:00:00 2001 From: taewoo Date: Wed, 1 Oct 2025 22:29:44 +0900 Subject: [PATCH 30/59] =?UTF-8?q?=EB=A1=9C=EB=98=90=20=ED=86=B5=EA=B3=84?= =?UTF-8?q?=20=EA=B3=84=EC=82=B0=20=EB=A1=9C=EC=A7=81=EC=9D=84=20int[]?= =?UTF-8?q?=EC=97=90=EC=84=9C=20EnumMap=20=EA=B8=B0=EB=B0=98=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoBusiness.java | 33 +++++++++++++++----------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/model/LottoBusiness.java b/src/main/java/model/LottoBusiness.java index b9cb6f90a..5339d6bdf 100644 --- a/src/main/java/model/LottoBusiness.java +++ b/src/main/java/model/LottoBusiness.java @@ -1,18 +1,15 @@ package model; -import inputView.InputView; -import inputView.OutputView; -import util.LottoNumberGenerator; -import util.RandomLottoNumberGenerator; - import java.util.ArrayList; +import java.util.EnumMap; import java.util.List; +import java.util.Map; public class LottoBusiness { public LottoNumbers createOneLotto() { LottoNumberGenerator generator = new RandomLottoNumberGenerator(); - LottoNumbers oneLotto = generator.generate(); - return oneLotto; + LottoNumbers lottoNumbers = generator.generate(); + return lottoNumbers; } public LottoNumbersRepository createLottos(int count) { @@ -33,12 +30,17 @@ public LottoNumbers createLastLotto(String LastLotto) { return new LottoNumbers(numbers); } - public int[] countMatchResults(List allLotteries, List lastLotto) { - int[] matchCounts = {0, 0, 0, 0, 0, 0, 0}; + public Map countMatchResults(List allLotteries, List lastLotto) { + Map matchCounts = new EnumMap<>(MatchResult.class); + for (MatchResult result : MatchResult.values()) { + matchCounts.put(result, 0); + } for (LottoNumbers oneLotto : allLotteries) { - matchCounts[matchLottoNumber(oneLotto.getNumbers(), lastLotto)]++; + int count = matchLottoNumber(oneLotto.getNumbers(), lastLotto); + MatchResult result = MatchResult.fromCount(count); + matchCounts.put(result, matchCounts.get(result) + 1); } - return matchCounts.clone(); + return matchCounts; } private int matchLottoNumber(List oneLotto, List lastLotto) { @@ -54,9 +56,12 @@ private int matchLottoNumber(List oneLotto, List lastL return matchCount; } - public String calculateProfitRrate(int[] matchCounts, int money) { - double profitRate = (matchCounts[3] * 5000 + matchCounts[4] * 50000 - + matchCounts[5] * 150000 + matchCounts[6] * 2000000000) / (double) money; + public String calculateProfitRrate(Map matchCounts, int money) { + double profitRate = 0; + for (MatchResult result : matchCounts.keySet()) { + profitRate += matchCounts.get(result) * result.getReward(); + } + profitRate = profitRate / (double) money; return String.format("%.2f", profitRate); } } From d87205d4a1012707c74dec2763068df5191fbc2d Mon Sep 17 00:00:00 2001 From: taewoo Date: Wed, 1 Oct 2025 22:30:58 +0900 Subject: [PATCH 31/59] =?UTF-8?q?=20AutoLottoController=EC=97=90=EC=84=9C?= =?UTF-8?q?=20EnumMap=20=EA=B8=B0=EB=B0=98=20=ED=86=B5=EA=B3=84=20?= =?UTF-8?q?=EC=B6=9C=EB=A0=A5=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/controller/AutoLottoController.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/controller/AutoLottoController.java b/src/main/java/controller/AutoLottoController.java index 1882bc040..617570982 100644 --- a/src/main/java/controller/AutoLottoController.java +++ b/src/main/java/controller/AutoLottoController.java @@ -3,12 +3,10 @@ import inputView.InputView; import inputView.OutputView; import inputView.Price; -import model.LottoBusiness; -import model.LottoNumber; -import model.LottoNumbers; -import model.LottoNumbersRepository; +import model.*; import java.util.List; +import java.util.Map; public class AutoLottoController { private final LottoBusiness lottoBusiness = new LottoBusiness(); @@ -59,7 +57,7 @@ public LottoNumbers readLastLotto() { } public void showLotteryStatistics(List allLotteries, List lastLotto, int money) { - int[] matchCounts = lottoBusiness.countMatchResults(allLotteries, lastLotto); + Map matchCounts = lottoBusiness.countMatchResults(allLotteries, lastLotto); String profitRate = lottoBusiness.calculateProfitRrate(matchCounts, money); outView.printLotteryStatistics(matchCounts, profitRate); } From 98ea697213c44fc8850a89eb0a28bdbc49059956 Mon Sep 17 00:00:00 2001 From: taewoo Date: Wed, 1 Oct 2025 23:22:47 +0900 Subject: [PATCH 32/59] =?UTF-8?q?=EB=8F=84=EB=A9=94=EC=9D=B8=20=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=EB=93=A4=EC=97=90=20equals/hashCode=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/inputView/Price.java | 19 ++++++++++++++-- src/main/java/model/LottoNumber.java | 16 ++++++++++++++ src/main/java/model/LottoNumbers.java | 22 ++++++++++++++----- .../java/model/LottoNumbersRepository.java | 14 ++++++++++++ 4 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/main/java/inputView/Price.java b/src/main/java/inputView/Price.java index 40a8f4466..e32c6d27a 100644 --- a/src/main/java/inputView/Price.java +++ b/src/main/java/inputView/Price.java @@ -1,14 +1,16 @@ package inputView; +import java.util.Objects; + public class Price { private final int value; public Price(int value) { - checkNegative(value); + vaildateNegative(value); this.value = value; } - private static void checkNegative(int value) { + private static void vaildateNegative(int value) { if (value < 0) { throw new IllegalArgumentException("구입 금액은 0원 이상입니다."); } @@ -21,4 +23,17 @@ public int getValue() { public int howManyLottos() { return value / 1000; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Price)) return false; + Price money = (Price) o; + return value == money.value; + } + + @Override + public int hashCode() { + return Objects.hash(value); + } } diff --git a/src/main/java/model/LottoNumber.java b/src/main/java/model/LottoNumber.java index 4cc33e8b0..b08b294f0 100644 --- a/src/main/java/model/LottoNumber.java +++ b/src/main/java/model/LottoNumber.java @@ -1,5 +1,7 @@ package model; +import java.util.Objects; + public class LottoNumber { private final int number; @@ -22,4 +24,18 @@ public int getNumber() { public String toString() { return String.valueOf(number); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof LottoNumber)) return false; + LottoNumber lottoNumber = (LottoNumber) o; + return number == lottoNumber.number; + } + + @Override + public int hashCode() { + return Objects.hash(number); + } } + diff --git a/src/main/java/model/LottoNumbers.java b/src/main/java/model/LottoNumbers.java index 076941070..6ca7d66ac 100644 --- a/src/main/java/model/LottoNumbers.java +++ b/src/main/java/model/LottoNumbers.java @@ -1,19 +1,16 @@ package model; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; +import java.util.*; public class LottoNumbers { private final List numbers; public LottoNumbers(List numbers) { - validatesize(numbers); + validateSize(numbers); this.numbers = List.copyOf(numbers); } - private void validatesize(List numbers) { + private void validateSize(List numbers) { if (numbers.size() != 6) { throw new IllegalArgumentException("로또 번호가 6개가 아닙니다"); } @@ -28,4 +25,17 @@ public LottoNumbers sortNumbers() { public List getNumbers() { return Collections.unmodifiableList(numbers); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof LottoNumbers)) return false; + LottoNumbers lottoNumbers = (LottoNumbers) o; + return Objects.equals(numbers, lottoNumbers.numbers); + } + + @Override + public int hashCode() { + return Objects.hash(numbers); + } } diff --git a/src/main/java/model/LottoNumbersRepository.java b/src/main/java/model/LottoNumbersRepository.java index 8757fcb77..e361d7c5c 100644 --- a/src/main/java/model/LottoNumbersRepository.java +++ b/src/main/java/model/LottoNumbersRepository.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Objects; public class LottoNumbersRepository { private final List repository = new ArrayList<>(); @@ -14,4 +15,17 @@ public void addLottoNumbers(LottoNumbers lottoNumbers) { public List readLottoNumbersRepository() { return Collections.unmodifiableList(repository); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof LottoNumbersRepository)) return false; + LottoNumbersRepository allLotteries = (LottoNumbersRepository) o; + return Objects.equals(repository, allLotteries.repository); + } + + @Override + public int hashCode() { + return Objects.hash(repository); + } } From 036ccdb6973360ed2ced65269dab02a1de110c1f Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 2 Oct 2025 03:58:12 +0900 Subject: [PATCH 33/59] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=9A=A9?= =?UTF-8?q?=EC=9D=B4=EC=84=B1=EC=9D=84=20=EC=9C=84=ED=95=B4=20LottoBusines?= =?UTF-8?q?s=EC=97=90=20=EC=A0=84=EB=9E=B5=20=ED=8C=A8=ED=84=B4=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoBusiness.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/model/LottoBusiness.java b/src/main/java/model/LottoBusiness.java index 5339d6bdf..98eaa7096 100644 --- a/src/main/java/model/LottoBusiness.java +++ b/src/main/java/model/LottoBusiness.java @@ -6,10 +6,18 @@ import java.util.Map; public class LottoBusiness { + private final LottoNumberGenerator generator; + + public LottoBusiness() { + this(new RandomLottoNumberGenerator()); + } + + public LottoBusiness(LottoNumberGenerator generator) { + this.generator = generator; + } + public LottoNumbers createOneLotto() { - LottoNumberGenerator generator = new RandomLottoNumberGenerator(); - LottoNumbers lottoNumbers = generator.generate(); - return lottoNumbers; + return generator.generate(); } public LottoNumbersRepository createLottos(int count) { From 510b0c0ef4402942f41ef2542874bb8952319630 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 2 Oct 2025 03:59:02 +0900 Subject: [PATCH 34/59] =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/inputView/PriceTest.java | 31 +++--- .../model/FixedLottoNumberGeneratorTest.java | 25 +++++ src/test/java/model/LottoBusinessTest.java | 95 +++++++++++++++++++ src/test/java/model/LottoNumberTest.java | 10 ++ .../model/LottoNumbersRepositoryTest.java | 27 +++--- src/test/java/model/LottoNumbersTest.java | 29 +++--- .../RandomLottoNumberGeneratorTest.java | 3 +- 7 files changed, 177 insertions(+), 43 deletions(-) create mode 100644 src/test/java/model/FixedLottoNumberGeneratorTest.java create mode 100644 src/test/java/model/LottoBusinessTest.java rename src/test/java/{util => model}/RandomLottoNumberGeneratorTest.java (90%) diff --git a/src/test/java/inputView/PriceTest.java b/src/test/java/inputView/PriceTest.java index ca950f7f6..ea0566ee5 100644 --- a/src/test/java/inputView/PriceTest.java +++ b/src/test/java/inputView/PriceTest.java @@ -2,45 +2,40 @@ import org.junit.jupiter.api.Test; -import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; class PriceTest { @Test - void 올바른_금액이면_Price_객체가_생성된다() { + void 올바른_금액이면_로또개수계산() { // given - int value = 1000; + Price price = new Price(2000); // when - Price price = new Price(value); + int count = price.howManyLottos(); // then - assertThat(price.getValue()).isEqualTo(1000); + assertEquals(2, count); } @Test void _0원_미만이면_예외가_발생한다() { // given - int negativeValue = -1; + int invalidMoney = -2000; // when & then - IllegalArgumentException exception = assertThrows( - IllegalArgumentException.class, - () -> new Price(negativeValue) - ); - assertThat(exception.getMessage()).contains("구입 금액은 0원 이상"); + assertThrows(IllegalArgumentException.class, () -> new Price(invalidMoney)); } @Test - void 천원_단위로_로또_개수를_계산한다() { + void 같은금액이면_동일객체() { // given - Price price = new Price(6000); - - // when - int count = price.howManyLottos(); + Price price1 = new Price(6000); + Price price2 = new Price(6000); - // then - assertThat(count).isEqualTo(6); + // when & then + assertEquals(price1, price2); + assertEquals(price1.hashCode(), price2.hashCode()); } } diff --git a/src/test/java/model/FixedLottoNumberGeneratorTest.java b/src/test/java/model/FixedLottoNumberGeneratorTest.java new file mode 100644 index 000000000..60b7121bd --- /dev/null +++ b/src/test/java/model/FixedLottoNumberGeneratorTest.java @@ -0,0 +1,25 @@ +package model; + +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class FixedLottoNumberGeneratorTest { + + @Test + void 고정된숫자를_반환() { + // Given + List input = List.of(1, 2, 3, 4, 5, 6); + FixedLottoNumberGenerator generator = new FixedLottoNumberGenerator(input); + + // When + LottoNumbers lotto = generator.generate(); + + // Then + // LottoNumbers.getNumbers()는 LottoNumber 객체들이라서 + // 그대로 toString()해서 비교하면 간단해짐 + assertEquals(input.toString(), lotto.getNumbers().toString()); + } +} diff --git a/src/test/java/model/LottoBusinessTest.java b/src/test/java/model/LottoBusinessTest.java new file mode 100644 index 000000000..7d8f03530 --- /dev/null +++ b/src/test/java/model/LottoBusinessTest.java @@ -0,0 +1,95 @@ +package model; + +import org.junit.jupiter.api.Test; + +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +class LottoBusinessTest { + private final LottoBusiness business = new LottoBusiness(); + + @Test + void 고정된로또가_생성된다() { + // Given + LottoBusiness business = + new LottoBusiness(new FixedLottoNumberGenerator(List.of(1, 2, 3, 4, 5, 6))); + + // When + LottoNumbers lotto = business.createOneLotto(); + + // Then + assertEquals(List.of(1, 2, 3, 4, 5, 6), + lotto.getNumbers().stream().map(LottoNumber::getNumber).toList()); + } + + @Test + void 요청한_개수만큼_로또가_생성된다() { + // Given + int count = 3; + + // When + LottoNumbersRepository re = business.createLottos(count); + + // Then + assertEquals(count, re.readLottoNumbersRepository().size()); + assertTrue(re.readLottoNumbersRepository() + .stream().allMatch(n -> n.getNumbers().size() == 6)); + } + + @Test + void 지난주_로또가_생성된다() { + // Given + String input = "1, 2,3, 4 ,5,6"; + + // When + LottoNumbers last = business.createLastLotto(input); + + // Then + assertEquals(6, last.getNumbers().size()); + assertEquals(List.of(1, 2, 3, 4, 5, 6), + last.getNumbers().stream().map(LottoNumber::getNumber).toList()); + } + + @Test + void countMatchResults_4개일치면_FOUR가_1로_집계된다() { + // Given + LottoNumbers mine = new LottoNumbers(List.of( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) + )); + LottoNumbers last = new LottoNumbers(List.of( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(7), new LottoNumber(8) + )); + + // When + Map result = + business.countMatchResults(List.of(mine), last.getNumbers()); + + // Then + assertEquals(1, result.get(MatchResult.FOUR)); + } + + @Test + void calculateProfitRrate_3개일치_한장_구입1000원은_5배다() { + // Given + Map matchCounts = Map.of( + MatchResult.THREE, 1, + MatchResult.ZERO, 0, + MatchResult.ONE, 0, + MatchResult.TWO, 0, + MatchResult.FOUR, 0, + MatchResult.FIVE, 0, + MatchResult.SIX, 0 + ); + int money = 1000; + + // When + String rate = business.calculateProfitRrate(matchCounts, money); + + // Then + assertEquals("5.00", rate); + } +} diff --git a/src/test/java/model/LottoNumberTest.java b/src/test/java/model/LottoNumberTest.java index 32c1f1012..039f16a43 100644 --- a/src/test/java/model/LottoNumberTest.java +++ b/src/test/java/model/LottoNumberTest.java @@ -30,4 +30,14 @@ class LottoNumberTest { assertThrows(IllegalArgumentException.class, () -> new LottoNumber(invalidMin)); assertThrows(IllegalArgumentException.class, () -> new LottoNumber(invalidMax)); } + + @Test + void 같은숫자는_equal비교() { + //given + LottoNumber n1 = new LottoNumber(3); + LottoNumber n2 = new LottoNumber(3); + + //when & then + assertEquals(n1, n2); + } } diff --git a/src/test/java/model/LottoNumbersRepositoryTest.java b/src/test/java/model/LottoNumbersRepositoryTest.java index 2cae0071c..119d68f50 100644 --- a/src/test/java/model/LottoNumbersRepositoryTest.java +++ b/src/test/java/model/LottoNumbersRepositoryTest.java @@ -25,19 +25,24 @@ class LottoNumbersRepositoryTest { } @Test - void 반환된_리스트는_불변리스트이다() { - // given - LottoNumbersRepository repository = new LottoNumbersRepository(); - LottoNumbers lottoNumbers = new LottoNumbers(Arrays.asList( + void 같은로또묶음들을가지면_동일한저장소다() { + // Given + LottoNumbersRepository re1 = new LottoNumbersRepository(); + LottoNumbersRepository re2 = new LottoNumbersRepository(); + + LottoNumbers lotto = new LottoNumbers(List.of( new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(6))); - repository.addLottoNumbers(lottoNumbers); + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) + )); - // when - List list = repository.readLottoNumbersRepository(); + re1.addLottoNumbers(lotto); + re2.addLottoNumbers(new LottoNumbers(List.of( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) + ))); - // then - assertThrows(UnsupportedOperationException.class, - () -> list.add(lottoNumbers)); + // When & Then + assertEquals(re1, re2); + assertEquals(re1.hashCode(), re2.hashCode()); } } diff --git a/src/test/java/model/LottoNumbersTest.java b/src/test/java/model/LottoNumbersTest.java index 4d5e6c280..e34922f8a 100644 --- a/src/test/java/model/LottoNumbersTest.java +++ b/src/test/java/model/LottoNumbersTest.java @@ -30,18 +30,6 @@ class LottoNumbersTest { () -> new LottoNumbers(numbers)); } - @Test - void getNumbers_반환값은_불변리스트이다() { - List numbers = Arrays.asList( - new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(6)); - - LottoNumbers lottoNumbers = new LottoNumbers(numbers); - - assertThrows(UnsupportedOperationException.class, - () -> lottoNumbers.getNumbers().add(new LottoNumber(7))); - } - @Test void sortNumbers는_번호를_오름차순으로_정렬한다() { List numbers = Arrays.asList( @@ -54,4 +42,21 @@ class LottoNumbersTest { assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6), sorted.getNumbers().stream().map(LottoNumber::getNumber).toList()); } + + @Test + void 같은번호면_동일한객체() { + // Given + LottoNumbers lotto1 = new LottoNumbers(List.of( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) + )); + LottoNumbers lotto2 = new LottoNumbers(List.of( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) + )); + + // When & Then + assertEquals(lotto1, lotto2); + assertEquals(lotto1.hashCode(), lotto2.hashCode()); + } } diff --git a/src/test/java/util/RandomLottoNumberGeneratorTest.java b/src/test/java/model/RandomLottoNumberGeneratorTest.java similarity index 90% rename from src/test/java/util/RandomLottoNumberGeneratorTest.java rename to src/test/java/model/RandomLottoNumberGeneratorTest.java index f721b4391..fd3c244ba 100644 --- a/src/test/java/util/RandomLottoNumberGeneratorTest.java +++ b/src/test/java/model/RandomLottoNumberGeneratorTest.java @@ -1,6 +1,5 @@ -package util; +package model; -import model.LottoNumbers; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; From 9f185567101e3fd3a72941a926b8086258951245 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 2 Oct 2025 13:23:57 +0900 Subject: [PATCH 35/59] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=203=EB=8B=A8?= =?UTF-8?q?=EA=B3=84(=EC=88=98=EB=8F=99=20=EA=B5=AC=EB=A7=A4)=20=EB=B0=8F?= =?UTF-8?q?=204=EB=8B=A8=EA=B3=84(=EB=B3=B4=EB=84=88=EC=8A=A4=EB=B3=BC=20?= =?UTF-8?q?=EB=8B=B9=EC=B2=A8=20=EA=B2=B0=EA=B3=BC)=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/controller/AutoLottoController.java | 27 +++++++++--- src/main/java/inputView/InputView.java | 18 ++++++++ src/main/java/model/LottoBusiness.java | 43 +++++++++++++++---- src/main/java/model/MatchResult.java | 8 +++- 4 files changed, 81 insertions(+), 15 deletions(-) diff --git a/src/main/java/controller/AutoLottoController.java b/src/main/java/controller/AutoLottoController.java index 617570982..f4080c9c6 100644 --- a/src/main/java/controller/AutoLottoController.java +++ b/src/main/java/controller/AutoLottoController.java @@ -38,12 +38,22 @@ public Price showPrice() { Price money = readPrice(); outView.printPriceValue(money.getValue()); System.out.println(); - outView.printBuyCount(money.howManyLottos()); return money; } public LottoNumbersRepository showLottoNumbers(int ticketCount) { - LottoNumbersRepository repository = lottoBusiness.createLottos(ticketCount); + outView.printManualTicketCount(); + int manualTicket = Integer.parseInt(inputView.inputManualTicket()); + System.out.println(); + int autoTicket = ticketCount - manualTicket; + outView.showManualTicketLottoNumber(); + List manualLottos = inputView.inputManualLottos(manualTicket); + System.out.println(); + LottoNumbersRepository manualRepository = lottoBusiness.createManualLottos(manualLottos); + LottoNumbersRepository autoRepository = lottoBusiness.createLottos(ticketCount); + outView.printBuyCount(manualTicket, autoTicket); + LottoNumbersRepository repository = lottoBusiness.mergeRepository(manualRepository, + autoRepository); outView.printLottos(repository.readLottoNumbersRepository()); System.out.println(); return repository; @@ -51,13 +61,20 @@ public LottoNumbersRepository showLottoNumbers(int ticketCount) { public LottoNumbers readLastLotto() { outView.printInputLastLotto(); - LottoNumbers lastLotto = lottoBusiness.createLastLotto(inputView.inputLastLotto()); + LottoNumbers lastLotto = lottoBusiness.createInputLotto(inputView.inputLastLotto()); System.out.println(); return lastLotto; } - public void showLotteryStatistics(List allLotteries, List lastLotto, int money) { - Map matchCounts = lottoBusiness.countMatchResults(allLotteries, lastLotto); + public LottoNumber readBonusBall() { + outView.printBonusBall(); + LottoNumber bonusNumber = new LottoNumber(Integer.parseInt(inputView.inputBonusBall())); + System.out.println(); + return bonusNumber; + } + + public void showLotteryStatistics(List allLotteries, List lastLotto, int money, LottoNumber bonusBall) { + Map matchCounts = lottoBusiness.countMatchResults(allLotteries, lastLotto, bonusBall); String profitRate = lottoBusiness.calculateProfitRrate(matchCounts, money); outView.printLotteryStatistics(matchCounts, profitRate); } diff --git a/src/main/java/inputView/InputView.java b/src/main/java/inputView/InputView.java index ca5ea72ba..4372942dc 100644 --- a/src/main/java/inputView/InputView.java +++ b/src/main/java/inputView/InputView.java @@ -1,5 +1,7 @@ package inputView; +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; public class InputView { @@ -9,6 +11,22 @@ public String inputPrice() { return scanner.nextLine(); } + public String inputManualTicket() { + return scanner.nextLine(); + } + + public List inputManualLottos(int count) { + List inputs = new ArrayList<>(); + for (int i = 0; i < count; i++) { + inputs.add(scanner.nextLine()); + } + return inputs; + } + + public String inputBonusBall() { + return scanner.nextLine(); + } + public String inputLastLotto() { return scanner.nextLine(); } diff --git a/src/main/java/model/LottoBusiness.java b/src/main/java/model/LottoBusiness.java index 98eaa7096..73d94efcf 100644 --- a/src/main/java/model/LottoBusiness.java +++ b/src/main/java/model/LottoBusiness.java @@ -1,9 +1,6 @@ package model; -import java.util.ArrayList; -import java.util.EnumMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class LottoBusiness { private final LottoNumberGenerator generator; @@ -28,9 +25,9 @@ public LottoNumbersRepository createLottos(int count) { return repository; } - public LottoNumbers createLastLotto(String LastLotto) { + public LottoNumbers createInputLotto(String inputNumber) { List numbers = new ArrayList<>(); - String[] lastNumbers = LastLotto.split(","); + String[] lastNumbers = inputNumber.split(","); for (int i = 0; i < lastNumbers.length; i++) { lastNumbers[i] = lastNumbers[i].trim(); numbers.add(new LottoNumber(Integer.parseInt(lastNumbers[i]))); @@ -38,14 +35,37 @@ public LottoNumbers createLastLotto(String LastLotto) { return new LottoNumbers(numbers); } - public Map countMatchResults(List allLotteries, List lastLotto) { + public LottoNumbersRepository createManualLottos(List inputs) { + LottoNumbersRepository repository = new LottoNumbersRepository(); + for (String input : inputs) { + repository.addLottoNumbers(createInputLotto(input)); + } + return repository; + } + + public LottoNumbersRepository mergeRepository(LottoNumbersRepository manual, LottoNumbersRepository auto) { + LottoNumbersRepository repository = new LottoNumbersRepository(); + for (LottoNumbers lotto : manual.readLottoNumbersRepository()) { + repository.addLottoNumbers(lotto); + } + + for (LottoNumbers lotto : auto.readLottoNumbersRepository()) { + repository.addLottoNumbers(lotto); + } + return repository; + } + + public Map countMatchResults(List allLotteries, + List lastLotto, + LottoNumber bonusBall) { Map matchCounts = new EnumMap<>(MatchResult.class); for (MatchResult result : MatchResult.values()) { matchCounts.put(result, 0); } for (LottoNumbers oneLotto : allLotteries) { int count = matchLottoNumber(oneLotto.getNumbers(), lastLotto); - MatchResult result = MatchResult.fromCount(count); + boolean bonusMatch = matchBonus(oneLotto.getNumbers(), bonusBall, count); + MatchResult result = MatchResult.fromCount(count, bonusMatch); matchCounts.put(result, matchCounts.get(result) + 1); } return matchCounts; @@ -64,6 +84,13 @@ private int matchLottoNumber(List oneLotto, List lastL return matchCount; } + private boolean matchBonus(List oneLotto, LottoNumber bonusBall, int count) { + if (count == 5) { + return oneLotto.contains(bonusBall); + } + return false; + } + public String calculateProfitRrate(Map matchCounts, int money) { double profitRate = 0; for (MatchResult result : matchCounts.keySet()) { diff --git a/src/main/java/model/MatchResult.java b/src/main/java/model/MatchResult.java index 14ba13fd8..8f8557c6f 100644 --- a/src/main/java/model/MatchResult.java +++ b/src/main/java/model/MatchResult.java @@ -7,6 +7,7 @@ public enum MatchResult { THREE(3, "3개 일치", 5000), FOUR(4, "4개 일치", 50000), FIVE(5, "5개 일치", 150000), + FIVE_BONUS(5, "5개 + 보너스 일치", 30000000), SIX(6, "6개 일치", 2000000000); private final int count; @@ -31,9 +32,12 @@ public int getReward() { return reward; } - public static MatchResult fromCount(int count) { + public static MatchResult fromCount(int count, boolean bonusMatch) { + if (count == 5 && bonusMatch) { + return FIVE_BONUS; + } for (MatchResult result : values()) { - if (result.count == count) return result; + if (result.count == count && result != FIVE_BONUS) return result; } return ZERO; } From f74a8ace0cca6d1d64e752ef385747005dcd4611 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 2 Oct 2025 14:35:54 +0900 Subject: [PATCH 36/59] =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4/=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 30 ++++--- .../java/controller/AutoLottoController.java | 81 ------------------ src/main/java/controller/LottoController.java | 85 +++++++++++++++++++ src/main/java/inputView/InputView.java | 4 +- src/main/java/inputView/OutputView.java | 35 +++++--- .../{Price.java => PurchaseAmount.java} | 12 +-- .../{LottoBusiness.java => LottoService.java} | 20 ++--- ...Repository.java => LottoTicketBundle.java} | 6 +- 8 files changed, 149 insertions(+), 124 deletions(-) delete mode 100644 src/main/java/controller/AutoLottoController.java create mode 100644 src/main/java/controller/LottoController.java rename src/main/java/inputView/{Price.java => PurchaseAmount.java} (68%) rename src/main/java/model/{LottoBusiness.java => LottoService.java} (81%) rename src/main/java/model/{LottoNumbersRepository.java => LottoTicketBundle.java} (79%) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index c1fccc428..f14d3a3ad 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,24 +1,30 @@ -import controller.AutoLottoController; -import inputView.Price; +import controller.LottoController; +import inputView.PurchaseAmount; +import model.LottoNumber; import model.LottoNumbers; -import model.LottoNumbersRepository; +import model.LottoTicketBundle; public class Main { public static void main(String[] args) { - AutoLottoController controller = new AutoLottoController(); + LottoController controller = new LottoController(); // 1. 구입 금액 입력 - Price money = controller.showPrice(); + PurchaseAmount purchaseAmount = controller.askPurchaseAmount(); - // 2. 로또 번호 생성 - LottoNumbersRepository allLotteries = controller.showLottoNumbers(money.howManyLottos()); + // 2. 수동 및 자동 로또 번호 생성 + LottoTicketBundle allTickets = controller.buyTickets(purchaseAmount.howManyLottos()); // 3. 당첨 번호 입력 - LottoNumbers lastLotto = controller.readLastLotto(); + LottoNumbers winningNumbers = controller.askWinningNumbers(); - // 4. 통계 출력 - controller.showLotteryStatistics(allLotteries.readLottoNumbersRepository() - , lastLotto.getNumbers() - , money.getValue()); + // 4. 보너스 볼 입력 + LottoNumber bonusBall = controller.askBonusBall(); + + // 5. 통계 출력 + controller.showStatistics(allTickets.readLottoNumbersRepository(), + winningNumbers.getNumbers(), + purchaseAmount.getValue(), + bonusBall + ); } } diff --git a/src/main/java/controller/AutoLottoController.java b/src/main/java/controller/AutoLottoController.java deleted file mode 100644 index f4080c9c6..000000000 --- a/src/main/java/controller/AutoLottoController.java +++ /dev/null @@ -1,81 +0,0 @@ -package controller; - -import inputView.InputView; -import inputView.OutputView; -import inputView.Price; -import model.*; - -import java.util.List; -import java.util.Map; - -public class AutoLottoController { - private final LottoBusiness lottoBusiness = new LottoBusiness(); - private final OutputView outView = new OutputView(); - private final InputView inputView = new InputView(); - - private Price readPrice() { - outView.printInputPrice(); - while (true) { - Price price = readPriceException(); - if (price != null) { - return price; - } - } - } - - private Price readPriceException() { - try { - return new Price(Integer.parseInt(inputView.inputPrice())); - } catch (NumberFormatException input) { - outView.printInvalidNumber(); - } catch (IllegalArgumentException input) { - outView.printInvalidPrice(); - } - return null; - } - - public Price showPrice() { - Price money = readPrice(); - outView.printPriceValue(money.getValue()); - System.out.println(); - return money; - } - - public LottoNumbersRepository showLottoNumbers(int ticketCount) { - outView.printManualTicketCount(); - int manualTicket = Integer.parseInt(inputView.inputManualTicket()); - System.out.println(); - int autoTicket = ticketCount - manualTicket; - outView.showManualTicketLottoNumber(); - List manualLottos = inputView.inputManualLottos(manualTicket); - System.out.println(); - LottoNumbersRepository manualRepository = lottoBusiness.createManualLottos(manualLottos); - LottoNumbersRepository autoRepository = lottoBusiness.createLottos(ticketCount); - outView.printBuyCount(manualTicket, autoTicket); - LottoNumbersRepository repository = lottoBusiness.mergeRepository(manualRepository, - autoRepository); - outView.printLottos(repository.readLottoNumbersRepository()); - System.out.println(); - return repository; - } - - public LottoNumbers readLastLotto() { - outView.printInputLastLotto(); - LottoNumbers lastLotto = lottoBusiness.createInputLotto(inputView.inputLastLotto()); - System.out.println(); - return lastLotto; - } - - public LottoNumber readBonusBall() { - outView.printBonusBall(); - LottoNumber bonusNumber = new LottoNumber(Integer.parseInt(inputView.inputBonusBall())); - System.out.println(); - return bonusNumber; - } - - public void showLotteryStatistics(List allLotteries, List lastLotto, int money, LottoNumber bonusBall) { - Map matchCounts = lottoBusiness.countMatchResults(allLotteries, lastLotto, bonusBall); - String profitRate = lottoBusiness.calculateProfitRrate(matchCounts, money); - outView.printLotteryStatistics(matchCounts, profitRate); - } -} diff --git a/src/main/java/controller/LottoController.java b/src/main/java/controller/LottoController.java new file mode 100644 index 000000000..c0d37477d --- /dev/null +++ b/src/main/java/controller/LottoController.java @@ -0,0 +1,85 @@ +package controller; + +import inputView.InputView; +import inputView.OutputView; +import inputView.PurchaseAmount; +import model.*; + +import java.util.List; +import java.util.Map; + +public class LottoController { + private final LottoService lottoService = new LottoService(); + private final OutputView outView = new OutputView(); + private final InputView inputView = new InputView(); + + private PurchaseAmount readPrice() { + outView.printInputPrice(); + while (true) { + PurchaseAmount purchaseAmount = readPriceException(); + if (purchaseAmount != null) { + return purchaseAmount; + } + } + } + + private PurchaseAmount readPriceException() { + try { + return new PurchaseAmount(Integer.parseInt(inputView.inputPrice())); + } catch (NumberFormatException input) { + outView.printInvalidNumber(); + } catch (IllegalArgumentException input) { + outView.printInvalidPrice(); + } + return null; + } + + public PurchaseAmount askPurchaseAmount() { + PurchaseAmount purchaseAmount = readPrice(); + outView.printPriceValue(purchaseAmount.getValue()); + System.out.println(); + return purchaseAmount; + } + + public LottoTicketBundle buyTickets(int ticketCount) { + outView.printManualTicketCount(); + int manualCount = Integer.parseInt(inputView.inputManualCount()); + int autoCount = ticketCount - manualCount; + System.out.println(); + + outView.printManualLottoNumbersPrompt(); + List manualLottos = inputView.inputManualLottos(manualCount); + System.out.println(); + + LottoTicketBundle manualTickets = lottoService.createManualLottos(manualLottos); + LottoTicketBundle autoTickets = lottoService.createLottos(autoCount); + + outView.printBuyCount(manualCount, autoCount); + + LottoTicketBundle allTickets = lottoService.mergeRepositories(manualTickets, + autoTickets); + outView.printLottos(allTickets.readLottoNumbersRepository()); + System.out.println(); + return allTickets; + } + + public LottoNumbers askWinningNumbers() { + outView.printInputWinningNumbers(); + LottoNumbers lastLotto = lottoService.createInputLotto(inputView.inputWinningNumbers()); + System.out.println(); + return lastLotto; + } + + public LottoNumber askBonusBall() { + outView.printBonusBall(); + LottoNumber bonusNumber = new LottoNumber(Integer.parseInt(inputView.inputBonusBall())); + System.out.println(); + return bonusNumber; + } + + public void showStatistics(List allTickets, List winningNumbers, int purchaseAmount, LottoNumber bonusBall) { + Map matchCounts = lottoService.countMatchResults(allTickets, winningNumbers, bonusBall); + String profitRate = lottoService.calculateProfitRate(matchCounts, purchaseAmount); + outView.printLotteryStatistics(matchCounts, profitRate); + } +} diff --git a/src/main/java/inputView/InputView.java b/src/main/java/inputView/InputView.java index 4372942dc..a0711856e 100644 --- a/src/main/java/inputView/InputView.java +++ b/src/main/java/inputView/InputView.java @@ -11,7 +11,7 @@ public String inputPrice() { return scanner.nextLine(); } - public String inputManualTicket() { + public String inputManualCount() { return scanner.nextLine(); } @@ -27,7 +27,7 @@ public String inputBonusBall() { return scanner.nextLine(); } - public String inputLastLotto() { + public String inputWinningNumbers() { return scanner.nextLine(); } } diff --git a/src/main/java/inputView/OutputView.java b/src/main/java/inputView/OutputView.java index 71c89c8a2..1f6c19e5f 100644 --- a/src/main/java/inputView/OutputView.java +++ b/src/main/java/inputView/OutputView.java @@ -1,8 +1,10 @@ package inputView; import model.LottoNumbers; +import model.MatchResult; import java.util.List; +import java.util.Map; public class OutputView { public void printInputPrice() { @@ -21,27 +23,40 @@ public void printPriceValue(int price) { System.out.println(price); } - public void printBuyCount(int count) { - System.out.println(count + "개를 구매했습니다."); + public void printBuyCount(int manualCount, int autoCount) { + System.out.println("수동으로 " + manualCount + "장, 자동으로 " + autoCount + "개를 구매했습니다."); } - public void printInputLastLotto() { + public void printInputWinningNumbers() { System.out.println("지난 주 당첨 번호를 입력해 주세요."); } - public void printLottos(List lottos) { - for (LottoNumbers lotto : lottos) { + public void printLottos(List Lottos) { + for (LottoNumbers lotto : Lottos) { System.out.println(lotto.getNumbers()); } } - public void printLotteryStatistics(int[] matchCounts, String profitRate) { + public void printManualTicketCount() { + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + } + + public void printManualLottoNumbersPrompt() { + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + } + + public void printBonusBall() { + System.out.println("보너스 볼을 입력해 주세요."); + } + + public void printLotteryStatistics(Map matchCounts, String profitRate) { System.out.println("당첨 통계"); System.out.println("---------"); - System.out.println("3개 일치 (5000원)- " + matchCounts[3] + "개"); - System.out.println("4개 일치 (50000원)- " + matchCounts[4] + "개"); - System.out.println("5개 일치 (150000원)- " + matchCounts[5] + "개"); - System.out.println("6개 일치 (2000000000원)- " + matchCounts[6] + "개"); + System.out.println("3개 일치 (5000원)- " + matchCounts.get(MatchResult.THREE) + "개"); + System.out.println("4개 일치 (50000원)- " + matchCounts.get(MatchResult.FOUR) + "개"); + System.out.println("5개 일치 (150000원)- " + matchCounts.get(MatchResult.FIVE) + "개"); + System.out.println("5개 일치, 보너스 볼 일치(30000000원)- " + matchCounts.get(MatchResult.FIVE_BONUS) + "개"); + System.out.println("6개 일치 (2000000000원)- " + matchCounts.get(MatchResult.SIX) + "개"); System.out.println("총 수익률은 " + profitRate + "입니다."); } } diff --git a/src/main/java/inputView/Price.java b/src/main/java/inputView/PurchaseAmount.java similarity index 68% rename from src/main/java/inputView/Price.java rename to src/main/java/inputView/PurchaseAmount.java index e32c6d27a..b92694547 100644 --- a/src/main/java/inputView/Price.java +++ b/src/main/java/inputView/PurchaseAmount.java @@ -2,15 +2,15 @@ import java.util.Objects; -public class Price { +public class PurchaseAmount { private final int value; - public Price(int value) { - vaildateNegative(value); + public PurchaseAmount(int value) { + validateNegative(value); this.value = value; } - private static void vaildateNegative(int value) { + private static void validateNegative(int value) { if (value < 0) { throw new IllegalArgumentException("구입 금액은 0원 이상입니다."); } @@ -27,8 +27,8 @@ public int howManyLottos() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof Price)) return false; - Price money = (Price) o; + if (!(o instanceof PurchaseAmount)) return false; + PurchaseAmount money = (PurchaseAmount) o; return value == money.value; } diff --git a/src/main/java/model/LottoBusiness.java b/src/main/java/model/LottoService.java similarity index 81% rename from src/main/java/model/LottoBusiness.java rename to src/main/java/model/LottoService.java index 73d94efcf..ed625a3c2 100644 --- a/src/main/java/model/LottoBusiness.java +++ b/src/main/java/model/LottoService.java @@ -2,14 +2,14 @@ import java.util.*; -public class LottoBusiness { +public class LottoService { private final LottoNumberGenerator generator; - public LottoBusiness() { + public LottoService() { this(new RandomLottoNumberGenerator()); } - public LottoBusiness(LottoNumberGenerator generator) { + public LottoService(LottoNumberGenerator generator) { this.generator = generator; } @@ -17,8 +17,8 @@ public LottoNumbers createOneLotto() { return generator.generate(); } - public LottoNumbersRepository createLottos(int count) { - LottoNumbersRepository repository = new LottoNumbersRepository(); + public LottoTicketBundle createLottos(int count) { + LottoTicketBundle repository = new LottoTicketBundle(); for (int i = 0; i < count; i++) { repository.addLottoNumbers(createOneLotto().sortNumbers()); } @@ -35,16 +35,16 @@ public LottoNumbers createInputLotto(String inputNumber) { return new LottoNumbers(numbers); } - public LottoNumbersRepository createManualLottos(List inputs) { - LottoNumbersRepository repository = new LottoNumbersRepository(); + public LottoTicketBundle createManualLottos(List inputs) { + LottoTicketBundle repository = new LottoTicketBundle(); for (String input : inputs) { repository.addLottoNumbers(createInputLotto(input)); } return repository; } - public LottoNumbersRepository mergeRepository(LottoNumbersRepository manual, LottoNumbersRepository auto) { - LottoNumbersRepository repository = new LottoNumbersRepository(); + public LottoTicketBundle mergeRepositories(LottoTicketBundle manual, LottoTicketBundle auto) { + LottoTicketBundle repository = new LottoTicketBundle(); for (LottoNumbers lotto : manual.readLottoNumbersRepository()) { repository.addLottoNumbers(lotto); } @@ -91,7 +91,7 @@ private boolean matchBonus(List oneLotto, LottoNumber bonusBall, in return false; } - public String calculateProfitRrate(Map matchCounts, int money) { + public String calculateProfitRate(Map matchCounts, int money) { double profitRate = 0; for (MatchResult result : matchCounts.keySet()) { profitRate += matchCounts.get(result) * result.getReward(); diff --git a/src/main/java/model/LottoNumbersRepository.java b/src/main/java/model/LottoTicketBundle.java similarity index 79% rename from src/main/java/model/LottoNumbersRepository.java rename to src/main/java/model/LottoTicketBundle.java index e361d7c5c..55e3bb1bc 100644 --- a/src/main/java/model/LottoNumbersRepository.java +++ b/src/main/java/model/LottoTicketBundle.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Objects; -public class LottoNumbersRepository { +public class LottoTicketBundle { private final List repository = new ArrayList<>(); public void addLottoNumbers(LottoNumbers lottoNumbers) { @@ -19,8 +19,8 @@ public List readLottoNumbersRepository() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof LottoNumbersRepository)) return false; - LottoNumbersRepository allLotteries = (LottoNumbersRepository) o; + if (!(o instanceof LottoTicketBundle)) return false; + LottoTicketBundle allLotteries = (LottoTicketBundle) o; return Objects.equals(repository, allLotteries.repository); } From fd6c52f3e5fb67b496f7e3e5ec4775e253b474dd Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 2 Oct 2025 14:50:03 +0900 Subject: [PATCH 37/59] =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=20=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{PriceTest.java => PurchaseAmountTest.java} | 16 ++++++++-------- ...itoryTest.java => LottoTicketBundleTest.java} | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) rename src/test/java/inputView/{PriceTest.java => PurchaseAmountTest.java} (59%) rename src/test/java/model/{LottoNumbersRepositoryTest.java => LottoTicketBundleTest.java} (84%) diff --git a/src/test/java/inputView/PriceTest.java b/src/test/java/inputView/PurchaseAmountTest.java similarity index 59% rename from src/test/java/inputView/PriceTest.java rename to src/test/java/inputView/PurchaseAmountTest.java index ea0566ee5..01be0f4c8 100644 --- a/src/test/java/inputView/PriceTest.java +++ b/src/test/java/inputView/PurchaseAmountTest.java @@ -5,15 +5,15 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -class PriceTest { +class PurchaseAmountTest { @Test void 올바른_금액이면_로또개수계산() { // given - Price price = new Price(2000); + PurchaseAmount purchaseAmount = new PurchaseAmount(2000); // when - int count = price.howManyLottos(); + int count = purchaseAmount.howManyLottos(); // then assertEquals(2, count); @@ -25,17 +25,17 @@ class PriceTest { int invalidMoney = -2000; // when & then - assertThrows(IllegalArgumentException.class, () -> new Price(invalidMoney)); + assertThrows(IllegalArgumentException.class, () -> new PurchaseAmount(invalidMoney)); } @Test void 같은금액이면_동일객체() { // given - Price price1 = new Price(6000); - Price price2 = new Price(6000); + PurchaseAmount purchaseAmount1 = new PurchaseAmount(6000); + PurchaseAmount purchaseAmount2 = new PurchaseAmount(6000); // when & then - assertEquals(price1, price2); - assertEquals(price1.hashCode(), price2.hashCode()); + assertEquals(purchaseAmount1, purchaseAmount2); + assertEquals(purchaseAmount1.hashCode(), purchaseAmount2.hashCode()); } } diff --git a/src/test/java/model/LottoNumbersRepositoryTest.java b/src/test/java/model/LottoTicketBundleTest.java similarity index 84% rename from src/test/java/model/LottoNumbersRepositoryTest.java rename to src/test/java/model/LottoTicketBundleTest.java index 119d68f50..fe00afe5a 100644 --- a/src/test/java/model/LottoNumbersRepositoryTest.java +++ b/src/test/java/model/LottoTicketBundleTest.java @@ -7,12 +7,12 @@ import static org.junit.jupiter.api.Assertions.*; -class LottoNumbersRepositoryTest { +class LottoTicketBundleTest { @Test void 저장소에_로또번호를_추가하면_읽을때_사이즈가_증가한다() { // given - LottoNumbersRepository repository = new LottoNumbersRepository(); + LottoTicketBundle repository = new LottoTicketBundle(); LottoNumbers lottoNumbers = new LottoNumbers(Arrays.asList( new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), new LottoNumber(4), new LottoNumber(5), new LottoNumber(6))); @@ -27,8 +27,8 @@ class LottoNumbersRepositoryTest { @Test void 같은로또묶음들을가지면_동일한저장소다() { // Given - LottoNumbersRepository re1 = new LottoNumbersRepository(); - LottoNumbersRepository re2 = new LottoNumbersRepository(); + LottoTicketBundle re1 = new LottoTicketBundle(); + LottoTicketBundle re2 = new LottoTicketBundle(); LottoNumbers lotto = new LottoNumbers(List.of( new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), From 87965f2e04d98917825daa7621b6366291952a35 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 2 Oct 2025 14:51:23 +0900 Subject: [PATCH 38/59] =?UTF-8?q?test:=20=EB=B3=B4=EB=84=88=EC=8A=A4?= =?UTF-8?q?=EB=B3=BC=20=ED=8F=AC=ED=95=A8=20=EC=BC=80=EC=9D=B4=EC=8A=A4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...usinessTest.java => LottoServiceTest.java} | 40 +++++++++++++++---- 1 file changed, 32 insertions(+), 8 deletions(-) rename src/test/java/model/{LottoBusinessTest.java => LottoServiceTest.java} (63%) diff --git a/src/test/java/model/LottoBusinessTest.java b/src/test/java/model/LottoServiceTest.java similarity index 63% rename from src/test/java/model/LottoBusinessTest.java rename to src/test/java/model/LottoServiceTest.java index 7d8f03530..1358a50b0 100644 --- a/src/test/java/model/LottoBusinessTest.java +++ b/src/test/java/model/LottoServiceTest.java @@ -7,14 +7,14 @@ import static org.junit.jupiter.api.Assertions.*; -class LottoBusinessTest { - private final LottoBusiness business = new LottoBusiness(); +class LottoServiceTest { + private final LottoService business = new LottoService(); @Test void 고정된로또가_생성된다() { // Given - LottoBusiness business = - new LottoBusiness(new FixedLottoNumberGenerator(List.of(1, 2, 3, 4, 5, 6))); + LottoService business = + new LottoService(new FixedLottoNumberGenerator(List.of(1, 2, 3, 4, 5, 6))); // When LottoNumbers lotto = business.createOneLotto(); @@ -30,7 +30,7 @@ class LottoBusinessTest { int count = 3; // When - LottoNumbersRepository re = business.createLottos(count); + LottoTicketBundle re = business.createLottos(count); // Then assertEquals(count, re.readLottoNumbersRepository().size()); @@ -44,7 +44,7 @@ class LottoBusinessTest { String input = "1, 2,3, 4 ,5,6"; // When - LottoNumbers last = business.createLastLotto(input); + LottoNumbers last = business.createInputLotto(input); // Then assertEquals(6, last.getNumbers().size()); @@ -63,10 +63,11 @@ class LottoBusinessTest { new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), new LottoNumber(4), new LottoNumber(7), new LottoNumber(8) )); + LottoNumber bonus = new LottoNumber(9); // When Map result = - business.countMatchResults(List.of(mine), last.getNumbers()); + business.countMatchResults(List.of(mine), last.getNumbers(), bonus); // Then assertEquals(1, result.get(MatchResult.FOUR)); @@ -82,14 +83,37 @@ class LottoBusinessTest { MatchResult.TWO, 0, MatchResult.FOUR, 0, MatchResult.FIVE, 0, + MatchResult.FIVE_BONUS, 0, MatchResult.SIX, 0 ); + LottoNumber bonus = new LottoNumber(7); int money = 1000; // When - String rate = business.calculateProfitRrate(matchCounts, money); + String rate = business.calculateProfitRate(matchCounts, money); // Then assertEquals("5.00", rate); } + + @Test + void 보너스볼까지_맞추면_FIVE_BONUS로_집계된다() { + // Given + LottoNumbers mine = new LottoNumbers(List.of( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(7) + )); + LottoNumbers winning = new LottoNumbers(List.of( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) + )); + LottoNumber bonus = new LottoNumber(7); + + // When + Map result = + business.countMatchResults(List.of(mine), winning.getNumbers(), bonus); + + // Then + assertEquals(1, result.get(MatchResult.FIVE_BONUS)); + } } From 3c5d1a1b23732f202348a5c832d897b62b5960c3 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 2 Oct 2025 15:10:36 +0900 Subject: [PATCH 39/59] =?UTF-8?q?buyTickets=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=20=EC=B1=85=EC=9E=84=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LottoController.java | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/src/main/java/controller/LottoController.java b/src/main/java/controller/LottoController.java index c0d37477d..78c6c03ad 100644 --- a/src/main/java/controller/LottoController.java +++ b/src/main/java/controller/LottoController.java @@ -17,9 +17,7 @@ private PurchaseAmount readPrice() { outView.printInputPrice(); while (true) { PurchaseAmount purchaseAmount = readPriceException(); - if (purchaseAmount != null) { - return purchaseAmount; - } + if (purchaseAmount != null) return purchaseAmount; } } @@ -42,25 +40,37 @@ public PurchaseAmount askPurchaseAmount() { } public LottoTicketBundle buyTickets(int ticketCount) { + int manualCount = requestManualTicketCount(); + int autoCount = calculateAutoCount(ticketCount, manualCount); + + LottoTicketBundle tickets = generateTickets(manualCount, autoCount); + displayTickets(manualCount, autoCount, tickets); + + return tickets; + } + + private int requestManualTicketCount() { outView.printManualTicketCount(); - int manualCount = Integer.parseInt(inputView.inputManualCount()); - int autoCount = ticketCount - manualCount; - System.out.println(); + return Integer.parseInt(inputView.inputManualCount()); + } + private int calculateAutoCount(int totalTickets, int manualCount) { + return totalTickets - manualCount; + } + + private LottoTicketBundle generateTickets(int manualCount, int autoCount) { outView.printManualLottoNumbersPrompt(); - List manualLottos = inputView.inputManualLottos(manualCount); - System.out.println(); + List manualInputs = inputView.inputManualLottos(manualCount); - LottoTicketBundle manualTickets = lottoService.createManualLottos(manualLottos); + LottoTicketBundle manualTickets = lottoService.createManualLottos(manualInputs); LottoTicketBundle autoTickets = lottoService.createLottos(autoCount); - outView.printBuyCount(manualCount, autoCount); + return lottoService.mergeRepositories(manualTickets, autoTickets); + } - LottoTicketBundle allTickets = lottoService.mergeRepositories(manualTickets, - autoTickets); - outView.printLottos(allTickets.readLottoNumbersRepository()); - System.out.println(); - return allTickets; + private void displayTickets(int manualCount, int autoCount, LottoTicketBundle tickets) { + outView.printBuyCount(manualCount, autoCount); + outView.printLottos(tickets.readLottoNumbersRepository()); } public LottoNumbers askWinningNumbers() { From eb187e48943a07f48b49c2e4ff1d4d5199199ef5 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 2 Oct 2025 15:15:26 +0900 Subject: [PATCH 40/59] =?UTF-8?q?createInputLotto,=20countMatchResults=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=A1=9C=EC=A7=81=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoService.java | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/main/java/model/LottoService.java b/src/main/java/model/LottoService.java index ed625a3c2..5f22b751e 100644 --- a/src/main/java/model/LottoService.java +++ b/src/main/java/model/LottoService.java @@ -26,13 +26,17 @@ public LottoTicketBundle createLottos(int count) { } public LottoNumbers createInputLotto(String inputNumber) { + List numbers = parseInputToNumbers(inputNumber); + return new LottoNumbers(numbers); + } + + private List parseInputToNumbers(String inputNumber) { + String[] rawNumbers = inputNumber.split(","); List numbers = new ArrayList<>(); - String[] lastNumbers = inputNumber.split(","); - for (int i = 0; i < lastNumbers.length; i++) { - lastNumbers[i] = lastNumbers[i].trim(); - numbers.add(new LottoNumber(Integer.parseInt(lastNumbers[i]))); + for (String raw : rawNumbers) { + numbers.add(new LottoNumber(Integer.parseInt(raw.trim()))); } - return new LottoNumbers(numbers); + return numbers; } public LottoTicketBundle createManualLottos(List inputs) { @@ -58,10 +62,7 @@ public LottoTicketBundle mergeRepositories(LottoTicketBundle manual, LottoTicket public Map countMatchResults(List allLotteries, List lastLotto, LottoNumber bonusBall) { - Map matchCounts = new EnumMap<>(MatchResult.class); - for (MatchResult result : MatchResult.values()) { - matchCounts.put(result, 0); - } + Map matchCounts = initializeMatchCounts(); for (LottoNumbers oneLotto : allLotteries) { int count = matchLottoNumber(oneLotto.getNumbers(), lastLotto); boolean bonusMatch = matchBonus(oneLotto.getNumbers(), bonusBall, count); @@ -71,6 +72,14 @@ public Map countMatchResults(List allLotteri return matchCounts; } + private Map initializeMatchCounts() { + Map counts = new EnumMap<>(MatchResult.class); + for (MatchResult result : MatchResult.values()) { + counts.put(result, 0); + } + return counts; + } + private int matchLottoNumber(List oneLotto, List lastLotto) { List lastNumbers = lastLotto.stream() .map(LottoNumber::getNumber) From 6d474381f86dedebdab06d1457c2076e424bf344 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 2 Oct 2025 15:30:33 +0900 Subject: [PATCH 41/59] =?UTF-8?q?README=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/README.md | 54 +++++++-------------------------------------------- 1 file changed, 7 insertions(+), 47 deletions(-) diff --git a/src/README.md b/src/README.md index 983bf1262..a6b722e5d 100644 --- a/src/README.md +++ b/src/README.md @@ -1,52 +1,5 @@ # 로또 미션 -## 클래스 구성 - -### controller - -- **RaceLotto** - 로또 게임 전체 실행 흐름 관리 (금액 입력 → 로또 번호 생성 → 당첨 번호 입력 → 통계 출력) -- **RaceLottoMethod** - 구입 금액 검증·로또 번호 생성·당첨 번호 입력·통계 산출 등 비즈니스 로직 수행 - -### inputView (View) - -- **InputView** - 구입 금액과 지난 주 당첨 번호 입력 받기 -- **OutputView** - 금액 안내, 구매 수량, 로또 번호, 당첨 통계 출력 -- **Price** - 구입 금액을 값 객체로 포장 (0원 이상 검증, 로또 구매 개수 계산) - -### model (Domain) - -- **LottoNumber** - 1~45 사이 번호 하나를 원시값 포장 (범위 검증) -- **LottoNumbers** - LottoNumber 6개를 모은 일급 컬렉션 (6개 검증, 정렬, 불변 리스트) -- **LottoNumbersRepository** - 여러 장의 LottoNumbers를 저장·조회하는 저장소 (읽기 전용 리스트 반환) - -### util (Utility / Strategy) - -- **LottoNumberGenerator (interface)** - 로또 번호 생성 전략 인터페이스 -- **RandomLottoNumberGenerator (implementation)** - 1~45 번호를 섞어 6개를 랜덤으로 생성하는 기본 구현체 - -### Main - -- **Main** - 프로그램 엔트리 포인트 - -### test (JUnit5 단위 테스트) - -- **PriceTest** — 값 객체 생성·예외·로또 개수 계산 테스트 -- **LottoNumberTest** — 원시값 포장(범위 검증) 테스트 -- **LottoNumbersTest** — 일급 컬렉션 생성·예외·불변 리스트·정렬 기능 테스트 -- **LottoNumbersRepositoryTest** — 저장소 추가·조회·불변 리스트 테스트 -- **RandomLottoNumberGeneratorTest** — 랜덤 생성기가 6개 번호를 반환하는지 테스트 - ## 기능 요구사항 - 로또 당첨 번호를 받아 일치한 번호 수에 따라 당첨 결과를 보여준다. @@ -56,3 +9,10 @@ - 모든 원시 값과 문자열을 포장한다. - 일급 컬렉션을 쓴다. +## 추가 기능 요구사항 + +- 2등을 위한 보너스볼을 추첨한다. +- 당첨 통계에 2등을 추가한다. +- 2등 당첨 조건은 당첨 번호 5개 + 보너스 볼이다 +- 사용자가 수동으로 추첨 번호를 입력할 수 있도록 해야 한다. +- 입력한 금액, 자동 생성 숫자, 수동 생성 번호를 입력하도록 해야 한다. From de36cc95572032a840ffd6d63ed7599dccf92451 Mon Sep 17 00:00:00 2001 From: taewoo Date: Wed, 8 Oct 2025 22:34:43 +0900 Subject: [PATCH 42/59] =?UTF-8?q?=EC=99=80=EC=9D=BC=EB=93=9C=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20import=20=EC=A0=9C=EA=B1=B0,=20InputView=20?= =?UTF-8?q?=ED=8C=A8=ED=82=A4=EC=A7=80=EB=AA=85=20=EB=B0=8F=20mergeReposit?= =?UTF-8?q?ories=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=AA=85=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 2 +- src/main/java/controller/LottoController.java | 15 ++++++++++----- src/main/java/model/LottoService.java | 8 ++++++-- src/main/java/{inputView => view}/InputView.java | 2 +- src/main/java/{inputView => view}/OutputView.java | 2 +- .../java/{inputView => view}/PurchaseAmount.java | 2 +- 6 files changed, 20 insertions(+), 11 deletions(-) rename src/main/java/{inputView => view}/InputView.java (97%) rename src/main/java/{inputView => view}/OutputView.java (99%) rename src/main/java/{inputView => view}/PurchaseAmount.java (97%) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index f14d3a3ad..8d847365b 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,5 +1,5 @@ import controller.LottoController; -import inputView.PurchaseAmount; +import view.PurchaseAmount; import model.LottoNumber; import model.LottoNumbers; import model.LottoTicketBundle; diff --git a/src/main/java/controller/LottoController.java b/src/main/java/controller/LottoController.java index 78c6c03ad..a943bd9ef 100644 --- a/src/main/java/controller/LottoController.java +++ b/src/main/java/controller/LottoController.java @@ -1,9 +1,14 @@ package controller; -import inputView.InputView; -import inputView.OutputView; -import inputView.PurchaseAmount; -import model.*; +import view.InputView; +import view.OutputView; +import view.PurchaseAmount; +import model.LottoNumber; +import model.LottoNumbers; +import model.LottoService; +import model.LottoTicketBundle; +import model.MatchResult; + import java.util.List; import java.util.Map; @@ -65,7 +70,7 @@ private LottoTicketBundle generateTickets(int manualCount, int autoCount) { LottoTicketBundle manualTickets = lottoService.createManualLottos(manualInputs); LottoTicketBundle autoTickets = lottoService.createLottos(autoCount); - return lottoService.mergeRepositories(manualTickets, autoTickets); + return lottoService.mergeAutoAndManualLottos(manualTickets, autoTickets); } private void displayTickets(int manualCount, int autoCount, LottoTicketBundle tickets) { diff --git a/src/main/java/model/LottoService.java b/src/main/java/model/LottoService.java index 5f22b751e..693572934 100644 --- a/src/main/java/model/LottoService.java +++ b/src/main/java/model/LottoService.java @@ -1,6 +1,10 @@ package model; -import java.util.*; + +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; public class LottoService { private final LottoNumberGenerator generator; @@ -47,7 +51,7 @@ public LottoTicketBundle createManualLottos(List inputs) { return repository; } - public LottoTicketBundle mergeRepositories(LottoTicketBundle manual, LottoTicketBundle auto) { + public LottoTicketBundle mergeAutoAndManualLottos(LottoTicketBundle manual, LottoTicketBundle auto) { LottoTicketBundle repository = new LottoTicketBundle(); for (LottoNumbers lotto : manual.readLottoNumbersRepository()) { repository.addLottoNumbers(lotto); diff --git a/src/main/java/inputView/InputView.java b/src/main/java/view/InputView.java similarity index 97% rename from src/main/java/inputView/InputView.java rename to src/main/java/view/InputView.java index a0711856e..5919c61c7 100644 --- a/src/main/java/inputView/InputView.java +++ b/src/main/java/view/InputView.java @@ -1,4 +1,4 @@ -package inputView; +package view; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/inputView/OutputView.java b/src/main/java/view/OutputView.java similarity index 99% rename from src/main/java/inputView/OutputView.java rename to src/main/java/view/OutputView.java index 1f6c19e5f..4cf724083 100644 --- a/src/main/java/inputView/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,4 +1,4 @@ -package inputView; +package view; import model.LottoNumbers; import model.MatchResult; diff --git a/src/main/java/inputView/PurchaseAmount.java b/src/main/java/view/PurchaseAmount.java similarity index 97% rename from src/main/java/inputView/PurchaseAmount.java rename to src/main/java/view/PurchaseAmount.java index b92694547..9d85a01a8 100644 --- a/src/main/java/inputView/PurchaseAmount.java +++ b/src/main/java/view/PurchaseAmount.java @@ -1,4 +1,4 @@ -package inputView; +package view; import java.util.Objects; From 23939072b6f5e680987b5cd356aa430847b741e6 Mon Sep 17 00:00:00 2001 From: taewoo Date: Wed, 8 Oct 2025 22:42:02 +0900 Subject: [PATCH 43/59] =?UTF-8?q?LottoNumbers=20getter=EC=9D=98=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EB=B6=88=EB=B3=80=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=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/model/LottoNumbers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/LottoNumbers.java b/src/main/java/model/LottoNumbers.java index 6ca7d66ac..f1d2cfe48 100644 --- a/src/main/java/model/LottoNumbers.java +++ b/src/main/java/model/LottoNumbers.java @@ -23,7 +23,7 @@ public LottoNumbers sortNumbers() { } public List getNumbers() { - return Collections.unmodifiableList(numbers); + return numbers; } @Override From b32bfa9039790b9c5e86884aa05d0f2312d01c9b Mon Sep 17 00:00:00 2001 From: taewoo Date: Wed, 8 Oct 2025 22:53:26 +0900 Subject: [PATCH 44/59] =?UTF-8?q?matchLottoNumber=EC=9D=98=20if=EB=AC=B8?= =?UTF-8?q?=20=EB=82=B4=EB=B6=80=20=EB=A1=9C=EC=A7=81=EC=9D=84=20containsN?= =?UTF-8?q?umber=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A1=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EC=97=AC=20depth=20=EA=B0=90=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoService.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/model/LottoService.java b/src/main/java/model/LottoService.java index 693572934..e592422d3 100644 --- a/src/main/java/model/LottoService.java +++ b/src/main/java/model/LottoService.java @@ -90,13 +90,16 @@ private int matchLottoNumber(List oneLotto, List lastL .toList(); int matchCount = 0; for (LottoNumber number : oneLotto) { - if (lastNumbers.contains(number.getNumber())) { - matchCount++; - } + matchCount += containsNumber(lastNumbers, number); } return matchCount; } + private int containsNumber(List lastNumbers, LottoNumber number) { + if (lastNumbers.contains(number.getNumber())) return 1; + return 0; + } + private boolean matchBonus(List oneLotto, LottoNumber bonusBall, int count) { if (count == 5) { return oneLotto.contains(bonusBall); From 28647f0b880663abbe6ba5d8cd68681313d4ec45 Mon Sep 17 00:00:00 2001 From: taewoo Date: Wed, 8 Oct 2025 22:56:03 +0900 Subject: [PATCH 45/59] =?UTF-8?q?MatchResult=20enum=EC=9D=98=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20description=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=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/model/MatchResult.java | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/main/java/model/MatchResult.java b/src/main/java/model/MatchResult.java index 8f8557c6f..11a012807 100644 --- a/src/main/java/model/MatchResult.java +++ b/src/main/java/model/MatchResult.java @@ -1,22 +1,20 @@ package model; public enum MatchResult { - ZERO(0, "0개 일치", 0), - ONE(1, "1개 일치", 0), - TWO(2, "2개 일치", 0), - THREE(3, "3개 일치", 5000), - FOUR(4, "4개 일치", 50000), - FIVE(5, "5개 일치", 150000), - FIVE_BONUS(5, "5개 + 보너스 일치", 30000000), - SIX(6, "6개 일치", 2000000000); + ZERO(0, 0), + ONE(1, 0), + TWO(2, 0), + THREE(3, 5000), + FOUR(4, 50000), + FIVE(5, 150000), + FIVE_BONUS(5, 30000000), + SIX(6, 2000000000); private final int count; - private final String description; private final int reward; - MatchResult(int count, String description, int reward) { + MatchResult(int count, int reward) { this.count = count; - this.description = description; this.reward = reward; } @@ -24,10 +22,6 @@ public int getCount() { return count; } - public String getDescription() { - return description; - } - public int getReward() { return reward; } From 579c2f3fa900428a806b0879bc7a393d285b01d3 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 9 Oct 2025 03:29:30 +0900 Subject: [PATCH 46/59] =?UTF-8?q?fromCount=EC=9D=98=20for=EB=AC=B8=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=9D=84=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=84=EB=A6=AC=ED=95=98=EC=97=AC=20depth=20?= =?UTF-8?q?=EA=B0=90=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/MatchResult.java | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/main/java/model/MatchResult.java b/src/main/java/model/MatchResult.java index 11a012807..75accd3ed 100644 --- a/src/main/java/model/MatchResult.java +++ b/src/main/java/model/MatchResult.java @@ -30,9 +30,25 @@ public static MatchResult fromCount(int count, boolean bonusMatch) { if (count == 5 && bonusMatch) { return FIVE_BONUS; } - for (MatchResult result : values()) { - if (result.count == count && result != FIVE_BONUS) return result; + + MatchResult[] results = values(); + return findMatchResult(results, count); + } + + private static MatchResult findMatchResult(MatchResult[] results, int count) { + int i = 0; + while (i < results.length && !isMatched(results[i], count)) { + i++; + } + + if (i == results.length) { + return ZERO; } - return ZERO; + + return results[i]; + } + + private static boolean isMatched(MatchResult result, int count) { + return result.count == count && result != FIVE_BONUS; } } From 450573a22eac066d419732b4ff680bd285a63946 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 9 Oct 2025 03:55:26 +0900 Subject: [PATCH 47/59] =?UTF-8?q?FixedLottoNumberGenerator=20=EC=98=88?= =?UTF-8?q?=EC=99=B8=20=EC=83=81=ED=99=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/FixedLottoNumberGeneratorTest.java | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/test/java/model/FixedLottoNumberGeneratorTest.java b/src/test/java/model/FixedLottoNumberGeneratorTest.java index 60b7121bd..1ee270942 100644 --- a/src/test/java/model/FixedLottoNumberGeneratorTest.java +++ b/src/test/java/model/FixedLottoNumberGeneratorTest.java @@ -18,8 +18,27 @@ class FixedLottoNumberGeneratorTest { LottoNumbers lotto = generator.generate(); // Then - // LottoNumbers.getNumbers()는 LottoNumber 객체들이라서 - // 그대로 toString()해서 비교하면 간단해짐 assertEquals(input.toString(), lotto.getNumbers().toString()); } + + @Test + void 숫자가_6개가_아니면_예외가_발생한다() { + // Given + List input = List.of(1, 2, 3, 4, 5); + + // When & Then + assertThrows(IllegalArgumentException.class, + () -> new FixedLottoNumberGenerator(input)); + } + + @Test + void 숫자가_1에서_45범위를_벗어나면_예외가_발생한다() { + // Given + List input = List.of(1, 2, 3, 4, 5, 46); + + // When & Then + assertThrows(IllegalArgumentException.class, + () -> new FixedLottoNumberGenerator(input)); + } + } From 022567f6547c1e579c612eef6a1f864d66782619 Mon Sep 17 00:00:00 2001 From: taewoo Date: Thu, 9 Oct 2025 05:28:16 +0900 Subject: [PATCH 48/59] =?UTF-8?q?Fixture=20=EC=A0=81=EC=9A=A9=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20=EA=B0=80=EB=8F=85=EC=84=B1=20?= =?UTF-8?q?=ED=96=A5=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/LottoFixture.java | 32 +++++++++++++++++++ src/test/java/model/LottoNumbersTest.java | 15 +++------ src/test/java/model/LottoServiceTest.java | 29 ++++++----------- .../java/model/LottoTicketBundleTest.java | 16 +++------- .../model/RandomLottoNumberGeneratorTest.java | 15 --------- .../PurchaseAmountTest.java | 2 +- 6 files changed, 51 insertions(+), 58 deletions(-) create mode 100644 src/test/java/model/LottoFixture.java delete mode 100644 src/test/java/model/RandomLottoNumberGeneratorTest.java rename src/test/java/{inputView => view}/PurchaseAmountTest.java (98%) diff --git a/src/test/java/model/LottoFixture.java b/src/test/java/model/LottoFixture.java new file mode 100644 index 000000000..ae4027d7c --- /dev/null +++ b/src/test/java/model/LottoFixture.java @@ -0,0 +1,32 @@ +package model; + +import java.util.List; + +public class LottoFixture { + + // 기본 1~6 로또 + public static LottoNumbers 기본로또() { + return new LottoNumbers(List.of( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) + )); + } + + // 보너스볼(7) 포함된 로또 + public static LottoNumbers 보너스7포함로또() { + return new LottoNumbers(List.of( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(5), new LottoNumber(7) + )); + } + + // 4개 일치 로또 (1~4 일치) + public static LottoNumbers 네개일치로또() { + return new LottoNumbers(List.of( + new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), + new LottoNumber(4), new LottoNumber(7), new LottoNumber(8) + )); + } +} + + diff --git a/src/test/java/model/LottoNumbersTest.java b/src/test/java/model/LottoNumbersTest.java index e34922f8a..85c42cd2f 100644 --- a/src/test/java/model/LottoNumbersTest.java +++ b/src/test/java/model/LottoNumbersTest.java @@ -5,6 +5,8 @@ import java.util.Arrays; import java.util.List; + +import static model.LottoFixture.기본로또; import static org.junit.jupiter.api.Assertions.*; class LottoNumbersTest { @@ -39,21 +41,14 @@ class LottoNumbersTest { LottoNumbers sorted = new LottoNumbers(numbers).sortNumbers(); - assertEquals(Arrays.asList(1, 2, 3, 4, 5, 6), - sorted.getNumbers().stream().map(LottoNumber::getNumber).toList()); + assertEquals(기본로또(), sorted); } @Test void 같은번호면_동일한객체() { // Given - LottoNumbers lotto1 = new LottoNumbers(List.of( - new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) - )); - LottoNumbers lotto2 = new LottoNumbers(List.of( - new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) - )); + LottoNumbers lotto1 = 기본로또(); + LottoNumbers lotto2 = 기본로또(); // When & Then assertEquals(lotto1, lotto2); diff --git a/src/test/java/model/LottoServiceTest.java b/src/test/java/model/LottoServiceTest.java index 1358a50b0..b47d9964f 100644 --- a/src/test/java/model/LottoServiceTest.java +++ b/src/test/java/model/LottoServiceTest.java @@ -5,6 +5,9 @@ import java.util.List; import java.util.Map; +import static model.LottoFixture.기본로또; +import static model.LottoFixture.네개일치로또; +import static model.LottoFixture.보너스7포함로또; import static org.junit.jupiter.api.Assertions.*; class LottoServiceTest { @@ -20,8 +23,7 @@ class LottoServiceTest { LottoNumbers lotto = business.createOneLotto(); // Then - assertEquals(List.of(1, 2, 3, 4, 5, 6), - lotto.getNumbers().stream().map(LottoNumber::getNumber).toList()); + assertEquals(기본로또(), lotto); } @Test @@ -48,21 +50,14 @@ class LottoServiceTest { // Then assertEquals(6, last.getNumbers().size()); - assertEquals(List.of(1, 2, 3, 4, 5, 6), - last.getNumbers().stream().map(LottoNumber::getNumber).toList()); + assertEquals(기본로또(), last); } @Test void countMatchResults_4개일치면_FOUR가_1로_집계된다() { // Given - LottoNumbers mine = new LottoNumbers(List.of( - new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) - )); - LottoNumbers last = new LottoNumbers(List.of( - new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(7), new LottoNumber(8) - )); + LottoNumbers mine = 기본로또(); + LottoNumbers last = 네개일치로또(); LottoNumber bonus = new LottoNumber(9); // When @@ -99,14 +94,8 @@ class LottoServiceTest { @Test void 보너스볼까지_맞추면_FIVE_BONUS로_집계된다() { // Given - LottoNumbers mine = new LottoNumbers(List.of( - new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(7) - )); - LottoNumbers winning = new LottoNumbers(List.of( - new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) - )); + LottoNumbers mine = 보너스7포함로또(); + LottoNumbers winning = 기본로또(); LottoNumber bonus = new LottoNumber(7); // When diff --git a/src/test/java/model/LottoTicketBundleTest.java b/src/test/java/model/LottoTicketBundleTest.java index fe00afe5a..765a86ada 100644 --- a/src/test/java/model/LottoTicketBundleTest.java +++ b/src/test/java/model/LottoTicketBundleTest.java @@ -5,6 +5,7 @@ import java.util.Arrays; import java.util.List; +import static model.LottoFixture.기본로또; import static org.junit.jupiter.api.Assertions.*; class LottoTicketBundleTest { @@ -13,9 +14,7 @@ class LottoTicketBundleTest { void 저장소에_로또번호를_추가하면_읽을때_사이즈가_증가한다() { // given LottoTicketBundle repository = new LottoTicketBundle(); - LottoNumbers lottoNumbers = new LottoNumbers(Arrays.asList( - new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(6))); + LottoNumbers lottoNumbers = 기본로또(); // when repository.addLottoNumbers(lottoNumbers); @@ -30,16 +29,9 @@ class LottoTicketBundleTest { LottoTicketBundle re1 = new LottoTicketBundle(); LottoTicketBundle re2 = new LottoTicketBundle(); - LottoNumbers lotto = new LottoNumbers(List.of( - new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) - )); - re1.addLottoNumbers(lotto); - re2.addLottoNumbers(new LottoNumbers(List.of( - new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), - new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) - ))); + re1.addLottoNumbers(기본로또()); + re2.addLottoNumbers(기본로또()); // When & Then assertEquals(re1, re2); diff --git a/src/test/java/model/RandomLottoNumberGeneratorTest.java b/src/test/java/model/RandomLottoNumberGeneratorTest.java deleted file mode 100644 index fd3c244ba..000000000 --- a/src/test/java/model/RandomLottoNumberGeneratorTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package model; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.*; - -class RandomLottoNumberGeneratorTest { - - @Test - void 랜덤생성기는_항상_6개의_번호를_만든다() { - RandomLottoNumberGenerator generator = new RandomLottoNumberGenerator(); - LottoNumbers lottoNumbers = generator.generate(); - assertEquals(6, lottoNumbers.getNumbers().size()); - } -} diff --git a/src/test/java/inputView/PurchaseAmountTest.java b/src/test/java/view/PurchaseAmountTest.java similarity index 98% rename from src/test/java/inputView/PurchaseAmountTest.java rename to src/test/java/view/PurchaseAmountTest.java index 01be0f4c8..c651de582 100644 --- a/src/test/java/inputView/PurchaseAmountTest.java +++ b/src/test/java/view/PurchaseAmountTest.java @@ -1,4 +1,4 @@ -package inputView; +package view; import org.junit.jupiter.api.Test; From fb04843ebd77a99ea2c9fe174cfa50f4823b2fda Mon Sep 17 00:00:00 2001 From: taewoo Date: Sun, 12 Oct 2025 03:10:04 +0900 Subject: [PATCH 49/59] =?UTF-8?q?=EB=B9=88=EC=A4=84=20=EC=B6=9C=EB=A0=A5?= =?UTF-8?q?=EC=9D=84printBlankLine()=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 +++++ src/main/java/view/OutputView.java | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/build.gradle b/build.gradle index 239f9e785..4d9ca3fc8 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ plugins { id 'java' + id 'org.jetbrains.kotlin.jvm' } group = 'cholog' @@ -14,8 +15,12 @@ dependencies { testImplementation platform('org.assertj:assertj-bom:3.25.1') testImplementation('org.junit.jupiter:junit-jupiter') testImplementation('org.assertj:assertj-core') + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } test { useJUnitPlatform() } +kotlin { + jvmToolchain(17) +} diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 4cf724083..877faf39e 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -49,6 +49,10 @@ public void printBonusBall() { System.out.println("보너스 볼을 입력해 주세요."); } + public void printBlankLine(){ + System.out.println(); + } + public void printLotteryStatistics(Map matchCounts, String profitRate) { System.out.println("당첨 통계"); System.out.println("---------"); From e1680af746879ad6c97b90a6141d52ac2630469e Mon Sep 17 00:00:00 2001 From: taewoo Date: Sun, 12 Oct 2025 03:49:25 +0900 Subject: [PATCH 50/59] =?UTF-8?q?LottoNumbers=20=E2=86=92=20LottoTicket=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20equals/ha?= =?UTF-8?q?shCode=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/Main.java | 4 ++-- src/main/java/controller/LottoController.java | 14 ++++++------- .../java/model/FixedLottoNumberGenerator.java | 4 ++-- src/main/java/model/LottoNumberGenerator.java | 2 +- src/main/java/model/LottoService.java | 14 ++++++------- .../{LottoNumbers.java => LottoTicket.java} | 20 ++++--------------- src/main/java/model/LottoTicketBundle.java | 20 ++++--------------- .../model/RandomLottoNumberGenerator.java | 4 ++-- src/main/java/view/OutputView.java | 6 +++--- .../model/FixedLottoNumberGeneratorTest.java | 2 +- src/test/java/model/LottoFixture.java | 12 +++++------ src/test/java/model/LottoServiceTest.java | 12 +++++------ .../java/model/LottoTicketBundleTest.java | 7 ++----- ...oNumbersTest.java => LottoTicketTest.java} | 14 ++++++------- 14 files changed, 54 insertions(+), 81 deletions(-) rename src/main/java/model/{LottoNumbers.java => LottoTicket.java} (53%) rename src/test/java/model/{LottoNumbersTest.java => LottoTicketTest.java} (78%) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 8d847365b..2acd6fa27 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,7 +1,7 @@ import controller.LottoController; import view.PurchaseAmount; import model.LottoNumber; -import model.LottoNumbers; +import model.LottoTicket; import model.LottoTicketBundle; public class Main { @@ -15,7 +15,7 @@ public static void main(String[] args) { LottoTicketBundle allTickets = controller.buyTickets(purchaseAmount.howManyLottos()); // 3. 당첨 번호 입력 - LottoNumbers winningNumbers = controller.askWinningNumbers(); + LottoTicket winningNumbers = controller.askWinningNumbers(); // 4. 보너스 볼 입력 LottoNumber bonusBall = controller.askBonusBall(); diff --git a/src/main/java/controller/LottoController.java b/src/main/java/controller/LottoController.java index a943bd9ef..84aa56c59 100644 --- a/src/main/java/controller/LottoController.java +++ b/src/main/java/controller/LottoController.java @@ -4,7 +4,7 @@ import view.OutputView; import view.PurchaseAmount; import model.LottoNumber; -import model.LottoNumbers; +import model.LottoTicket; import model.LottoService; import model.LottoTicketBundle; import model.MatchResult; @@ -40,7 +40,7 @@ private PurchaseAmount readPriceException() { public PurchaseAmount askPurchaseAmount() { PurchaseAmount purchaseAmount = readPrice(); outView.printPriceValue(purchaseAmount.getValue()); - System.out.println(); + outView.printBlankLine(); return purchaseAmount; } @@ -78,21 +78,21 @@ private void displayTickets(int manualCount, int autoCount, LottoTicketBundle ti outView.printLottos(tickets.readLottoNumbersRepository()); } - public LottoNumbers askWinningNumbers() { + public LottoTicket askWinningNumbers() { outView.printInputWinningNumbers(); - LottoNumbers lastLotto = lottoService.createInputLotto(inputView.inputWinningNumbers()); - System.out.println(); + LottoTicket lastLotto = lottoService.createInputLotto(inputView.inputWinningNumbers()); + outView.printBlankLine(); return lastLotto; } public LottoNumber askBonusBall() { outView.printBonusBall(); LottoNumber bonusNumber = new LottoNumber(Integer.parseInt(inputView.inputBonusBall())); - System.out.println(); + outView.printBlankLine(); return bonusNumber; } - public void showStatistics(List allTickets, List winningNumbers, int purchaseAmount, LottoNumber bonusBall) { + public void showStatistics(List allTickets, List winningNumbers, int purchaseAmount, LottoNumber bonusBall) { Map matchCounts = lottoService.countMatchResults(allTickets, winningNumbers, bonusBall); String profitRate = lottoService.calculateProfitRate(matchCounts, purchaseAmount); outView.printLotteryStatistics(matchCounts, profitRate); diff --git a/src/main/java/model/FixedLottoNumberGenerator.java b/src/main/java/model/FixedLottoNumberGenerator.java index 31182625e..6c9c79d20 100644 --- a/src/main/java/model/FixedLottoNumberGenerator.java +++ b/src/main/java/model/FixedLottoNumberGenerator.java @@ -15,7 +15,7 @@ public FixedLottoNumberGenerator(List numbers) { } @Override - public LottoNumbers generate() { - return new LottoNumbers(fixedNumbers); + public LottoTicket generate() { + return new LottoTicket(fixedNumbers); } } diff --git a/src/main/java/model/LottoNumberGenerator.java b/src/main/java/model/LottoNumberGenerator.java index c387ede47..e16ac363c 100644 --- a/src/main/java/model/LottoNumberGenerator.java +++ b/src/main/java/model/LottoNumberGenerator.java @@ -1,5 +1,5 @@ package model; public interface LottoNumberGenerator { - LottoNumbers generate(); + LottoTicket generate(); } diff --git a/src/main/java/model/LottoService.java b/src/main/java/model/LottoService.java index e592422d3..df3a35f0d 100644 --- a/src/main/java/model/LottoService.java +++ b/src/main/java/model/LottoService.java @@ -17,7 +17,7 @@ public LottoService(LottoNumberGenerator generator) { this.generator = generator; } - public LottoNumbers createOneLotto() { + public LottoTicket createOneLotto() { return generator.generate(); } @@ -29,9 +29,9 @@ public LottoTicketBundle createLottos(int count) { return repository; } - public LottoNumbers createInputLotto(String inputNumber) { + public LottoTicket createInputLotto(String inputNumber) { List numbers = parseInputToNumbers(inputNumber); - return new LottoNumbers(numbers); + return new LottoTicket(numbers); } private List parseInputToNumbers(String inputNumber) { @@ -53,21 +53,21 @@ public LottoTicketBundle createManualLottos(List inputs) { public LottoTicketBundle mergeAutoAndManualLottos(LottoTicketBundle manual, LottoTicketBundle auto) { LottoTicketBundle repository = new LottoTicketBundle(); - for (LottoNumbers lotto : manual.readLottoNumbersRepository()) { + for (LottoTicket lotto : manual.readLottoNumbersRepository()) { repository.addLottoNumbers(lotto); } - for (LottoNumbers lotto : auto.readLottoNumbersRepository()) { + for (LottoTicket lotto : auto.readLottoNumbersRepository()) { repository.addLottoNumbers(lotto); } return repository; } - public Map countMatchResults(List allLotteries, + public Map countMatchResults(List allLotteries, List lastLotto, LottoNumber bonusBall) { Map matchCounts = initializeMatchCounts(); - for (LottoNumbers oneLotto : allLotteries) { + for (LottoTicket oneLotto : allLotteries) { int count = matchLottoNumber(oneLotto.getNumbers(), lastLotto); boolean bonusMatch = matchBonus(oneLotto.getNumbers(), bonusBall, count); MatchResult result = MatchResult.fromCount(count, bonusMatch); diff --git a/src/main/java/model/LottoNumbers.java b/src/main/java/model/LottoTicket.java similarity index 53% rename from src/main/java/model/LottoNumbers.java rename to src/main/java/model/LottoTicket.java index f1d2cfe48..0c7402559 100644 --- a/src/main/java/model/LottoNumbers.java +++ b/src/main/java/model/LottoTicket.java @@ -2,10 +2,10 @@ import java.util.*; -public class LottoNumbers { +public class LottoTicket { private final List numbers; - public LottoNumbers(List numbers) { + public LottoTicket(List numbers) { validateSize(numbers); this.numbers = List.copyOf(numbers); } @@ -16,26 +16,14 @@ private void validateSize(List numbers) { } } - public LottoNumbers sortNumbers() { + public LottoTicket sortNumbers() { List sortNumber = new ArrayList<>(numbers); Collections.sort(sortNumber, Comparator.comparingInt(LottoNumber::getNumber)); - return new LottoNumbers(sortNumber); + return new LottoTicket(sortNumber); } public List getNumbers() { return numbers; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof LottoNumbers)) return false; - LottoNumbers lottoNumbers = (LottoNumbers) o; - return Objects.equals(numbers, lottoNumbers.numbers); - } - - @Override - public int hashCode() { - return Objects.hash(numbers); - } } diff --git a/src/main/java/model/LottoTicketBundle.java b/src/main/java/model/LottoTicketBundle.java index 55e3bb1bc..c7dba79b9 100644 --- a/src/main/java/model/LottoTicketBundle.java +++ b/src/main/java/model/LottoTicketBundle.java @@ -6,26 +6,14 @@ import java.util.Objects; public class LottoTicketBundle { - private final List repository = new ArrayList<>(); + private final List repository = new ArrayList<>(); - public void addLottoNumbers(LottoNumbers lottoNumbers) { - repository.add(lottoNumbers); + public void addLottoNumbers(LottoTicket lottoTicket) { + repository.add(lottoTicket); } - public List readLottoNumbersRepository() { + public List readLottoNumbersRepository() { return Collections.unmodifiableList(repository); } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof LottoTicketBundle)) return false; - LottoTicketBundle allLotteries = (LottoTicketBundle) o; - return Objects.equals(repository, allLotteries.repository); - } - - @Override - public int hashCode() { - return Objects.hash(repository); - } } diff --git a/src/main/java/model/RandomLottoNumberGenerator.java b/src/main/java/model/RandomLottoNumberGenerator.java index 2e6d23fa1..4e11ece65 100644 --- a/src/main/java/model/RandomLottoNumberGenerator.java +++ b/src/main/java/model/RandomLottoNumberGenerator.java @@ -7,10 +7,10 @@ public class RandomLottoNumberGenerator implements LottoNumberGenerator { @Override - public LottoNumbers generate() { + public LottoTicket generate() { List numbers = createLottoNumbers(); Collections.shuffle(numbers); - return new LottoNumbers(numbers.subList(0, 6)); + return new LottoTicket(numbers.subList(0, 6)); } public List createLottoNumbers() { diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 877faf39e..ed7174e1c 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,6 +1,6 @@ package view; -import model.LottoNumbers; +import model.LottoTicket; import model.MatchResult; import java.util.List; @@ -31,8 +31,8 @@ public void printInputWinningNumbers() { System.out.println("지난 주 당첨 번호를 입력해 주세요."); } - public void printLottos(List Lottos) { - for (LottoNumbers lotto : Lottos) { + public void printLottos(List Lottos) { + for (LottoTicket lotto : Lottos) { System.out.println(lotto.getNumbers()); } } diff --git a/src/test/java/model/FixedLottoNumberGeneratorTest.java b/src/test/java/model/FixedLottoNumberGeneratorTest.java index 1ee270942..107a3c5a9 100644 --- a/src/test/java/model/FixedLottoNumberGeneratorTest.java +++ b/src/test/java/model/FixedLottoNumberGeneratorTest.java @@ -15,7 +15,7 @@ class FixedLottoNumberGeneratorTest { FixedLottoNumberGenerator generator = new FixedLottoNumberGenerator(input); // When - LottoNumbers lotto = generator.generate(); + LottoTicket lotto = generator.generate(); // Then assertEquals(input.toString(), lotto.getNumbers().toString()); diff --git a/src/test/java/model/LottoFixture.java b/src/test/java/model/LottoFixture.java index ae4027d7c..5efb9b24d 100644 --- a/src/test/java/model/LottoFixture.java +++ b/src/test/java/model/LottoFixture.java @@ -5,24 +5,24 @@ public class LottoFixture { // 기본 1~6 로또 - public static LottoNumbers 기본로또() { - return new LottoNumbers(List.of( + public static LottoTicket 기본로또() { + return new LottoTicket(List.of( new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), new LottoNumber(4), new LottoNumber(5), new LottoNumber(6) )); } // 보너스볼(7) 포함된 로또 - public static LottoNumbers 보너스7포함로또() { - return new LottoNumbers(List.of( + public static LottoTicket 보너스7포함로또() { + return new LottoTicket(List.of( new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), new LottoNumber(4), new LottoNumber(5), new LottoNumber(7) )); } // 4개 일치 로또 (1~4 일치) - public static LottoNumbers 네개일치로또() { - return new LottoNumbers(List.of( + public static LottoTicket 네개일치로또() { + return new LottoTicket(List.of( new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), new LottoNumber(4), new LottoNumber(7), new LottoNumber(8) )); diff --git a/src/test/java/model/LottoServiceTest.java b/src/test/java/model/LottoServiceTest.java index b47d9964f..06c3c3b07 100644 --- a/src/test/java/model/LottoServiceTest.java +++ b/src/test/java/model/LottoServiceTest.java @@ -20,7 +20,7 @@ class LottoServiceTest { new LottoService(new FixedLottoNumberGenerator(List.of(1, 2, 3, 4, 5, 6))); // When - LottoNumbers lotto = business.createOneLotto(); + LottoTicket lotto = business.createOneLotto(); // Then assertEquals(기본로또(), lotto); @@ -46,7 +46,7 @@ class LottoServiceTest { String input = "1, 2,3, 4 ,5,6"; // When - LottoNumbers last = business.createInputLotto(input); + LottoTicket last = business.createInputLotto(input); // Then assertEquals(6, last.getNumbers().size()); @@ -56,8 +56,8 @@ class LottoServiceTest { @Test void countMatchResults_4개일치면_FOUR가_1로_집계된다() { // Given - LottoNumbers mine = 기본로또(); - LottoNumbers last = 네개일치로또(); + LottoTicket mine = 기본로또(); + LottoTicket last = 네개일치로또(); LottoNumber bonus = new LottoNumber(9); // When @@ -94,8 +94,8 @@ class LottoServiceTest { @Test void 보너스볼까지_맞추면_FIVE_BONUS로_집계된다() { // Given - LottoNumbers mine = 보너스7포함로또(); - LottoNumbers winning = 기본로또(); + LottoTicket mine = 보너스7포함로또(); + LottoTicket winning = 기본로또(); LottoNumber bonus = new LottoNumber(7); // When diff --git a/src/test/java/model/LottoTicketBundleTest.java b/src/test/java/model/LottoTicketBundleTest.java index 765a86ada..0c754a4d5 100644 --- a/src/test/java/model/LottoTicketBundleTest.java +++ b/src/test/java/model/LottoTicketBundleTest.java @@ -2,9 +2,6 @@ import org.junit.jupiter.api.Test; -import java.util.Arrays; -import java.util.List; - import static model.LottoFixture.기본로또; import static org.junit.jupiter.api.Assertions.*; @@ -14,10 +11,10 @@ class LottoTicketBundleTest { void 저장소에_로또번호를_추가하면_읽을때_사이즈가_증가한다() { // given LottoTicketBundle repository = new LottoTicketBundle(); - LottoNumbers lottoNumbers = 기본로또(); + LottoTicket lottoTicket = 기본로또(); // when - repository.addLottoNumbers(lottoNumbers); + repository.addLottoNumbers(lottoTicket); // then assertEquals(1, repository.readLottoNumbersRepository().size()); diff --git a/src/test/java/model/LottoNumbersTest.java b/src/test/java/model/LottoTicketTest.java similarity index 78% rename from src/test/java/model/LottoNumbersTest.java rename to src/test/java/model/LottoTicketTest.java index 85c42cd2f..39873e2c4 100644 --- a/src/test/java/model/LottoNumbersTest.java +++ b/src/test/java/model/LottoTicketTest.java @@ -9,7 +9,7 @@ import static model.LottoFixture.기본로또; import static org.junit.jupiter.api.Assertions.*; -class LottoNumbersTest { +class LottoTicketTest { @Test void 로또번호가_6개면_정상적으로_생성된다() { @@ -17,9 +17,9 @@ class LottoNumbersTest { new LottoNumber(1), new LottoNumber(2), new LottoNumber(3), new LottoNumber(4), new LottoNumber(5), new LottoNumber(6)); - LottoNumbers lottoNumbers = new LottoNumbers(numbers); + LottoTicket lottoTicket = new LottoTicket(numbers); - assertEquals(6, lottoNumbers.getNumbers().size()); + assertEquals(6, lottoTicket.getNumbers().size()); } @Test @@ -29,7 +29,7 @@ class LottoNumbersTest { new LottoNumber(4)); assertThrows(IllegalArgumentException.class, - () -> new LottoNumbers(numbers)); + () -> new LottoTicket(numbers)); } @Test @@ -39,7 +39,7 @@ class LottoNumbersTest { new LottoNumber(1), new LottoNumber(4), new LottoNumber(2) ); - LottoNumbers sorted = new LottoNumbers(numbers).sortNumbers(); + LottoTicket sorted = new LottoTicket(numbers).sortNumbers(); assertEquals(기본로또(), sorted); } @@ -47,8 +47,8 @@ class LottoNumbersTest { @Test void 같은번호면_동일한객체() { // Given - LottoNumbers lotto1 = 기본로또(); - LottoNumbers lotto2 = 기본로또(); + LottoTicket lotto1 = 기본로또(); + LottoTicket lotto2 = 기본로또(); // When & Then assertEquals(lotto1, lotto2); From e4cddbd64aac4091b48ad78b9f41d1a7cf747012 Mon Sep 17 00:00:00 2001 From: taewoo Date: Sun, 12 Oct 2025 03:57:47 +0900 Subject: [PATCH 51/59] =?UTF-8?q?=EC=A7=80=EC=97=AD=20=EB=B3=80=EC=88=98?= =?UTF-8?q?=EC=99=80=20=ED=95=A8=EC=88=98=20=EC=9D=B8=EC=9E=90=EB=AA=85?= =?UTF-8?q?=EC=9D=84=20=EB=AA=85=ED=99=95=ED=95=98=EA=B2=8C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/controller/LottoController.java | 4 ++-- src/main/java/model/LottoService.java | 22 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/controller/LottoController.java b/src/main/java/controller/LottoController.java index 84aa56c59..a815cf1e0 100644 --- a/src/main/java/controller/LottoController.java +++ b/src/main/java/controller/LottoController.java @@ -80,9 +80,9 @@ private void displayTickets(int manualCount, int autoCount, LottoTicketBundle ti public LottoTicket askWinningNumbers() { outView.printInputWinningNumbers(); - LottoTicket lastLotto = lottoService.createInputLotto(inputView.inputWinningNumbers()); + LottoTicket winningLotto = lottoService.createInputLotto(inputView.inputWinningNumbers()); outView.printBlankLine(); - return lastLotto; + return winningLotto; } public LottoNumber askBonusBall() { diff --git a/src/main/java/model/LottoService.java b/src/main/java/model/LottoService.java index df3a35f0d..e20f35a44 100644 --- a/src/main/java/model/LottoService.java +++ b/src/main/java/model/LottoService.java @@ -64,12 +64,12 @@ public LottoTicketBundle mergeAutoAndManualLottos(LottoTicketBundle manual, Lott } public Map countMatchResults(List allLotteries, - List lastLotto, + List winningLotto, LottoNumber bonusBall) { Map matchCounts = initializeMatchCounts(); - for (LottoTicket oneLotto : allLotteries) { - int count = matchLottoNumber(oneLotto.getNumbers(), lastLotto); - boolean bonusMatch = matchBonus(oneLotto.getNumbers(), bonusBall, count); + for (LottoTicket lotto : allLotteries) { + int count = matchLottoNumber(lotto.getNumbers(), winningLotto); + boolean bonusMatch = matchBonus(lotto.getNumbers(), bonusBall, count); MatchResult result = MatchResult.fromCount(count, bonusMatch); matchCounts.put(result, matchCounts.get(result) + 1); } @@ -84,25 +84,25 @@ private Map initializeMatchCounts() { return counts; } - private int matchLottoNumber(List oneLotto, List lastLotto) { - List lastNumbers = lastLotto.stream() + private int matchLottoNumber(List lotto, List winningLotto) { + List lastNumbers = winningLotto.stream() .map(LottoNumber::getNumber) .toList(); int matchCount = 0; - for (LottoNumber number : oneLotto) { + for (LottoNumber number : lotto) { matchCount += containsNumber(lastNumbers, number); } return matchCount; } - private int containsNumber(List lastNumbers, LottoNumber number) { - if (lastNumbers.contains(number.getNumber())) return 1; + private int containsNumber(List winningLotto, LottoNumber number) { + if (winningLotto.contains(number.getNumber())) return 1; return 0; } - private boolean matchBonus(List oneLotto, LottoNumber bonusBall, int count) { + private boolean matchBonus(List lotto, LottoNumber bonusBall, int count) { if (count == 5) { - return oneLotto.contains(bonusBall); + return lotto.contains(bonusBall); } return false; } From 6a4da8688256510cd0914a3655561ca6ce4d4336 Mon Sep 17 00:00:00 2001 From: taewoo Date: Sun, 12 Oct 2025 04:28:11 +0900 Subject: [PATCH 52/59] =?UTF-8?q?LottoNumber=20=EC=8A=A4=ED=8A=B8=EB=A6=BC?= =?UTF-8?q?=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=B4=20=EB=A7=A4=EC=B9=AD=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EB=8B=A8=EC=88=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoService.java | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/main/java/model/LottoService.java b/src/main/java/model/LottoService.java index e20f35a44..a8b721e95 100644 --- a/src/main/java/model/LottoService.java +++ b/src/main/java/model/LottoService.java @@ -85,19 +85,9 @@ private Map initializeMatchCounts() { } private int matchLottoNumber(List lotto, List winningLotto) { - List lastNumbers = winningLotto.stream() - .map(LottoNumber::getNumber) - .toList(); - int matchCount = 0; - for (LottoNumber number : lotto) { - matchCount += containsNumber(lastNumbers, number); - } - return matchCount; - } - - private int containsNumber(List winningLotto, LottoNumber number) { - if (winningLotto.contains(number.getNumber())) return 1; - return 0; + return (int) lotto.stream() + .filter(winningLotto::contains) + .count(); } private boolean matchBonus(List lotto, LottoNumber bonusBall, int count) { From 58fe1f0be4952080301fadf14a2c4b78a76ccc62 Mon Sep 17 00:00:00 2001 From: taewoo Date: Sun, 12 Oct 2025 04:47:41 +0900 Subject: [PATCH 53/59] =?UTF-8?q?=20Stream=EC=9D=84=20=ED=99=9C=EC=9A=A9?= =?UTF-8?q?=ED=95=B4=20MatchResult=20=EC=A1=B0=ED=9A=8C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=8B=A8=EC=88=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/MatchResult.java | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/src/main/java/model/MatchResult.java b/src/main/java/model/MatchResult.java index 75accd3ed..898b73922 100644 --- a/src/main/java/model/MatchResult.java +++ b/src/main/java/model/MatchResult.java @@ -1,12 +1,14 @@ package model; +import java.util.Arrays; + public enum MatchResult { ZERO(0, 0), ONE(1, 0), TWO(2, 0), THREE(3, 5000), FOUR(4, 50000), - FIVE(5, 150000), + FIVE(5, 1500000), FIVE_BONUS(5, 30000000), SIX(6, 2000000000); @@ -32,23 +34,9 @@ public static MatchResult fromCount(int count, boolean bonusMatch) { } MatchResult[] results = values(); - return findMatchResult(results, count); - } - - private static MatchResult findMatchResult(MatchResult[] results, int count) { - int i = 0; - while (i < results.length && !isMatched(results[i], count)) { - i++; - } - - if (i == results.length) { - return ZERO; - } - - return results[i]; - } - - private static boolean isMatched(MatchResult result, int count) { - return result.count == count && result != FIVE_BONUS; + return Arrays.stream(values()) + .filter(result -> result.count == count && result != FIVE_BONUS) + .findFirst() + .orElse(ZERO); } } From 7b87bf71aa97163052e0a2afbfd357b7a9790b06 Mon Sep 17 00:00:00 2001 From: taewoo Date: Sun, 12 Oct 2025 04:48:43 +0900 Subject: [PATCH 54/59] =?UTF-8?q?=EB=8F=99=EC=9D=BC=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/model/LottoTicketBundleTest.java | 15 --------------- src/test/java/model/LottoTicketTest.java | 11 ----------- 2 files changed, 26 deletions(-) diff --git a/src/test/java/model/LottoTicketBundleTest.java b/src/test/java/model/LottoTicketBundleTest.java index 0c754a4d5..bc989b108 100644 --- a/src/test/java/model/LottoTicketBundleTest.java +++ b/src/test/java/model/LottoTicketBundleTest.java @@ -19,19 +19,4 @@ class LottoTicketBundleTest { // then assertEquals(1, repository.readLottoNumbersRepository().size()); } - - @Test - void 같은로또묶음들을가지면_동일한저장소다() { - // Given - LottoTicketBundle re1 = new LottoTicketBundle(); - LottoTicketBundle re2 = new LottoTicketBundle(); - - - re1.addLottoNumbers(기본로또()); - re2.addLottoNumbers(기본로또()); - - // When & Then - assertEquals(re1, re2); - assertEquals(re1.hashCode(), re2.hashCode()); - } } diff --git a/src/test/java/model/LottoTicketTest.java b/src/test/java/model/LottoTicketTest.java index 39873e2c4..de41e73fe 100644 --- a/src/test/java/model/LottoTicketTest.java +++ b/src/test/java/model/LottoTicketTest.java @@ -43,15 +43,4 @@ class LottoTicketTest { assertEquals(기본로또(), sorted); } - - @Test - void 같은번호면_동일한객체() { - // Given - LottoTicket lotto1 = 기본로또(); - LottoTicket lotto2 = 기본로또(); - - // When & Then - assertEquals(lotto1, lotto2); - assertEquals(lotto1.hashCode(), lotto2.hashCode()); - } } From 5cda9d9aaccdfb25104b741c0bed346eee73577d Mon Sep 17 00:00:00 2001 From: taewoo Date: Sun, 12 Oct 2025 05:27:03 +0900 Subject: [PATCH 55/59] =?UTF-8?q?PurchaseAmount=EB=A5=BC=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EB=AA=A8=EB=8D=B8=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/Main.java | 4 ++-- src/main/java/controller/LottoController.java | 2 +- src/main/java/{view => model}/PurchaseAmount.java | 4 ++-- src/test/java/{view => model}/PurchaseAmountTest.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) rename src/main/java/{view => model}/PurchaseAmount.java (93%) rename src/test/java/{view => model}/PurchaseAmountTest.java (93%) diff --git a/src/main/java/Main.java b/src/main/java/Main.java index 2acd6fa27..bdd3694fb 100644 --- a/src/main/java/Main.java +++ b/src/main/java/Main.java @@ -1,5 +1,5 @@ import controller.LottoController; -import view.PurchaseAmount; +import model.PurchaseAmount; import model.LottoNumber; import model.LottoTicket; import model.LottoTicketBundle; @@ -12,7 +12,7 @@ public static void main(String[] args) { PurchaseAmount purchaseAmount = controller.askPurchaseAmount(); // 2. 수동 및 자동 로또 번호 생성 - LottoTicketBundle allTickets = controller.buyTickets(purchaseAmount.howManyLottos()); + LottoTicketBundle allTickets = controller.buyTickets(purchaseAmount.calculateLottoCount()); // 3. 당첨 번호 입력 LottoTicket winningNumbers = controller.askWinningNumbers(); diff --git a/src/main/java/controller/LottoController.java b/src/main/java/controller/LottoController.java index a815cf1e0..72f0bdebb 100644 --- a/src/main/java/controller/LottoController.java +++ b/src/main/java/controller/LottoController.java @@ -2,7 +2,7 @@ import view.InputView; import view.OutputView; -import view.PurchaseAmount; +import model.PurchaseAmount; import model.LottoNumber; import model.LottoTicket; import model.LottoService; diff --git a/src/main/java/view/PurchaseAmount.java b/src/main/java/model/PurchaseAmount.java similarity index 93% rename from src/main/java/view/PurchaseAmount.java rename to src/main/java/model/PurchaseAmount.java index 9d85a01a8..33cd24ca4 100644 --- a/src/main/java/view/PurchaseAmount.java +++ b/src/main/java/model/PurchaseAmount.java @@ -1,4 +1,4 @@ -package view; +package model; import java.util.Objects; @@ -20,7 +20,7 @@ public int getValue() { return value; } - public int howManyLottos() { + public int calculateLottoCount() { return value / 1000; } diff --git a/src/test/java/view/PurchaseAmountTest.java b/src/test/java/model/PurchaseAmountTest.java similarity index 93% rename from src/test/java/view/PurchaseAmountTest.java rename to src/test/java/model/PurchaseAmountTest.java index c651de582..46e0b3da0 100644 --- a/src/test/java/view/PurchaseAmountTest.java +++ b/src/test/java/model/PurchaseAmountTest.java @@ -1,4 +1,4 @@ -package view; +package model; import org.junit.jupiter.api.Test; @@ -13,7 +13,7 @@ class PurchaseAmountTest { PurchaseAmount purchaseAmount = new PurchaseAmount(2000); // when - int count = purchaseAmount.howManyLottos(); + int count = purchaseAmount.calculateLottoCount(); // then assertEquals(2, count); From 679ffc82997c79c5c1623bd6e54d0c0fe31fb156 Mon Sep 17 00:00:00 2001 From: taewoo Date: Fri, 24 Oct 2025 18:49:41 +0900 Subject: [PATCH 56/59] =?UTF-8?q?Kotlin=20=EA=B4=80=EB=A0=A8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 ----- settings.gradle | 10 +++++++++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 4d9ca3fc8..239f9e785 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,5 @@ plugins { id 'java' - id 'org.jetbrains.kotlin.jvm' } group = 'cholog' @@ -15,12 +14,8 @@ dependencies { testImplementation platform('org.assertj:assertj-bom:3.25.1') testImplementation('org.junit.jupiter:junit-jupiter') testImplementation('org.assertj:assertj-core') - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" } test { useJUnitPlatform() } -kotlin { - jvmToolchain(17) -} diff --git a/settings.gradle b/settings.gradle index 1daa39f3c..555efb54a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,10 @@ -rootProject.name = 'java-lotto' +pluginManagement { + plugins { + } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0' +} +rootProject.name = 'java-lotto' From f0de06baf38082a78283671b7c99b80be7888dd9 Mon Sep 17 00:00:00 2001 From: taewoo Date: Fri, 24 Oct 2025 18:56:56 +0900 Subject: [PATCH 57/59] =?UTF-8?q?countMatchResults=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=9D=B8=EC=9E=90=20=EA=B0=80=EB=8F=85=EC=84=B1=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/LottoService.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/model/LottoService.java b/src/main/java/model/LottoService.java index a8b721e95..8915cee02 100644 --- a/src/main/java/model/LottoService.java +++ b/src/main/java/model/LottoService.java @@ -63,9 +63,11 @@ public LottoTicketBundle mergeAutoAndManualLottos(LottoTicketBundle manual, Lott return repository; } - public Map countMatchResults(List allLotteries, - List winningLotto, - LottoNumber bonusBall) { + public Map countMatchResults( + List allLotteries, + List winningLotto, + LottoNumber bonusBall + ) { Map matchCounts = initializeMatchCounts(); for (LottoTicket lotto : allLotteries) { int count = matchLottoNumber(lotto.getNumbers(), winningLotto); From 65046e1b65c13404207937122f03eb3338c299e4 Mon Sep 17 00:00:00 2001 From: taewoo Date: Fri, 24 Oct 2025 19:00:31 +0900 Subject: [PATCH 58/59] =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B0=8F=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/MatchResult.java | 6 ------ src/test/java/model/LottoServiceTest.java | 2 -- 2 files changed, 8 deletions(-) diff --git a/src/main/java/model/MatchResult.java b/src/main/java/model/MatchResult.java index 898b73922..d38e80e91 100644 --- a/src/main/java/model/MatchResult.java +++ b/src/main/java/model/MatchResult.java @@ -4,8 +4,6 @@ public enum MatchResult { ZERO(0, 0), - ONE(1, 0), - TWO(2, 0), THREE(3, 5000), FOUR(4, 50000), FIVE(5, 1500000), @@ -20,10 +18,6 @@ public enum MatchResult { this.reward = reward; } - public int getCount() { - return count; - } - public int getReward() { return reward; } diff --git a/src/test/java/model/LottoServiceTest.java b/src/test/java/model/LottoServiceTest.java index 06c3c3b07..540808e77 100644 --- a/src/test/java/model/LottoServiceTest.java +++ b/src/test/java/model/LottoServiceTest.java @@ -74,8 +74,6 @@ class LottoServiceTest { Map matchCounts = Map.of( MatchResult.THREE, 1, MatchResult.ZERO, 0, - MatchResult.ONE, 0, - MatchResult.TWO, 0, MatchResult.FOUR, 0, MatchResult.FIVE, 0, MatchResult.FIVE_BONUS, 0, From 243dcd2ef9697e22f1ccfda23c2a828a1c4cd6cf Mon Sep 17 00:00:00 2001 From: taewoo Date: Fri, 24 Oct 2025 19:01:16 +0900 Subject: [PATCH 59/59] =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B0=8F=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/model/MatchResult.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/model/MatchResult.java b/src/main/java/model/MatchResult.java index d38e80e91..f0287babd 100644 --- a/src/main/java/model/MatchResult.java +++ b/src/main/java/model/MatchResult.java @@ -27,7 +27,6 @@ public static MatchResult fromCount(int count, boolean bonusMatch) { return FIVE_BONUS; } - MatchResult[] results = values(); return Arrays.stream(values()) .filter(result -> result.count == count && result != FIVE_BONUS) .findFirst()