From e3291961520a420b9fc0f025dd1f2114d0f94feb Mon Sep 17 00:00:00 2001 From: jisoo78 Date: Sun, 25 May 2025 21:17:17 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EC=88=98?= =?UTF-8?q?=EB=8F=99=20=EA=B5=AC=EB=A7=A4=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/Application.java | 85 +++++++++++++++++++ src/main/java/lotto/LottoCounter.java | 23 +++++ src/main/java/lotto/LottoManage.java | 31 +++++++ src/main/java/lotto/domain/BonusNumber.java | 21 +++++ .../java/lotto/domain/InputLottoNumber.java | 33 +++++++ src/main/java/lotto/domain/LottoBonus.java | 46 ++++++++++ src/main/java/lotto/domain/LottoNumber.java | 15 ++++ src/main/java/lotto/domain/LottoStatus.java | 47 ++++++++++ src/main/java/lotto/domain/MatchResult.java | 57 +++++++++++++ src/main/java/lotto/domain/Money.java | 17 ++++ src/main/java/lotto/domain/WinningNumber.java | 29 +++++++ src/main/java/lotto/input/InputMoney.java | 18 ++++ .../java/lotto/input/PassivityLottoInput.java | 29 +++++++ .../lotto/input/PassivityNumberInput.java | 24 ++++++ .../java/lotto/input/WinningNumberInput.java | 46 ++++++++++ .../lotto/parser/WinningNumberParser.java | 37 ++++++++ .../lotto/validate/WinningNumberValidate.java | 31 +++++++ src/test/java/lotto/InputLottoNumberTest.java | 25 ++++++ src/test/java/lotto/LottoCounterTest.java | 21 +++++ src/test/java/lotto/LottoManageTest.java | 48 +++++++++++ .../java/lotto/PassivityNumberInputTest.java | 24 ++++++ 21 files changed, 707 insertions(+) create mode 100644 src/main/java/lotto/Application.java create mode 100644 src/main/java/lotto/LottoCounter.java create mode 100644 src/main/java/lotto/LottoManage.java create mode 100644 src/main/java/lotto/domain/BonusNumber.java create mode 100644 src/main/java/lotto/domain/InputLottoNumber.java create mode 100644 src/main/java/lotto/domain/LottoBonus.java create mode 100644 src/main/java/lotto/domain/LottoNumber.java create mode 100644 src/main/java/lotto/domain/LottoStatus.java create mode 100644 src/main/java/lotto/domain/MatchResult.java create mode 100644 src/main/java/lotto/domain/Money.java create mode 100644 src/main/java/lotto/domain/WinningNumber.java create mode 100644 src/main/java/lotto/input/InputMoney.java create mode 100644 src/main/java/lotto/input/PassivityLottoInput.java create mode 100644 src/main/java/lotto/input/PassivityNumberInput.java create mode 100644 src/main/java/lotto/input/WinningNumberInput.java create mode 100644 src/main/java/lotto/parser/WinningNumberParser.java create mode 100644 src/main/java/lotto/validate/WinningNumberValidate.java create mode 100644 src/test/java/lotto/InputLottoNumberTest.java create mode 100644 src/test/java/lotto/LottoCounterTest.java create mode 100644 src/test/java/lotto/LottoManageTest.java create mode 100644 src/test/java/lotto/PassivityNumberInputTest.java diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java new file mode 100644 index 00000000..c88db8fa --- /dev/null +++ b/src/main/java/lotto/Application.java @@ -0,0 +1,85 @@ +package lotto; + +import lotto.domain.*; +import lotto.input.PassivityLottoInput; +import lotto.input.PassivityNumberInput; +import lotto.input.WinningNumberInput; +import lotto.parser.WinningNumberParser; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + + +public class Application { + private static final int MINIMUM_AMOUNT = 1000; + + public static void main(String[] args) { + new Application().run(); + } + + private void run() { + int ticketCount = buyLotto(); + List ticket = prepareTicket(ticketCount); + WinningNumber winningNumber = new WinningNumberInput().inputWinningNumber(); + LottoStatus lottoStatus = checkResult(ticket, winningNumber); + lottoStatus.print(ticketCount, MINIMUM_AMOUNT); + } + + private List prepareTicket(int ticketCount) { + int passivityCount = new PassivityNumberInput(ticketCount).passivityLottoCount(); + List passivityTicket = new PassivityLottoInput( + new WinningNumberParser()).inputPassivityTicket(passivityCount); + List auto = LottoCounter.generateAuto(ticketCount, passivityCount); + List totalTicket = new ArrayList<>(); + totalTicket.addAll(passivityTicket); + totalTicket.addAll(auto); + System.out.printf("수동 %d장, 자동 %d장 구매 완료%n", passivityCount, ticketCount - passivityCount); + return totalTicket; + } + + + private static int buyLotto() { + Money money = new Money(inputMoney()); + int ticketCount = money.countTickets(MINIMUM_AMOUNT); + System.out.println(ticketCount + "개를 구매했습니다."); + return ticketCount; + } + + private static List createTickets(int count) { + List tickets = new ArrayList<>(); + for (int i = 0; i < count; i++) { + List lottoParts = LottoManage.pullOutNumbers(); + LottoManage.shuffleNumbers(lottoParts); + List picked = LottoManage.pickupLottoNumbers(lottoParts); + List wrapped = picked.stream() + .map(LottoNumber::new) + .toList(); + + tickets.add(InputLottoNumber.of(wrapped)); + } + return tickets; + } + + private static LottoStatus checkResult( + List tickets, + WinningNumber winning) { + LottoStatus status = new LottoStatus(); + tickets.forEach(ticket -> { + System.out.println(ticket); + status.record(MatchResult.of(ticket.countMatching(winning))); + }); + return status; + } + + private static int inputMoney() { + Scanner scanner = new Scanner(System.in); + System.out.print("구입 금액 입력(금액은 1000원 이상 입력해주세요): "); + int money = scanner.nextInt(); + while (money < MINIMUM_AMOUNT) { + System.out.println("구매에 필요한 금액은 1000원 이상입니다 다시 입력해주세요"); + money = scanner.nextInt(); + } + return money; + } +} diff --git a/src/main/java/lotto/LottoCounter.java b/src/main/java/lotto/LottoCounter.java new file mode 100644 index 00000000..61233b60 --- /dev/null +++ b/src/main/java/lotto/LottoCounter.java @@ -0,0 +1,23 @@ +package lotto; + +import lotto.domain.InputLottoNumber; +import lotto.domain.LottoNumber; + +import java.util.List; +import java.util.stream.IntStream; + +public class LottoCounter { + + public static List generateAuto(int totalTicket, int passivityCount) { + int autoLottoCount = totalTicket - passivityCount; + return IntStream.range(0, autoLottoCount) + .mapToObj(i -> { + List pool = LottoManage.pullOutNumbers(); + LottoManage.shuffleNumbers(pool); + List picked = LottoManage.pickupLottoNumbers(pool) + .stream().map(LottoNumber::new).toList(); + return InputLottoNumber.of(picked); + }) + .toList(); + } +} diff --git a/src/main/java/lotto/LottoManage.java b/src/main/java/lotto/LottoManage.java new file mode 100644 index 00000000..1f7fa3ac --- /dev/null +++ b/src/main/java/lotto/LottoManage.java @@ -0,0 +1,31 @@ +package lotto; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class LottoManage { + private static final int LOTTO_START_NUMBER = 1; + private static final int LOTTO_END_NUMBER = 45; + private static final int LOTTO_LIST_START_INDEX = 0; + private static final int LOTTO_LIST_END_INDEX = 6; + + + public static List pullOutNumbers() { + List numbers = new ArrayList<>(); + for (int i = LOTTO_START_NUMBER; i <= LOTTO_END_NUMBER; i++) { + numbers.add(i); + } + return numbers; + } + + public static void shuffleNumbers(List numbers) { + Collections.shuffle(numbers); + } + + public static List pickupLottoNumbers(List numbers) { + List lottoNumbers = new ArrayList<>(numbers.subList(LOTTO_LIST_START_INDEX, LOTTO_LIST_END_INDEX)); + Collections.sort(lottoNumbers); + return lottoNumbers; + } +} diff --git a/src/main/java/lotto/domain/BonusNumber.java b/src/main/java/lotto/domain/BonusNumber.java new file mode 100644 index 00000000..21cd23e3 --- /dev/null +++ b/src/main/java/lotto/domain/BonusNumber.java @@ -0,0 +1,21 @@ +package lotto.domain; + +public class BonusNumber { + private final LottoNumber bonus; + + public BonusNumber(int number, InputLottoNumber winningNumbers) { + LottoNumber lottoNumber = new LottoNumber(number); + if (winningNumbers.contains(lottoNumber)) { + throw new IllegalArgumentException("보너스 번호는 당첨 번호와 중복될 수 없습니다."); + } + this.bonus = lottoNumber; + } + + public boolean isMatch(InputLottoNumber ticket) { + return ticket.contains(bonus); + } + + public LottoNumber getBonus() { + return bonus; + } +} diff --git a/src/main/java/lotto/domain/InputLottoNumber.java b/src/main/java/lotto/domain/InputLottoNumber.java new file mode 100644 index 00000000..efa8dd93 --- /dev/null +++ b/src/main/java/lotto/domain/InputLottoNumber.java @@ -0,0 +1,33 @@ +package lotto.domain; + +import java.util.List; +import java.util.stream.Collectors; + +public class InputLottoNumber { + private final List numbers; + + private InputLottoNumber(List numbers) { + this.numbers = numbers; + } + + public static InputLottoNumber of(List list) { + return new InputLottoNumber(list); + } + + public int countMatching(WinningNumber winning) { + return (int) numbers.stream() + .filter(winning::contains) + .count(); + } + + public boolean contains(LottoNumber number) { + return numbers.contains(number); + } + + @Override + public String toString() { + return numbers.stream() + .map(n -> String.valueOf(n.getValue())) + .collect(Collectors.joining(", ", "[", "]")); + } +} diff --git a/src/main/java/lotto/domain/LottoBonus.java b/src/main/java/lotto/domain/LottoBonus.java new file mode 100644 index 00000000..4539d924 --- /dev/null +++ b/src/main/java/lotto/domain/LottoBonus.java @@ -0,0 +1,46 @@ +package lotto.domain; + +public enum LottoBonus { + FIRST_PLACE(6, false, 2000000000), + SECOND_PLACE(5, true, 30000000), + THIRD_PLACE(5, false, 1500000), + FOURTH_PLACE(4, false, 50000), + FIFTH_PLACE(3, false, 5000), + LOSING_PLACE(0, false, 0); + + private final int matchCount; + private final boolean needBonusMatch; + private final Money winningMoney; + + LottoBonus(int matchCount, boolean needBonusMatch, int winningMoney) { + this.matchCount = matchCount; + this.needBonusMatch = needBonusMatch; + this.winningMoney = new Money(winningMoney); + } + + public int getMatchCount() { + return matchCount; + } + + public boolean isNeedBonusMatch() { + return needBonusMatch; + } + + public Money getWinningMoney() { + return winningMoney; + } + + public static LottoBonus valueOf (int matchCount, boolean needBonusMatch) { + for (LottoBonus bonus : values()) { + if (bonus.matchCount == matchCount && bonus.needBonusMatch == needBonusMatch) { + return bonus; + } + } + for (LottoBonus bonus : values()) { + if (bonus.matchCount == matchCount && !bonus.needBonusMatch) { + return bonus; + } + } + return LOSING_PLACE; + } +} diff --git a/src/main/java/lotto/domain/LottoNumber.java b/src/main/java/lotto/domain/LottoNumber.java new file mode 100644 index 00000000..07e32610 --- /dev/null +++ b/src/main/java/lotto/domain/LottoNumber.java @@ -0,0 +1,15 @@ +package lotto.domain; + +public record LottoNumber(int value) { + private static final int MINIMUM_NUMBER = 1; + private static final int MAX_NUMBER = 45; + + public LottoNumber { + if (value < MINIMUM_NUMBER || value > MAX_NUMBER) { + throw new IllegalArgumentException("로또 번호는 1 ~45 사이의 숫자 입니다."); + } + } + public int getValue() { + return value(); + } +} diff --git a/src/main/java/lotto/domain/LottoStatus.java b/src/main/java/lotto/domain/LottoStatus.java new file mode 100644 index 00000000..e58b1d75 --- /dev/null +++ b/src/main/java/lotto/domain/LottoStatus.java @@ -0,0 +1,47 @@ +package lotto.domain; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.Map; + +public class LottoStatus { + private final Map stat = new HashMap<>(); + + public void record(MatchResult matchResult) { + stat.put(matchResult, stat.getOrDefault(matchResult, 0) + 1); + } + + public void print(int ticketCount, int minimumAmount) { + System.out.println("당첨 통계\n--------"); + MatchResult.getAll().stream() + .filter(matchResult -> matchResult != MatchResult.NONE) + .sorted(Comparator.comparingInt(MatchResult::getMatchCount)) + .map(matchResult -> { + String matchLabel = matchResult.getMatchCount() + "개 일치"; + if (matchResult.isBonusMatch()) { + matchLabel += ", 보너스 볼 일치"; + } + return String.format( + "%s (%d원)- %d개", + matchLabel, + matchResult.getPrizeAmount().getAmount(), + stat.getOrDefault(matchResult, 0) + ); + }) + .forEach(System.out::println); + double returnRate = (double) getTotalPrizeAmount().getAmount() + / (ticketCount * minimumAmount); + System.out.printf("총 수익률은 %.2f 입니다.%n", returnRate); + + } + + public Money getTotalPrizeAmount() { + int sum = 0; + for (Map.Entry entry : stat.entrySet()) { + sum += entry.getKey().getPrizeAmount().amount * entry.getValue(); + } + return new Money(sum); + } + + +} diff --git a/src/main/java/lotto/domain/MatchResult.java b/src/main/java/lotto/domain/MatchResult.java new file mode 100644 index 00000000..db7c302f --- /dev/null +++ b/src/main/java/lotto/domain/MatchResult.java @@ -0,0 +1,57 @@ +package lotto.domain; + +import java.util.Arrays; +import java.util.List; + +public class MatchResult { + public static final MatchResult NONE = new MatchResult(LottoBonus.LOSING_PLACE); + + private static boolean bonusMatch; + private final LottoBonus bonus; + + public MatchResult(LottoBonus bonus) { + this.bonus = bonus; + } + + public static MatchResult of(int matchCount) { + LottoBonus lottoBonus = LottoBonus.valueOf(matchCount, bonusMatch); + return new MatchResult(lottoBonus); + } + + public static List getAll() { + return Arrays.stream(LottoBonus.values()) + .filter(b -> b != LottoBonus.LOSING_PLACE) + .map(MatchResult::new) + .toList(); + } + + public int getMatchCount() { + return bonus.getMatchCount(); + } + + public Money getPrizeAmount() { + return bonus.getWinningMoney(); + } + + public boolean isBonusMatch() { + return bonus.isNeedBonusMatch(); + } + + public boolean isWinning() { + return bonus != LottoBonus.LOSING_PLACE; + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (!(object instanceof MatchResult)) return false; + MatchResult matchResult = (MatchResult) object; + return bonus == matchResult.bonus; + } + + @Override + public int hashCode() { + return bonus.hashCode(); + } + +} diff --git a/src/main/java/lotto/domain/Money.java b/src/main/java/lotto/domain/Money.java new file mode 100644 index 00000000..5b3e9304 --- /dev/null +++ b/src/main/java/lotto/domain/Money.java @@ -0,0 +1,17 @@ +package lotto.domain; + +public class Money { + public final int amount; + + public Money(int amount) { + this.amount = amount; + } + + public int countTickets(int price) { + return amount / price; + } + + public int getAmount() { + return amount; + } +} diff --git a/src/main/java/lotto/domain/WinningNumber.java b/src/main/java/lotto/domain/WinningNumber.java new file mode 100644 index 00000000..aa2d50e2 --- /dev/null +++ b/src/main/java/lotto/domain/WinningNumber.java @@ -0,0 +1,29 @@ +package lotto.domain; + +import java.util.List; + +public class WinningNumber { + private final List winning; + private final LottoNumber bonus; + + private WinningNumber(List winning, LottoNumber bonus) { + this.bonus = bonus; + this.winning = winning; + } + + public static WinningNumber of(List winning, LottoNumber bonus) { + return new WinningNumber(winning, bonus); + } + + public List getWinning() { + return winning; + } + + public LottoNumber getBonus() { + return bonus; + } + + public boolean contains(LottoNumber number) { + return winning.contains(number); + } +} diff --git a/src/main/java/lotto/input/InputMoney.java b/src/main/java/lotto/input/InputMoney.java new file mode 100644 index 00000000..9d92e4a3 --- /dev/null +++ b/src/main/java/lotto/input/InputMoney.java @@ -0,0 +1,18 @@ +package lotto.input; + +import java.util.Scanner; + +public class InputMoney { + private static final int MINIMUM_AMOUNT = 1000; + + private static int inputMoney() { + Scanner scanner = new Scanner(System.in); + System.out.print("구입 금액 입력(금액은 1000원 이상 입력해주세요): "); + int money = scanner.nextInt(); + while (money < MINIMUM_AMOUNT) { + System.out.println("구매에 필요한 금액은 1000원 이상입니다 다시 입력해주세요"); + money = scanner.nextInt(); + } + return money; + } +} diff --git a/src/main/java/lotto/input/PassivityLottoInput.java b/src/main/java/lotto/input/PassivityLottoInput.java new file mode 100644 index 00000000..52ef8cd2 --- /dev/null +++ b/src/main/java/lotto/input/PassivityLottoInput.java @@ -0,0 +1,29 @@ +package lotto.input; + +import lotto.domain.InputLottoNumber; +import lotto.domain.LottoNumber; +import lotto.parser.WinningNumberParser; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class PassivityLottoInput { + private final WinningNumberParser winningNumberParser; + private final Scanner scanner = new Scanner(System.in); + + public PassivityLottoInput(WinningNumberParser winningNumberParser) { + this.winningNumberParser = winningNumberParser; + } + + public List inputPassivityTicket(int count) { + List passivityTicket = new ArrayList<>(); + for (int i = 1; i <= count; i++) { + System.out.print(i + "번째 수동 로또 번호를 입력해주세요: "); + String line = scanner.nextLine(); + List number = winningNumberParser.parseNumbers(line); + passivityTicket.add(InputLottoNumber.of(number)); + } + return passivityTicket; + } +} diff --git a/src/main/java/lotto/input/PassivityNumberInput.java b/src/main/java/lotto/input/PassivityNumberInput.java new file mode 100644 index 00000000..8628ac33 --- /dev/null +++ b/src/main/java/lotto/input/PassivityNumberInput.java @@ -0,0 +1,24 @@ +package lotto.input; + +import java.util.Scanner; + +public class PassivityNumberInput { + private final Scanner scanner = new Scanner(System.in); + private final int totalTicket; + + public PassivityNumberInput(int totalTicket) { + this.totalTicket = totalTicket; + } + + public int passivityLottoCount() { + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + int count = scanner.nextInt(); + while (count < 0 || count > totalTicket) { + System.out.println("잘못된 입력입니다 구입 금액에 맞춰 다시 작성해주세요"); + count = scanner.nextInt(); + } + return count; + } + + +} diff --git a/src/main/java/lotto/input/WinningNumberInput.java b/src/main/java/lotto/input/WinningNumberInput.java new file mode 100644 index 00000000..2592ac56 --- /dev/null +++ b/src/main/java/lotto/input/WinningNumberInput.java @@ -0,0 +1,46 @@ +package lotto.input; + +import lotto.domain.LottoNumber; +import lotto.domain.WinningNumber; +import lotto.parser.WinningNumberParser; + +import java.util.List; +import java.util.Scanner; + +public class WinningNumberInput { + private final Scanner scanner = new Scanner(System.in); + private final WinningNumberParser winningNumberParser; + + public WinningNumberInput() { + this(new WinningNumberParser()); + } + + public WinningNumberInput(WinningNumberParser winningNumberParser) { + this.winningNumberParser = winningNumberParser; + } + + public WinningNumber inputWinningNumber() { + while (true) { + String line = readLine(); + try { + List list = winningNumberParser.parseNumbers(line); + + String bonusNumber = bonusReadLine(); + LottoNumber bonus = winningNumberParser.parseBonus(bonusNumber, list); + return WinningNumber.of(list, bonus); + } catch (IllegalArgumentException e) { + System.out.println("→ " + e.getMessage() + " 다시 입력해주세요."); + } + } + } + + private static String readLine() { + System.out.println("지난 주 당첨 번호를 입력해 주세요 (예: 1,2,3,4,5,6): "); + return new Scanner(System.in).nextLine(); + } + + private static String bonusReadLine() { + System.out.println("보너스 번호를 입력해주세요: "); + return new Scanner(System.in).nextLine(); + } +} diff --git a/src/main/java/lotto/parser/WinningNumberParser.java b/src/main/java/lotto/parser/WinningNumberParser.java new file mode 100644 index 00000000..eab72907 --- /dev/null +++ b/src/main/java/lotto/parser/WinningNumberParser.java @@ -0,0 +1,37 @@ +package lotto.parser; + +import lotto.domain.LottoNumber; + +import java.util.ArrayList; +import java.util.List; + +public class WinningNumberParser { + public static LottoNumber parseBonus(String bonusLine, List winningNumbers) { + try { + int bonusValue = Integer.parseInt(bonusLine.trim()); + LottoNumber bonus = new LottoNumber(bonusValue); + if (winningNumbers.contains(bonus)) { + throw new IllegalArgumentException("보너스 번호는 당첨 번호와 중복될 수 없습니다."); + } + return bonus; + } catch (NumberFormatException e) { + throw new IllegalArgumentException("보너스 번호는 숫자여야 합니다."); + } + } + + public static List parseNumbers(String line) { + String[] parts = line.split(","); + if (parts.length != 6) { + throw new IllegalArgumentException("숫자는 반드시 6개여야 합니다."); + } + List list = new ArrayList<>(); + for (String lottoParts : parts) { + try { + list.add(new LottoNumber(Integer.parseInt(lottoParts.trim()))); + } catch (NumberFormatException e) { + throw new IllegalArgumentException("숫자 형식이 올바르지 않습니다."); + } + } + return list; + } +} diff --git a/src/main/java/lotto/validate/WinningNumberValidate.java b/src/main/java/lotto/validate/WinningNumberValidate.java new file mode 100644 index 00000000..f0a062c8 --- /dev/null +++ b/src/main/java/lotto/validate/WinningNumberValidate.java @@ -0,0 +1,31 @@ +package lotto.validate; + +import lotto.domain.LottoNumber; + +import java.util.HashSet; +import java.util.List; + +public class WinningNumberValidate { + private static final int LOTTO_START_NUMBER = 1; + private static final int LOTTO_END_NUMBER = 45; + + public static void validate(List numbers) { + numberValidate(numbers); + duplicateNumber(numbers); + } + + private static void numberValidate(List list) { + for (LottoNumber lottoNumber : list) { + int inputNumber = lottoNumber.getValue(); + if (inputNumber < LOTTO_START_NUMBER || inputNumber > LOTTO_END_NUMBER) { + throw new IllegalArgumentException("1~45 사이의 숫자만 입력 가능합니다."); + } + } + } + + private static void duplicateNumber(List list) { + if (new HashSet<>(list).size() != list.size()) { + throw new IllegalArgumentException("중복된 숫자가 있습니다."); + } + } +} diff --git a/src/test/java/lotto/InputLottoNumberTest.java b/src/test/java/lotto/InputLottoNumberTest.java new file mode 100644 index 00000000..bd879ca4 --- /dev/null +++ b/src/test/java/lotto/InputLottoNumberTest.java @@ -0,0 +1,25 @@ +package lotto; + +import lotto.domain.LottoNumber; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class InputLottoNumberTest { + + @Test + @DisplayName("로또 번호의 범위는 1 ~ 45 사이") + void validNumberCreatesLottoNumber() { + assertDoesNotThrow(() -> new LottoNumber(10)); + } + + + @Test + @DisplayName("로또 번호가 1 ~ 45 사이가 아닌 경우") + void invalidNumberThrowsException() { + assertThrows(IllegalArgumentException.class, () -> new LottoNumber(0)); + assertThrows(IllegalArgumentException.class, () -> new LottoNumber(46)); + } +} \ No newline at end of file diff --git a/src/test/java/lotto/LottoCounterTest.java b/src/test/java/lotto/LottoCounterTest.java new file mode 100644 index 00000000..256c8ad1 --- /dev/null +++ b/src/test/java/lotto/LottoCounterTest.java @@ -0,0 +1,21 @@ +package lotto; + +import lotto.domain.InputLottoNumber; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class LottoCounterTest { + + @Test + void generateAuto() { + int total = 5; + int passivity = 2; + + List autos = LottoCounter.generateAuto(total, passivity); + + assertEquals(3, autos.size(), "자동 로또 개수는 총 5장에서 수동 2장을 뺀 3장입니다."); + } +} \ No newline at end of file diff --git a/src/test/java/lotto/LottoManageTest.java b/src/test/java/lotto/LottoManageTest.java new file mode 100644 index 00000000..97683f94 --- /dev/null +++ b/src/test/java/lotto/LottoManageTest.java @@ -0,0 +1,48 @@ +package lotto; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.List; + + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; + +class LottoManageTest { + + @Test + @DisplayName("숫자 확인") + void pullOutNumbersTest() { + List numbers = LottoManage.pullOutNumbers(); + + assertEquals(45, numbers.size()); + assertEquals(1, numbers.get(0)); + assertEquals(45, numbers.get(44)); + } + + @Test + @DisplayName("숫자 섞기") + void shuffleNumbersTest() { + List firstNumbers = LottoManage.pullOutNumbers(); + List endNumbers = new ArrayList<>(firstNumbers); + + LottoManage.shuffleNumbers(endNumbers); + + assertNotEquals(firstNumbers, endNumbers); +// assertEquals(firstNumbers, endNumbers); + // 해당 결과가 같지 않으면 테스트 통과 + } + + @Test + @DisplayName("숫자 인덱스 정렬") + void pickupLottoNumbersTest() { + List numbers = LottoManage.pullOutNumbers(); + LottoManage.shuffleNumbers(numbers); + List lottoNumbers = LottoManage.pickupLottoNumbers(numbers); + + assertEquals(6, lottoNumbers.size()); + // 로또 번호는 한 줄당 6개 + } +} \ No newline at end of file diff --git a/src/test/java/lotto/PassivityNumberInputTest.java b/src/test/java/lotto/PassivityNumberInputTest.java new file mode 100644 index 00000000..b8ebb896 --- /dev/null +++ b/src/test/java/lotto/PassivityNumberInputTest.java @@ -0,0 +1,24 @@ +package lotto; + +import lotto.input.PassivityNumberInput; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; + +import static org.junit.jupiter.api.Assertions.*; + +class PassivityNumberInputTest { + + @Test + void passivityLottoCount() { + String input = "7\n-1\n2\n"; + ByteArrayInputStream in = new ByteArrayInputStream(input.getBytes()); + System.setIn(in); + + PassivityNumberInput passivityNumberInput = new PassivityNumberInput(5); + int result = passivityNumberInput.passivityLottoCount(); + + assertEquals(2, result, "수동 개수는 2개 반한됩니다"); + } + +} \ No newline at end of file From be3740f9004ff9039a4f2c976ea190d8fa60281f Mon Sep 17 00:00:00 2001 From: jisoo78 Date: Tue, 27 May 2025 20:58:43 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 ++++++ src/main/java/lotto/domain/LottoBonus.java | 18 +++++++----------- src/main/java/lotto/domain/LottoNumber.java | 1 + 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 239f9e78..454ab60c 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,12 @@ plugins { id 'java' } +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + group = 'cholog' version = '1.0-SNAPSHOT' diff --git a/src/main/java/lotto/domain/LottoBonus.java b/src/main/java/lotto/domain/LottoBonus.java index 4539d924..00c62fc1 100644 --- a/src/main/java/lotto/domain/LottoBonus.java +++ b/src/main/java/lotto/domain/LottoBonus.java @@ -1,5 +1,8 @@ package lotto.domain; +import java.util.Comparator; +import java.util.EnumSet; + public enum LottoBonus { FIRST_PLACE(6, false, 2000000000), SECOND_PLACE(5, true, 30000000), @@ -31,16 +34,9 @@ public Money getWinningMoney() { } public static LottoBonus valueOf (int matchCount, boolean needBonusMatch) { - for (LottoBonus bonus : values()) { - if (bonus.matchCount == matchCount && bonus.needBonusMatch == needBonusMatch) { - return bonus; - } - } - for (LottoBonus bonus : values()) { - if (bonus.matchCount == matchCount && !bonus.needBonusMatch) { - return bonus; - } - } - return LOSING_PLACE; + return EnumSet.allOf(LottoBonus.class).stream() + .filter(b -> b.matchCount == matchCount) + .min(Comparator.comparing(b -> b.needBonusMatch != needBonusMatch)) + .orElse(LOSING_PLACE); } } diff --git a/src/main/java/lotto/domain/LottoNumber.java b/src/main/java/lotto/domain/LottoNumber.java index 07e32610..962f56d5 100644 --- a/src/main/java/lotto/domain/LottoNumber.java +++ b/src/main/java/lotto/domain/LottoNumber.java @@ -1,6 +1,7 @@ package lotto.domain; public record LottoNumber(int value) { + private static final int MINIMUM_NUMBER = 1; private static final int MAX_NUMBER = 45; From 46f93c02a67f7b50ac84b227ed1d4770d551671c Mon Sep 17 00:00:00 2001 From: jisoo78 Date: Tue, 27 May 2025 21:27:41 +0900 Subject: [PATCH 3/3] fileRemove --- src/main/java/lotto/Application.java | 1 + src/main/java/lotto/BonusNumber.java | 21 ---- src/main/java/lotto/InputLottoNumber.java | 37 ------- src/main/java/lotto/InputMoney.java | 18 ---- src/main/java/lotto/LottoBonus.java | 46 --------- src/main/java/lotto/LottoNumber.java | 44 --------- src/main/java/lotto/LottoStatus.java | 39 -------- src/main/java/lotto/MatchResult.java | 89 ----------------- src/main/java/lotto/Money.java | 17 ---- src/main/java/lotto/WinningNumber.java | 97 ------------------- src/main/java/lotto/WinningNumberInput.java | 42 -------- src/main/java/lotto/WinningNumberParser.java | 35 ------- .../java/lotto/WinningNumberValidate.java | 29 ------ 13 files changed, 1 insertion(+), 514 deletions(-) delete mode 100644 src/main/java/lotto/BonusNumber.java delete mode 100644 src/main/java/lotto/InputLottoNumber.java delete mode 100644 src/main/java/lotto/InputMoney.java delete mode 100644 src/main/java/lotto/LottoBonus.java delete mode 100644 src/main/java/lotto/LottoNumber.java delete mode 100644 src/main/java/lotto/LottoStatus.java delete mode 100644 src/main/java/lotto/MatchResult.java delete mode 100644 src/main/java/lotto/Money.java delete mode 100644 src/main/java/lotto/WinningNumber.java delete mode 100644 src/main/java/lotto/WinningNumberInput.java delete mode 100644 src/main/java/lotto/WinningNumberParser.java delete mode 100644 src/main/java/lotto/WinningNumberValidate.java diff --git a/src/main/java/lotto/Application.java b/src/main/java/lotto/Application.java index 69eeb2f5..f9a24519 100644 --- a/src/main/java/lotto/Application.java +++ b/src/main/java/lotto/Application.java @@ -18,6 +18,7 @@ public static void main(String[] args) { new Application().run(); } + // 테스트 확인 private void run() { int ticketCount = buyLotto(); List ticket = prepareTicket(ticketCount); diff --git a/src/main/java/lotto/BonusNumber.java b/src/main/java/lotto/BonusNumber.java deleted file mode 100644 index 4179c22a..00000000 --- a/src/main/java/lotto/BonusNumber.java +++ /dev/null @@ -1,21 +0,0 @@ -package lotto; - -public class BonusNumber { - private final LottoNumber bonus; - - public BonusNumber(int number, InputLottoNumber winningNumbers) { - LottoNumber lottoNumber = new LottoNumber(number); - if (winningNumbers.contains(lottoNumber)) { - throw new IllegalArgumentException("보너스 번호는 당첨 번호와 중복될 수 없습니다."); - } - this.bonus = lottoNumber; - } - - public boolean isMatch(InputLottoNumber ticket) { - return ticket.contains(bonus); - } - - public LottoNumber getBonus() { - return bonus; - } -} diff --git a/src/main/java/lotto/InputLottoNumber.java b/src/main/java/lotto/InputLottoNumber.java deleted file mode 100644 index 204a225c..00000000 --- a/src/main/java/lotto/InputLottoNumber.java +++ /dev/null @@ -1,37 +0,0 @@ -package lotto; - -import java.util.List; -import java.util.stream.Collectors; - -public class InputLottoNumber { - private final List numbers; - - private InputLottoNumber(List numbers) { - this.numbers = numbers; - } - - public static InputLottoNumber of(List list) { - return new InputLottoNumber(list); - } - - public int countMatching(WinningNumber winning) { - return (int) numbers.stream() - .filter(winning::contains) - .count(); - } - - public boolean contains(LottoNumber number) { - return numbers.contains(number); - } - - @Override - public String toString() { - return numbers.stream() - .map(n -> String.valueOf(n.getValue())) - .collect(Collectors.joining(", ", "[", "]")); - - @Override - public String toString() { - return numbers.toString(); - } -} diff --git a/src/main/java/lotto/InputMoney.java b/src/main/java/lotto/InputMoney.java deleted file mode 100644 index 9ca5cb16..00000000 --- a/src/main/java/lotto/InputMoney.java +++ /dev/null @@ -1,18 +0,0 @@ -package lotto; - -import java.util.Scanner; - -public class InputMoney { - private static final int MINIMUM_AMOUNT = 1000; - - private static int inputMoney() { - Scanner scanner = new Scanner(System.in); - System.out.print("구입 금액 입력(금액은 1000원 이상 입력해주세요): "); - int money = scanner.nextInt(); - while (money < MINIMUM_AMOUNT) { - System.out.println("구매에 필요한 금액은 1000원 이상입니다 다시 입력해주세요"); - money = scanner.nextInt(); - } - return money; - } -} diff --git a/src/main/java/lotto/LottoBonus.java b/src/main/java/lotto/LottoBonus.java deleted file mode 100644 index 787ab708..00000000 --- a/src/main/java/lotto/LottoBonus.java +++ /dev/null @@ -1,46 +0,0 @@ -package lotto; - -public enum LottoBonus { - FIRST_PLACE(6, false, 2000000000), - SECOND_PLACE(5, true, 30000000), - THIRD_PLACE(5, false, 1500000), - FOURTH_PLACE(4, false, 50000), - FIFTH_PLACE(3, false, 5000), - LOSING_PLACE(0, false, 0); - - private final int matchCount; - private final boolean needBonusMatch; - private final Money winningMoney; - - LottoBonus(int matchCount, boolean needBonusMatch, int winningMoney) { - this.matchCount = matchCount; - this.needBonusMatch = needBonusMatch; - this.winningMoney = new Money(winningMoney); - } - - public int getMatchCount() { - return matchCount; - } - - public boolean isNeedBonusMatch() { - return needBonusMatch; - } - - public Money getWinningMoney() { - return winningMoney; - } - - public static LottoBonus valueOf (int matchCount, boolean needBonusMatch) { - for (LottoBonus bonus : values()) { - if (bonus.matchCount == matchCount && bonus.needBonusMatch == needBonusMatch) { - return bonus; - } - } - for (LottoBonus bonus : values()) { - if (bonus.matchCount == matchCount && !bonus.needBonusMatch) { - return bonus; - } - } - return LOSING_PLACE; - } -} diff --git a/src/main/java/lotto/LottoNumber.java b/src/main/java/lotto/LottoNumber.java deleted file mode 100644 index d9e456a2..00000000 --- a/src/main/java/lotto/LottoNumber.java +++ /dev/null @@ -1,44 +0,0 @@ -package lotto; - -public record LottoNumber(int value) { - private static final int MINIMUM_NUMBER = 1; - private static final int MAX_NUMBER = 45; - - public LottoNumber { - if (value < MINIMUM_NUMBER || value > MAX_NUMBER) { - throw new IllegalArgumentException("로또 번호는 1 ~45 사이의 숫자 입니다."); - } - -public class LottoNumber { - private final int value; - private static final int MINIMUM_NUMBER = 1; - private static final int MAX_NUMBER = 45; - - public LottoNumber(int value) { - if (value < MINIMUM_NUMBER || value > MAX_NUMBER) { - throw new IllegalArgumentException("로또 번호는 1 ~45 사이의 숫자 입니다."); - } - this.value = value; - } - - public int getValue() { - return value; - } - - @Override - public boolean equals(Object object) { - if (!(object instanceof LottoNumber)) return false; - return this.value == ((LottoNumber) object).value; - } - - @Override - public int hashCode() { - return Integer.hashCode(value); - } - - - @Override - public String toString() { - return String.valueOf(value); - } -} diff --git a/src/main/java/lotto/LottoStatus.java b/src/main/java/lotto/LottoStatus.java deleted file mode 100644 index a104a209..00000000 --- a/src/main/java/lotto/LottoStatus.java +++ /dev/null @@ -1,39 +0,0 @@ -package lotto; - -import java.util.Comparator; -import java.util.HashMap; -import java.util.Map; - -public class LottoStatus { - private final Map stat = new HashMap<>(); - - public void record(MatchResult matchResult) { - stat.put(matchResult, stat.getOrDefault(matchResult, 0) + 1); - } - - public void print() { - MatchResult.getAll().stream() - .filter(matchResult -> matchResult != MatchResult.NONE) - .sorted(Comparator.comparing(MatchResult::getMatchCount)) - .forEach(matchResult -> System.out.printf( - "%d개 일치 (%d원)- %d개\n", - matchResult.getMatchCount(), matchResult.getPrizeAmount().amount, - stat.getOrDefault(matchResult, 0) - .filter(r -> r != MatchResult.NONE) - .forEach(r -> System.out.printf( - "%d개 일치 (%d원)- %d개\n", - r.getMatchCount(), r.getPrizeAmount().amount, - stat.getOrDefault(r, 0) - )); - } - - public Money getTotalPrizeAmount() { - int sum = 0; - for (Map.Entry entry : stat.entrySet()) { - sum += entry.getKey().getPrizeAmount().amount * entry.getValue(); - } - return new Money(sum); - } - - -} diff --git a/src/main/java/lotto/MatchResult.java b/src/main/java/lotto/MatchResult.java deleted file mode 100644 index 7b0a03a9..00000000 --- a/src/main/java/lotto/MatchResult.java +++ /dev/null @@ -1,89 +0,0 @@ -package lotto; - -import java.util.Arrays; -import java.util.List; - -public class MatchResult { - public static final MatchResult NONE = new MatchResult(LottoBonus.LOSING_PLACE); - - private static boolean bonusMatch; - private final LottoBonus bonus; - - public MatchResult(LottoBonus bonus) { - this.bonus = bonus; - } - - public static MatchResult of(int matchCount) { - LottoBonus lottoBonus = LottoBonus.valueOf(matchCount, bonusMatch); - return new MatchResult(lottoBonus); - } - - public static List getAll() { - return Arrays.stream(LottoBonus.values()) - .filter(b -> b != LottoBonus.LOSING_PLACE) - .map(MatchResult::new) - .toList(); - } - - public int getMatchCount() { - return bonus.getMatchCount(); - } - - public Money getPrizeAmount() { - return bonus.getWinningMoney(); - } - - public boolean isBonusMatch() { - return bonus.isNeedBonusMatch(); - } - - public boolean isWinning() { - return bonus != LottoBonus.LOSING_PLACE; - } - - @Override - public boolean equals(Object object) { - if (this == object) return true; - if (!(object instanceof MatchResult)) return false; - MatchResult matchResult = (MatchResult) object; - return bonus == matchResult.bonus; - } - - @Override - public int hashCode() { - return bonus.hashCode(); - private final int matchCount; - private final Money prizeAmount; - private static final MatchResult THREE = new MatchResult(3, new Money(5000)); - private static final MatchResult FOUR = new MatchResult(4, new Money(50000)); - private static final MatchResult FIVE = new MatchResult(5, new Money(1500000)); - private static final MatchResult SIX = new MatchResult(6, new Money(2000000000)); - public static final MatchResult NONE = new MatchResult(0, new Money(0)); - private static final List VALUES = Arrays.asList(THREE, FOUR, FIVE, SIX, NONE); - - private MatchResult(int matchCount, Money prizeAmount) { - this.matchCount = matchCount; - this.prizeAmount = prizeAmount; - } - - - public static MatchResult of(int count) { - for (MatchResult matchResult : VALUES) { - if (matchResult.matchCount == count) return matchResult; - } - return NONE; - } - - public int getMatchCount() { - return matchCount; - } - - public Money getPrizeAmount() { - return prizeAmount; - } - - public static List getAll() { - return VALUES; - } - -} diff --git a/src/main/java/lotto/Money.java b/src/main/java/lotto/Money.java deleted file mode 100644 index 356bd9f7..00000000 --- a/src/main/java/lotto/Money.java +++ /dev/null @@ -1,17 +0,0 @@ -package lotto; - -public class Money { - public final int amount; - - public Money(int amount) { - this.amount = amount; - } - - public int countTickets(int price) { - return amount / price; - } - - public int getAmount() { - return amount; - } -} diff --git a/src/main/java/lotto/WinningNumber.java b/src/main/java/lotto/WinningNumber.java deleted file mode 100644 index 3d5ff49f..00000000 --- a/src/main/java/lotto/WinningNumber.java +++ /dev/null @@ -1,97 +0,0 @@ -package lotto; - - -import java.util.List; - -public class WinningNumber { - private final List winning; - private final LottoNumber bonus; - - private WinningNumber(List winning, LottoNumber bonus) { - this.bonus = bonus; - this.winning = winning; - } - - public static WinningNumber of(List winning, LottoNumber bonus) { - return new WinningNumber(winning, bonus); - } - - public List getWinning() { - return winning; - } - - public LottoNumber getBonus() { - return bonus; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Scanner; - -public class WinningNumber { - private final List winning; - private static final int LOTTO_START_NUMBER = 1; - private static final int LOTTO_END_NUMBER = 45; - - private WinningNumber(List winning) { - this.winning = winning; - } - - public static WinningNumber of(List list) { - return new WinningNumber(list); - } - - public static WinningNumber inputWinningNumbers() { - while (true) { - String line = readLine(); - try { - List list = parseNumbers(line); - numberValidate(list); - duplicateNumber(list); - return WinningNumber.of(list); - } catch (IllegalArgumentException e) { - System.out.println("→ " + e.getMessage() + " 다시 입력해주세요."); - } - } - } - private static String readLine() { - System.out.println("지난 주 당첨 번호를 입력해 주세요 (예: 1,2,3,4,5,6): "); - return new Scanner(System.in).nextLine(); - } - - private static List parseNumbers(String line) { - String[] parts = line.split(","); - if (parts.length != 6) { - throw new IllegalArgumentException("숫자는 반드시 6개여야 합니다."); - } - List list = new ArrayList<>(); - for (String lottoParts : parts) { - try { - list.add(new LottoNumber(Integer.parseInt(lottoParts.trim()))); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("숫자 형식이 올바르지 않습니다."); - } - } - return list; - } - - private static void numberValidate(List list) { - for (LottoNumber lottoNumber : list) { - int inputNumber = lottoNumber.getValue(); - if (inputNumber < LOTTO_START_NUMBER || inputNumber > LOTTO_END_NUMBER) { - throw new IllegalArgumentException("1~45 사이의 숫자만 입력 가능합니다."); - } - } - } - - private static void duplicateNumber(List list) { - if (new HashSet<>(list).size() != list.size()) { - throw new IllegalArgumentException("중복된 숫자가 있습니다."); - } - } - - public boolean contains(LottoNumber num) { - return winning.contains(num); - } - -} diff --git a/src/main/java/lotto/WinningNumberInput.java b/src/main/java/lotto/WinningNumberInput.java deleted file mode 100644 index 1646f018..00000000 --- a/src/main/java/lotto/WinningNumberInput.java +++ /dev/null @@ -1,42 +0,0 @@ -package lotto; - -import java.util.List; -import java.util.Scanner; - -public class WinningNumberInput { - private final Scanner scanner = new Scanner(System.in); - private final WinningNumberParser winningNumberParser; - - public WinningNumberInput() { - this(new WinningNumberParser()); - } - - public WinningNumberInput(WinningNumberParser winningNumberParser) { - this.winningNumberParser = winningNumberParser; - } - - public WinningNumber inputWinningNumber() { - while (true) { - String line = readLine(); - try { - List list = winningNumberParser.parseNumbers(line); - - String bonusNumber = bonusReadLine(); - LottoNumber bonus = winningNumberParser.parseBonus(bonusNumber, list); - return WinningNumber.of(list, bonus); - } catch (IllegalArgumentException e) { - System.out.println("→ " + e.getMessage() + " 다시 입력해주세요."); - } - } - } - - private static String readLine() { - System.out.println("지난 주 당첨 번호를 입력해 주세요 (예: 1,2,3,4,5,6): "); - return new Scanner(System.in).nextLine(); - } - - private static String bonusReadLine() { - System.out.println("보너스 번호를 입력해주세요: "); - return new Scanner(System.in).nextLine(); - } -} diff --git a/src/main/java/lotto/WinningNumberParser.java b/src/main/java/lotto/WinningNumberParser.java deleted file mode 100644 index 68cd8cc4..00000000 --- a/src/main/java/lotto/WinningNumberParser.java +++ /dev/null @@ -1,35 +0,0 @@ -package lotto; - -import java.util.ArrayList; -import java.util.List; - -public class WinningNumberParser { - public static LottoNumber parseBonus(String bonusLine, List winningNumbers) { - try { - int bonusValue = Integer.parseInt(bonusLine.trim()); - LottoNumber bonus = new LottoNumber(bonusValue); - if (winningNumbers.contains(bonus)) { - throw new IllegalArgumentException("보너스 번호는 당첨 번호와 중복될 수 없습니다."); - } - return bonus; - } catch (NumberFormatException e) { - throw new IllegalArgumentException("보너스 번호는 숫자여야 합니다."); - } - } - - public static List parseNumbers(String line) { - String[] parts = line.split(","); - if (parts.length != 6) { - throw new IllegalArgumentException("숫자는 반드시 6개여야 합니다."); - } - List list = new ArrayList<>(); - for (String lottoParts : parts) { - try { - list.add(new LottoNumber(Integer.parseInt(lottoParts.trim()))); - } catch (NumberFormatException e) { - throw new IllegalArgumentException("숫자 형식이 올바르지 않습니다."); - } - } - return list; - } -} diff --git a/src/main/java/lotto/WinningNumberValidate.java b/src/main/java/lotto/WinningNumberValidate.java deleted file mode 100644 index ad14c70e..00000000 --- a/src/main/java/lotto/WinningNumberValidate.java +++ /dev/null @@ -1,29 +0,0 @@ -package lotto; - -import java.util.HashSet; -import java.util.List; - -public class WinningNumberValidate { - private static final int LOTTO_START_NUMBER = 1; - private static final int LOTTO_END_NUMBER = 45; - - public static void validate(List numbers) { - numberValidate(numbers); - duplicateNumber(numbers); - } - - private static void numberValidate(List list) { - for (LottoNumber lottoNumber : list) { - int inputNumber = lottoNumber.getValue(); - if (inputNumber < LOTTO_START_NUMBER || inputNumber > LOTTO_END_NUMBER) { - throw new IllegalArgumentException("1~45 사이의 숫자만 입력 가능합니다."); - } - } - } - - private static void duplicateNumber(List list) { - if (new HashSet<>(list).size() != list.size()) { - throw new IllegalArgumentException("중복된 숫자가 있습니다."); - } - } -}