From 276d063b2228c207b4721c3b3df3df9c6b2343ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Sun, 30 Nov 2025 17:47:34 +0900 Subject: [PATCH 01/22] =?UTF-8?q?feat=20:=20=EC=BA=90=EC=8B=9C=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=EC=9D=84=20=EC=9B=90=ED=95=A0=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=ED=95=98=EA=B8=B0=EC=9C=84=ED=95=B4=20LottoNumber=20=EC=9D=98?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EB=B0=A9=EC=8B=9D=EC=9D=84=20=EC=A0=95?= =?UTF-8?q?=EC=A0=81=ED=8C=A9=ED=84=B0=EB=A6=AC=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=98=EA=B3=A0,=20Lo?= =?UTF-8?q?ttoNumber=EC=9D=98=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9D=84=20=EB=A7=89=EA=B8=B0=EC=9C=84=ED=95=B4=20cla?= =?UTF-8?q?ss=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/model/Lotto.java | 2 +- .../java/lotto/domain/model/LottoNumber.java | 37 +++++++++++++++++-- .../lotto/domain/model/LottoNumberCache.java | 2 +- .../domain/model/LottoNumberCacheTest.java | 2 +- .../lotto/domain/model/LottoNumberTest.java | 2 +- 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/main/java/lotto/domain/model/Lotto.java b/src/main/java/lotto/domain/model/Lotto.java index 0804765b5e..9c6d9a7358 100644 --- a/src/main/java/lotto/domain/model/Lotto.java +++ b/src/main/java/lotto/domain/model/Lotto.java @@ -83,7 +83,7 @@ private static List convertToLottoNumbers(List lottoNumber public List numberValues() { return this.numbers.stream() - .map(LottoNumber::value) + .map(LottoNumber::getValue) .toList(); } diff --git a/src/main/java/lotto/domain/model/LottoNumber.java b/src/main/java/lotto/domain/model/LottoNumber.java index e6b03b2d0e..4ae072fe75 100644 --- a/src/main/java/lotto/domain/model/LottoNumber.java +++ b/src/main/java/lotto/domain/model/LottoNumber.java @@ -1,13 +1,30 @@ package lotto.domain.model; -public record LottoNumber(int value) { +import java.util.Objects; + +public class LottoNumber{ + + private final int value; - public LottoNumber(String value) { + private LottoNumber(String value) { this(Integer.parseInt(value)); } - public LottoNumber { + private LottoNumber(int value) { validate(value); + this.value = value; + } + + public static LottoNumber of(int value) { + return new LottoNumber(value); + } + + public static LottoNumber of(String value) { + return of(Integer.parseInt(value)); + } + + public int getValue() { + return value; } private void validate(int value) { @@ -15,4 +32,18 @@ private void validate(int value) { throw new IllegalArgumentException("로또 번호는 1~45사이 입력하시오"); } } + + @Override + public boolean equals(Object o) { + if(o == null || getClass() != o.getClass()) { + return false; + } + LottoNumber that = (LottoNumber) o; + return value == that.value; + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } } diff --git a/src/main/java/lotto/domain/model/LottoNumberCache.java b/src/main/java/lotto/domain/model/LottoNumberCache.java index 6f1579fc9b..c20fba082c 100644 --- a/src/main/java/lotto/domain/model/LottoNumberCache.java +++ b/src/main/java/lotto/domain/model/LottoNumberCache.java @@ -23,7 +23,7 @@ private static Map getLottoNumberMap() { .collect( Collectors.toMap( Function.identity(), - LottoNumber::new) + LottoNumber::of) ); } diff --git a/src/test/java/lotto/domain/model/LottoNumberCacheTest.java b/src/test/java/lotto/domain/model/LottoNumberCacheTest.java index 73b584692b..7be99fa28f 100644 --- a/src/test/java/lotto/domain/model/LottoNumberCacheTest.java +++ b/src/test/java/lotto/domain/model/LottoNumberCacheTest.java @@ -13,7 +13,7 @@ class LottoNumberCacheTest { @Test void lottoNumber를_입력하면_필요한_LottoNumber객체를_반환한다() { assertThat(LottoNumberCache.getLottoNumber(5)) - .isEqualTo(new LottoNumber(5)); + .isEqualTo(LottoNumber.of(5)); } @ParameterizedTest diff --git a/src/test/java/lotto/domain/model/LottoNumberTest.java b/src/test/java/lotto/domain/model/LottoNumberTest.java index ab07622c69..16921481c1 100644 --- a/src/test/java/lotto/domain/model/LottoNumberTest.java +++ b/src/test/java/lotto/domain/model/LottoNumberTest.java @@ -11,7 +11,7 @@ class LottoNumberTest { @ValueSource(ints = {0, 46}) void 로또번호가_범위_밖이면_에러(int num) { assertThatThrownBy(() -> - new LottoNumber(num) + LottoNumber.of(num) ).isInstanceOf(IllegalArgumentException.class) .hasMessage("로또 번호는 1~45사이 입력하시오"); } From f753801747cbfac0b83f55ab86bc7f58f3dffc24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Sun, 30 Nov 2025 17:48:21 +0900 Subject: [PATCH 02/22] =?UTF-8?q?doc=20:=20step4=20=EA=B3=BC=EC=A0=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EA=B8=B0=EB=8A=A5=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6c61bbed0a..312f9b8cc8 100644 --- a/README.md +++ b/README.md @@ -125,16 +125,81 @@ `WinningLotto` : Lotto 에서 일치갯수와 보너스 맞는지 받아와 Rank 에 전달하여 당첨 결과를 WinningResult 에 전달 `Rank` : 규칙 정의 및 등수 판단 -### 별도 메오 +### 별도 메모 - `Rank` 와 `Lotto` 순환참조 없애기 - indent 가 2여서 그러는건데 이 경우에 스트림 쓰기 추천 - `bonus` 가 모든 번호 검증 -> 필요한거만 - 쓰지않는 패키지(ctl + opt + O)와, 포매팅 정리 (opt + cmd + L) - ### 추가 개인 과제 -- 난수생성에 대한 테스트 통제 +- [x] 난수생성에 대한 테스트 통제 (보류) + - 현재 난수생성 방식은 static 메서드로 구현하여서 테스트 코드 내에서 Override가 불가능하다. ## 3차 피드백 후 리팩터링 - [x] : `LottoNumber`는 매번 인스턴스가 생성되기 때문에 인스턴스의 갯수가 너무 많아져 성능이 떨어질 수 있다. LottoNumber 인스턴스를 생성한 후 '재사용'할 수 있도록 구현한다. Map과 같은 곳에 인스턴스를 생성한 후 재사용하는 방법을 찾으면 됨 - -> 방식 : 캐싱 구현 \ No newline at end of file + -> 방식 : 캐싱 구현 + +#### 객체 그래프 +```text + Pay → LottoGame + ↘ + LottoTickets → List → List ← LottoNumberCache + ↘ + WinningLotto (Lotto + bonus LottoNumber) + ↓ + Rank → WinningResult (Map) +``` + +- 최종 + - `Pay` : 입력받은 지불 금액에 대한 객체 + - `LottoGame` : 로또 진행 흐름을 담당 (입력받은 금액을 갯수로 바꾼다.) + - `LottoTickets` : 입력받은 갯수에 따라 `Lotto` 객체 생성 + - `Lotto` : 로또 역할, 입력받은 번호가 몇개 일치하는지 확인 + - `LottoNumber` : 로또의 각 수에 대한 포장 객체 + - `LottoNumberCache` : 로또 번호를 캐싱하여 로또번호 재생산 막는 역할 + - `WinningLotto` : 당첨번호 관리 (Lotto + LottoNumber) + - `Rank` : 당첨 수와 금액의 정보를 가지고, 일치 갯수를 가지고 등수를 결정 + - `WinningResult` : 당첨 당첨 통계 추리기 + + + +# 4단계 - 로또 (수동) +## 기본 안내 +### 기능 요구사항 +- 현재 로또 생성기는 자동 생성 기능만 제공한다. 사용자가 수동으로 추첨 번호를 입력할 수 있도록 해야 한다. +- 입력한 금액, 자동 생성 숫자, 수동 생성 번호를 입력하도록 해야 한다. + +## 핵심 요구 사항 +- 구매 로또 시 수동으로 추첨하는 기능 추가 +- 자동 생성 숫자, 수동 생성 번호 추가 + +## 기능목록 +- [ ] : 수동으로 구매 할 로또 수 입력 + - [ ] : 수동으로 구매하는 로또가 총 구매가능 수 보다 적은지 + - [ ] :로또 곧바로 자동 생성이 아닌 총 구매 가능 수 제시 + - [ ] : 넘었을 경우 다시 입력 유도 +- [ ] : 수동으로 구매할 로또 번호 입력 + - [ ] : 수동 로또 수만큼 반복입력 + - [ ] : 중복 입력, 1 ~ 45 범위 넘겨서 입력 시 다시 입력 유도 + - 고민 : 입력 한번 할 때 마다 제시 or 모아서 넘기기 + - [ ] : 입력 할 때 마다 제시 +- [ ] : 로또 발행 결과 수동, 자동 갯수 카운트 + - [ ] : 수동부터 먼저 제시 + +## 클래스 다이어그램 설계 +### 도메인 목록과 역할 + +#### 기존 +- `Pay` : 입력받은 지불 금액에 대한 객체 +- `LottoGame` : 로또 진행 흐름을 담당 (입력받은 금액을 갯수로 바꾼다.) +- `LottoTickets` : 입력받은 갯수에 따라 `Lotto` 객체 생성 +- `Lotto` : 로또 역할, 입력받은 번호가 몇개 일치하는지 확인 +- `LottoNumber` : 로또의 각 수에 대한 포장 객체 +- `LottoNumberCache` : 로또 번호를 캐싱하여 로또번호 재생산 막는 역할 +- `WinningLotto` : 당첨번호 관리 (Lotto + LottoNumber) +- `Rank` : 당첨 수와 금액의 정보를 가지고, 일치 갯수를 가지고 등수를 결정 +- `WinningResult` : 당첨 당첨 통계 추리기 + +#### 추가 +- `manualLotto` : 수동구매하는 로또와 그 갯수 관리 + - 생명주기 : \ No newline at end of file From 77b6b2a1e649798384769f0c3d336702580ccb57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Sun, 30 Nov 2025 21:21:09 +0900 Subject: [PATCH 03/22] =?UTF-8?q?feat=20:=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=B0=AF=EC=88=98=20=EC=A7=80?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EB=A1=9C=EB=98=90=20=EC=88=98=EB=8F=99?= =?UTF-8?q?=EB=B0=9C=ED=96=89=20=EA=B0=9C=EB=B0=9C=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/domain/business/LottoBuyResult.java | 32 +++++++++++++++++++ src/main/java/lotto/domain/model/Manual.java | 31 ++++++++++++++++++ .../domain/business/LottoBuyResultTest.java | 30 +++++++++++++++++ .../java/lotto/domain/model/ManualTest.java | 26 +++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 src/main/java/lotto/domain/business/LottoBuyResult.java create mode 100644 src/main/java/lotto/domain/model/Manual.java create mode 100644 src/test/java/lotto/domain/business/LottoBuyResultTest.java create mode 100644 src/test/java/lotto/domain/model/ManualTest.java diff --git a/src/main/java/lotto/domain/business/LottoBuyResult.java b/src/main/java/lotto/domain/business/LottoBuyResult.java new file mode 100644 index 0000000000..ee2c412589 --- /dev/null +++ b/src/main/java/lotto/domain/business/LottoBuyResult.java @@ -0,0 +1,32 @@ +package lotto.domain.business; + +import java.util.List; +import lotto.domain.model.Lotto; +import lotto.domain.model.Manual; +import lotto.domain.model.Pay; + +public class LottoBuyResult { + + private final Pay pay; + private final Manual manual; + + public LottoBuyResult(int pay, int manualNumber, List lottoNumbers) { + this(new Pay(pay), new Manual(manualNumber, toLottoList(lottoNumbers))); + } + + public LottoBuyResult(Pay pay, Manual manual) { + validate(pay, manual); + this.pay = pay; + this.manual = manual; + } + + private static List toLottoList(List lottoNumbers) { + return lottoNumbers.stream() + .map(Lotto::new) + .toList(); + } + + private void validate(Pay pay, Manual manual) { + manual.validateLimit(pay.convertToBuyCount()); + } +} diff --git a/src/main/java/lotto/domain/model/Manual.java b/src/main/java/lotto/domain/model/Manual.java new file mode 100644 index 0000000000..4e7556df6f --- /dev/null +++ b/src/main/java/lotto/domain/model/Manual.java @@ -0,0 +1,31 @@ +package lotto.domain.model; + +import java.util.List; + +public class Manual { + + private final int manualNumber; + private final List manualLottoList; + + public Manual(String manulNumber, List manualLottoList) { + this(Integer.parseInt(manulNumber), manualLottoList); + } + + public Manual(int manulNumber, List manualLottoList) { + validateDifference(manulNumber, manualLottoList); + this.manualNumber = manulNumber; + this.manualLottoList = manualLottoList; + } + + private void validateDifference(int manulNumber, List manulLottoList) { + if(manulNumber != manulLottoList.size()) { + throw new IllegalArgumentException("수동 구매 갯수와 수동 입력 로또 수가 다르다."); + } + } + + public void validateLimit(int buyCount) { + if(buyCount < this.manualNumber) { + throw new IllegalArgumentException("수동구매 갯수가 구매가능갯수보다 많다."); + } + } +} diff --git a/src/test/java/lotto/domain/business/LottoBuyResultTest.java b/src/test/java/lotto/domain/business/LottoBuyResultTest.java new file mode 100644 index 0000000000..a22013fc73 --- /dev/null +++ b/src/test/java/lotto/domain/business/LottoBuyResultTest.java @@ -0,0 +1,30 @@ +package lotto.domain.business; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import lotto.domain.model.Lotto; +import lotto.domain.model.Manual; +import org.junit.jupiter.api.Test; + +class LottoBuyResultTest { + + @Test + void pay한만큼_로또_생성을_했다() { + + } + + @Test + void 수동생성에다가_자동생성을_합친것을_보여준다() { + + } + + @Test + void 수동구매_갯수가_구매가능갯수보다_많으면_에러전파() { + Manual manual = new Manual(2, List.of(new Lotto(), new Lotto())); + assertThatThrownBy(() -> + manual.validateLimit(1) + ).isInstanceOf(IllegalArgumentException.class) + .hasMessage("수동구매 갯수가 구매가능갯수보다 많다."); + } +} \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/ManualTest.java b/src/test/java/lotto/domain/model/ManualTest.java new file mode 100644 index 0000000000..2015068f2b --- /dev/null +++ b/src/test/java/lotto/domain/model/ManualTest.java @@ -0,0 +1,26 @@ +package lotto.domain.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import org.junit.jupiter.api.Test; + +class ManualTest { + + @Test + void 로또의_생성갯수는_수동갯수보다_같지않으면_에러전파() { + assertThatThrownBy(() -> + new Manual(3, List.of(new Lotto(), new Lotto())) + ).isInstanceOf(IllegalArgumentException.class) + .hasMessage("수동 구매 갯수와 수동 입력 로또 수가 다르다."); + } + + @Test + void 수동구매_갯수가_구매가능갯수보다_많으면_에러전파() { + Manual manual = new Manual(3, List.of(new Lotto(), new Lotto(), new Lotto())); + assertThatThrownBy(() -> + manual.validateLimit(1) + ).isInstanceOf(IllegalArgumentException.class) + .hasMessage("수동구매 갯수가 구매가능갯수보다 많다."); + } +} \ No newline at end of file From b0f7b638e55d5073413166fbb5044a705f6c9c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Sun, 30 Nov 2025 22:23:09 +0900 Subject: [PATCH 04/22] =?UTF-8?q?feat=20:=20=EC=88=98=EB=8F=99=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EC=B6=94=EA=B0=80=ED=95=9C=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 16 +++++----- .../lotto/controller/LottoApplication.java | 16 +++++++++- .../lotto/domain/business/LottoBuyResult.java | 28 ++++++++++++++--- .../java/lotto/domain/business/LottoGame.java | 4 +++ src/main/java/lotto/domain/model/Auto.java | 31 +++++++++++++++++++ src/main/java/lotto/domain/model/Manual.java | 4 +++ src/main/java/lotto/view/InputView.java | 10 ++++++ .../domain/business/LottoBuyResultTest.java | 7 +++-- .../java/lotto/domain/model/AutoTest.java | 16 ++++++++++ .../lotto/domain/model/LottoTicketsTest.java | 6 ---- 10 files changed, 116 insertions(+), 22 deletions(-) create mode 100644 src/main/java/lotto/domain/model/Auto.java create mode 100644 src/test/java/lotto/domain/model/AutoTest.java diff --git a/README.md b/README.md index 312f9b8cc8..abb6ef544f 100644 --- a/README.md +++ b/README.md @@ -174,17 +174,17 @@ - 자동 생성 숫자, 수동 생성 번호 추가 ## 기능목록 -- [ ] : 수동으로 구매 할 로또 수 입력 - - [ ] : 수동으로 구매하는 로또가 총 구매가능 수 보다 적은지 - - [ ] :로또 곧바로 자동 생성이 아닌 총 구매 가능 수 제시 +- [x] : 수동으로 구매 할 로또 수 입력 + - [x] : 수동으로 구매하는 로또가 총 구매가능 수 보다 적은지 + - [x] :로또 곧바로 자동 생성이 아닌 총 구매 가능 수 제시 - [ ] : 넘었을 경우 다시 입력 유도 -- [ ] : 수동으로 구매할 로또 번호 입력 - - [ ] : 수동 로또 수만큼 반복입력 +- [x] : 수동으로 구매할 로또 번호 입력 + - [x] : 수동 로또 수만큼 반복입력한다 - [ ] : 중복 입력, 1 ~ 45 범위 넘겨서 입력 시 다시 입력 유도 - 고민 : 입력 한번 할 때 마다 제시 or 모아서 넘기기 - - [ ] : 입력 할 때 마다 제시 + - [x] : 모아서 넘기기 - [ ] : 로또 발행 결과 수동, 자동 갯수 카운트 - - [ ] : 수동부터 먼저 제시 + - [x] : 수동부터 먼저 제시 ## 클래스 다이어그램 설계 ### 도메인 목록과 역할 @@ -201,5 +201,5 @@ - `WinningResult` : 당첨 당첨 통계 추리기 #### 추가 +- `BuyLotto` : 로또 구매(자동 + 수동) 에 대한 관리 - `manualLotto` : 수동구매하는 로또와 그 갯수 관리 - - 생명주기 : \ No newline at end of file diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 5a5358b5a0..2779ba3859 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -1,6 +1,12 @@ package lotto.controller; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import lotto.domain.business.LottoBuyResult; import lotto.domain.business.LottoGame; +import lotto.domain.model.LottoTickets; import lotto.domain.model.WinningResult; import lotto.view.InputView; import lotto.view.ResultView; @@ -9,8 +15,16 @@ public class LottoApplication { public static void main(String[] args) { int pay = InputView.inputPurchaseAmount(); + int manualNumber = InputView.inputManulNumber(); - LottoGame lottoGame = new LottoGame(pay); + List manualLottoNumbers = new ArrayList<>(); + for(int i = 0; i < manualNumber; i++) { + manualLottoNumbers.add(InputView.inputManulLotto()); + } + LottoTickets lottoTickets = new LottoBuyResult(pay, manualNumber, manualLottoNumbers).combineLotto(); + + + LottoGame lottoGame = new LottoGame(pay, lottoTickets); ResultView.printLottos(lottoGame.getLottos()); String winningNumbers = InputView.inputWinningNumbers(); diff --git a/src/main/java/lotto/domain/business/LottoBuyResult.java b/src/main/java/lotto/domain/business/LottoBuyResult.java index ee2c412589..d7cf5a48e2 100644 --- a/src/main/java/lotto/domain/business/LottoBuyResult.java +++ b/src/main/java/lotto/domain/business/LottoBuyResult.java @@ -1,23 +1,30 @@ package lotto.domain.business; +import java.util.ArrayList; import java.util.List; -import lotto.domain.model.Lotto; -import lotto.domain.model.Manual; -import lotto.domain.model.Pay; +import lotto.domain.model.*; public class LottoBuyResult { private final Pay pay; private final Manual manual; + private final Auto auto; public LottoBuyResult(int pay, int manualNumber, List lottoNumbers) { - this(new Pay(pay), new Manual(manualNumber, toLottoList(lottoNumbers))); + this(new Pay(pay), + new Manual(manualNumber, toLottoList(lottoNumbers)), + new Auto(getAutoNumber(pay, manualNumber))); } - public LottoBuyResult(Pay pay, Manual manual) { + private static int getAutoNumber(int pay, int manualNumber) { + return new Pay(pay).convertToBuyCount() - manualNumber; + } + + public LottoBuyResult(Pay pay, Manual manual, Auto auto) { validate(pay, manual); this.pay = pay; this.manual = manual; + this.auto = auto; } private static List toLottoList(List lottoNumbers) { @@ -26,6 +33,17 @@ private static List toLottoList(List lottoNumbers) { .toList(); } + public Pay getPay() { + return pay; + } + + public LottoTickets combineLotto() { + List lottoList = new ArrayList<>(); + lottoList.addAll(this.manual.getManualLottoList()); + lottoList.addAll(this.auto.getAutoLottoList()); + return new LottoTickets(lottoList); + } + private void validate(Pay pay, Manual manual) { manual.validateLimit(pay.convertToBuyCount()); } diff --git a/src/main/java/lotto/domain/business/LottoGame.java b/src/main/java/lotto/domain/business/LottoGame.java index 7331691ce7..8e3913968b 100644 --- a/src/main/java/lotto/domain/business/LottoGame.java +++ b/src/main/java/lotto/domain/business/LottoGame.java @@ -9,6 +9,10 @@ public LottoGame(int pay) { this(new Pay(pay), generateLottos(new Pay(pay))); } + public LottoGame(int pay, LottoTickets lottoTickets) { + this(new Pay(pay), lottoTickets); + } + private static LottoTickets generateLottos(Pay pay) { return new LottoTickets(pay.convertToBuyCount()); } diff --git a/src/main/java/lotto/domain/model/Auto.java b/src/main/java/lotto/domain/model/Auto.java new file mode 100644 index 0000000000..7a0beb22fa --- /dev/null +++ b/src/main/java/lotto/domain/model/Auto.java @@ -0,0 +1,31 @@ +package lotto.domain.model; + +import java.util.List; +import java.util.stream.IntStream; + +public class Auto { + + private final int autoNumber; + private final List autoLottoList; + + public Auto(int autoNumber) { + this(autoNumber, generateLottos(autoNumber)); + } + + public Auto(int autoNumber, List autoLottoList) { + this.autoNumber = autoNumber; + this.autoLottoList = autoLottoList; + } + + private static List generateLottos(int num) { + return IntStream + .range(0, num) + .mapToObj(i -> new Lotto()) + .toList(); + } + + public List getAutoLottoList() { + return autoLottoList; + } + +} diff --git a/src/main/java/lotto/domain/model/Manual.java b/src/main/java/lotto/domain/model/Manual.java index 4e7556df6f..bdcf21db20 100644 --- a/src/main/java/lotto/domain/model/Manual.java +++ b/src/main/java/lotto/domain/model/Manual.java @@ -17,6 +17,10 @@ public Manual(int manulNumber, List manualLottoList) { this.manualLottoList = manualLottoList; } + public List getManualLottoList() { + return manualLottoList; + } + private void validateDifference(int manulNumber, List manulLottoList) { if(manulNumber != manulLottoList.size()) { throw new IllegalArgumentException("수동 구매 갯수와 수동 입력 로또 수가 다르다."); diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 64b0c5c9ec..8b48d54d66 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -20,4 +20,14 @@ public static String inputWinningNumbers() { System.out.println("지난 주 당첨 번호를 입력해 주세요."); return scanner.nextLine(); } + + public static int inputManulNumber() { + System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); + return Integer.parseInt(scanner.nextLine()); + } + + public static String inputManulLotto() { + System.out.println("수동으로 구매할 번호를 입력해 주세요."); + return scanner.nextLine(); + } } diff --git a/src/test/java/lotto/domain/business/LottoBuyResultTest.java b/src/test/java/lotto/domain/business/LottoBuyResultTest.java index a22013fc73..a657539649 100644 --- a/src/test/java/lotto/domain/business/LottoBuyResultTest.java +++ b/src/test/java/lotto/domain/business/LottoBuyResultTest.java @@ -1,5 +1,6 @@ package lotto.domain.business; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.List; @@ -11,12 +12,14 @@ class LottoBuyResultTest { @Test void pay한만큼_로또_생성을_했다() { - + LottoBuyResult lottoBuyResult = new LottoBuyResult(5000, 1, List.of("1,2,3,4,5,6")); + assertThat(lottoBuyResult.getPay().convertToBuyCount()).isEqualTo(5); } @Test void 수동생성에다가_자동생성을_합친것을_보여준다() { - + LottoBuyResult lottoBuyResult = new LottoBuyResult(5000, 1, List.of("1,2,3,4,5,6")); + assertThat(lottoBuyResult.combineLotto().tickets()).hasSize(5); } @Test diff --git a/src/test/java/lotto/domain/model/AutoTest.java b/src/test/java/lotto/domain/model/AutoTest.java new file mode 100644 index 0000000000..921b886af3 --- /dev/null +++ b/src/test/java/lotto/domain/model/AutoTest.java @@ -0,0 +1,16 @@ +package lotto.domain.model; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +import org.junit.jupiter.api.Test; + +class AutoTest { + + @Test + void 갯수를_입력받으면_로또를_생성한다() { + Auto auto = new Auto(5); + assertThat(auto.getAutoLottoList()).hasSize(5); + } + +} \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/LottoTicketsTest.java b/src/test/java/lotto/domain/model/LottoTicketsTest.java index 17a3ef06fc..3fa636df0a 100644 --- a/src/test/java/lotto/domain/model/LottoTicketsTest.java +++ b/src/test/java/lotto/domain/model/LottoTicketsTest.java @@ -7,12 +7,6 @@ class LottoTicketsTest { - @Test - void 갯수를_입력받으면_로또를_생성한다() { - LottoTickets lottoTickets = new LottoTickets(10); - assertThat(lottoTickets.tickets()).hasSize(10); - } - @Test void 당첨번호를_입력받으면_당첨번호와_몇개_당첨인지_알린다() { LottoTickets lottoTickets = new LottoTickets(new Lotto(1, 2, 3, 4, 5, 6), new Lotto(40, 41, 42, 43, 44, 45)); From 2b0a81d328cd3b55406152ea26913b49ce2932be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Sun, 30 Nov 2025 22:52:09 +0900 Subject: [PATCH 05/22] =?UTF-8?q?feat=20:=201.=20=EC=88=98=EB=8F=99,=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=9E=85=EB=A0=A5=20=EA=B2=B0=EA=B3=BC=20?= =?UTF-8?q?=ED=91=9C=EC=8B=9C=EB=A5=BC=20=EC=9C=84=ED=95=B4=20BuyCount=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=20=EB=B6=84=EB=A6=AC=20=EC=99=84=EB=A3=8C=20?= =?UTF-8?q?2.=20=EA=B7=B8=20=EA=B2=B0=EA=B3=BC=20=EA=B4=80=EA=B3=84?= =?UTF-8?q?=EA=B0=80=20=EC=97=86=EA=B3=A0=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=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 --- .../lotto/controller/LottoApplication.java | 8 +++-- .../lotto/domain/business/LottoBuyResult.java | 33 ++++++++----------- src/main/java/lotto/domain/model/Auto.java | 6 ++-- .../java/lotto/domain/model/BuyCount.java | 21 ++++++++++++ src/main/java/lotto/domain/model/Manual.java | 21 +----------- src/main/java/lotto/view/InputView.java | 4 ++- src/main/java/lotto/view/ResultView.java | 7 ++-- .../domain/business/LottoBuyResultTest.java | 24 ++++++-------- .../java/lotto/domain/model/ManualTest.java | 17 ---------- 9 files changed, 61 insertions(+), 80 deletions(-) create mode 100644 src/main/java/lotto/domain/model/BuyCount.java diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 2779ba3859..0385ac6d63 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -6,6 +6,7 @@ import java.util.stream.IntStream; import lotto.domain.business.LottoBuyResult; import lotto.domain.business.LottoGame; +import lotto.domain.model.BuyCount; import lotto.domain.model.LottoTickets; import lotto.domain.model.WinningResult; import lotto.view.InputView; @@ -18,13 +19,14 @@ public static void main(String[] args) { int manualNumber = InputView.inputManulNumber(); List manualLottoNumbers = new ArrayList<>(); + InputView.inputManulMessage(); for(int i = 0; i < manualNumber; i++) { manualLottoNumbers.add(InputView.inputManulLotto()); } - LottoTickets lottoTickets = new LottoBuyResult(pay, manualNumber, manualLottoNumbers).combineLotto(); - - LottoGame lottoGame = new LottoGame(pay, lottoTickets); + LottoBuyResult lottoBuyResult = new LottoBuyResult(pay, manualLottoNumbers); + ResultView.printAutoManualCount(lottoBuyResult.combineBuyCount()); + LottoGame lottoGame = new LottoGame(pay, lottoBuyResult.combineLotto()); ResultView.printLottos(lottoGame.getLottos()); String winningNumbers = InputView.inputWinningNumbers(); diff --git a/src/main/java/lotto/domain/business/LottoBuyResult.java b/src/main/java/lotto/domain/business/LottoBuyResult.java index d7cf5a48e2..f3e4ee9fae 100644 --- a/src/main/java/lotto/domain/business/LottoBuyResult.java +++ b/src/main/java/lotto/domain/business/LottoBuyResult.java @@ -5,26 +5,25 @@ import lotto.domain.model.*; public class LottoBuyResult { - - private final Pay pay; + private final BuyCount buyCount; private final Manual manual; private final Auto auto; - public LottoBuyResult(int pay, int manualNumber, List lottoNumbers) { - this(new Pay(pay), - new Manual(manualNumber, toLottoList(lottoNumbers)), - new Auto(getAutoNumber(pay, manualNumber))); - } - - private static int getAutoNumber(int pay, int manualNumber) { - return new Pay(pay).convertToBuyCount() - manualNumber; + public LottoBuyResult(int pay, List manualLottoNumbers) { + this(new Manual(toLottoList(manualLottoNumbers)), + new Auto(getTotalNumber(pay) - manualLottoNumbers.size()), + new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), getTotalNumber(pay) - manualLottoNumbers.size()) + ); } - public LottoBuyResult(Pay pay, Manual manual, Auto auto) { - validate(pay, manual); - this.pay = pay; + public LottoBuyResult(Manual manual, Auto auto, BuyCount buyCount) { this.manual = manual; this.auto = auto; + this.buyCount = buyCount; + } + + private static int getTotalNumber(int pay) { + return new Pay(pay).convertToBuyCount(); } private static List toLottoList(List lottoNumbers) { @@ -33,10 +32,6 @@ private static List toLottoList(List lottoNumbers) { .toList(); } - public Pay getPay() { - return pay; - } - public LottoTickets combineLotto() { List lottoList = new ArrayList<>(); lottoList.addAll(this.manual.getManualLottoList()); @@ -44,7 +39,7 @@ public LottoTickets combineLotto() { return new LottoTickets(lottoList); } - private void validate(Pay pay, Manual manual) { - manual.validateLimit(pay.convertToBuyCount()); + public BuyCount combineBuyCount() { + return this.buyCount; } } diff --git a/src/main/java/lotto/domain/model/Auto.java b/src/main/java/lotto/domain/model/Auto.java index 7a0beb22fa..3c73173802 100644 --- a/src/main/java/lotto/domain/model/Auto.java +++ b/src/main/java/lotto/domain/model/Auto.java @@ -5,15 +5,13 @@ public class Auto { - private final int autoNumber; private final List autoLottoList; public Auto(int autoNumber) { - this(autoNumber, generateLottos(autoNumber)); + this(generateLottos(autoNumber)); } - public Auto(int autoNumber, List autoLottoList) { - this.autoNumber = autoNumber; + public Auto(List autoLottoList) { this.autoLottoList = autoLottoList; } diff --git a/src/main/java/lotto/domain/model/BuyCount.java b/src/main/java/lotto/domain/model/BuyCount.java new file mode 100644 index 0000000000..9fbd3673f8 --- /dev/null +++ b/src/main/java/lotto/domain/model/BuyCount.java @@ -0,0 +1,21 @@ +package lotto.domain.model; + +public class BuyCount { + private final int total; + private final int auto; + private final int manual; + + public BuyCount(int total, int manual, int auto) { + this.total = total; + this.manual = manual; + this.auto = auto; + } + + public int getAuto() { + return auto; + } + + public int getManual() { + return manual; + } +} diff --git a/src/main/java/lotto/domain/model/Manual.java b/src/main/java/lotto/domain/model/Manual.java index bdcf21db20..ad27adc4d0 100644 --- a/src/main/java/lotto/domain/model/Manual.java +++ b/src/main/java/lotto/domain/model/Manual.java @@ -4,32 +4,13 @@ public class Manual { - private final int manualNumber; private final List manualLottoList; - public Manual(String manulNumber, List manualLottoList) { - this(Integer.parseInt(manulNumber), manualLottoList); - } - - public Manual(int manulNumber, List manualLottoList) { - validateDifference(manulNumber, manualLottoList); - this.manualNumber = manulNumber; + public Manual(List manualLottoList) { this.manualLottoList = manualLottoList; } public List getManualLottoList() { return manualLottoList; } - - private void validateDifference(int manulNumber, List manulLottoList) { - if(manulNumber != manulLottoList.size()) { - throw new IllegalArgumentException("수동 구매 갯수와 수동 입력 로또 수가 다르다."); - } - } - - public void validateLimit(int buyCount) { - if(buyCount < this.manualNumber) { - throw new IllegalArgumentException("수동구매 갯수가 구매가능갯수보다 많다."); - } - } } diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 8b48d54d66..a49385a32c 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -26,8 +26,10 @@ public static int inputManulNumber() { return Integer.parseInt(scanner.nextLine()); } - public static String inputManulLotto() { + public static void inputManulMessage() { System.out.println("수동으로 구매할 번호를 입력해 주세요."); + } + public static String inputManulLotto() { return scanner.nextLine(); } } diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index 384414e1e0..768ddf337e 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -2,19 +2,22 @@ import java.util.List; import lotto.domain.Rank; +import lotto.domain.model.BuyCount; import lotto.domain.model.Lotto; import lotto.domain.model.WinningResult; public class ResultView { public static void printLottos(List lottoList) { - System.out.println(lottoList.size() + "개를 구매했습니다."); - for(Lotto lotto: lottoList) { System.out.println(lotto.numberValues()); } } + public static void printAutoManualCount(BuyCount buyCount) { + System.out.printf("수동으로 %d장, 자동으로 %d개를 구매했습니다.%n", buyCount.getManual(), buyCount.getAuto()); + } + public static void printResult(WinningResult winningResult, String totalReturnRate) { System.out.println("당첨 통계"); System.out.println("---------"); diff --git a/src/test/java/lotto/domain/business/LottoBuyResultTest.java b/src/test/java/lotto/domain/business/LottoBuyResultTest.java index a657539649..5c7a45c73c 100644 --- a/src/test/java/lotto/domain/business/LottoBuyResultTest.java +++ b/src/test/java/lotto/domain/business/LottoBuyResultTest.java @@ -4,30 +4,26 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.List; -import lotto.domain.model.Lotto; -import lotto.domain.model.Manual; import org.junit.jupiter.api.Test; class LottoBuyResultTest { @Test - void pay한만큼_로또_생성을_했다() { - LottoBuyResult lottoBuyResult = new LottoBuyResult(5000, 1, List.of("1,2,3,4,5,6")); - assertThat(lottoBuyResult.getPay().convertToBuyCount()).isEqualTo(5); + void 수동으로_생성한_만큼_보여준다() { + LottoBuyResult lottoBuyResult = new LottoBuyResult(5000, List.of("1,2,3,4,5,6")); + assertThat(lottoBuyResult.combineBuyCount().getManual()).isEqualTo(1); } @Test - void 수동생성에다가_자동생성을_합친것을_보여준다() { - LottoBuyResult lottoBuyResult = new LottoBuyResult(5000, 1, List.of("1,2,3,4,5,6")); - assertThat(lottoBuyResult.combineLotto().tickets()).hasSize(5); + void 자동으로_생성한_만큼_보여준다() { + LottoBuyResult lottoBuyResult = new LottoBuyResult(5000, List.of("1,2,3,4,5,6")); + assertThat(lottoBuyResult.combineBuyCount().getAuto()).isEqualTo(4); } @Test - void 수동구매_갯수가_구매가능갯수보다_많으면_에러전파() { - Manual manual = new Manual(2, List.of(new Lotto(), new Lotto())); - assertThatThrownBy(() -> - manual.validateLimit(1) - ).isInstanceOf(IllegalArgumentException.class) - .hasMessage("수동구매 갯수가 구매가능갯수보다 많다."); + void 수동생성에다가_자동생성을_합친것을_보여준다() { + LottoBuyResult lottoBuyResult = new LottoBuyResult(5000, List.of("1,2,3,4,5,6")); + assertThat(lottoBuyResult.combineLotto().tickets()).hasSize(5); } + } \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/ManualTest.java b/src/test/java/lotto/domain/model/ManualTest.java index 2015068f2b..731242e99d 100644 --- a/src/test/java/lotto/domain/model/ManualTest.java +++ b/src/test/java/lotto/domain/model/ManualTest.java @@ -2,25 +2,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; -import java.util.List; import org.junit.jupiter.api.Test; class ManualTest { - @Test - void 로또의_생성갯수는_수동갯수보다_같지않으면_에러전파() { - assertThatThrownBy(() -> - new Manual(3, List.of(new Lotto(), new Lotto())) - ).isInstanceOf(IllegalArgumentException.class) - .hasMessage("수동 구매 갯수와 수동 입력 로또 수가 다르다."); - } - - @Test - void 수동구매_갯수가_구매가능갯수보다_많으면_에러전파() { - Manual manual = new Manual(3, List.of(new Lotto(), new Lotto(), new Lotto())); - assertThatThrownBy(() -> - manual.validateLimit(1) - ).isInstanceOf(IllegalArgumentException.class) - .hasMessage("수동구매 갯수가 구매가능갯수보다 많다."); - } } \ No newline at end of file From 77b813bbc4d0a57d11066858887b983e30421993 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Mon, 1 Dec 2025 00:26:09 +0900 Subject: [PATCH 06/22] =?UTF-8?q?refactor=20:=20=EC=A0=95=EC=88=98?= =?UTF-8?q?=EB=8C=80=EC=8B=A0=20=EB=AC=B8=EC=9E=90=EC=97=B4=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EB=AF=B8=EC=9E=85=EB=A0=A5=20=EC=8B=9C=20=EC=9E=AC?= =?UTF-8?q?=20=EC=9E=85=EB=A0=A5=20=EB=A1=9C=EC=A7=81=20=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoApplication.java | 12 ++++----- .../lotto/domain/business/LottoBuyResult.java | 25 +++++++++++-------- .../java/lotto/domain/business/LottoGame.java | 8 ++++++ src/main/java/lotto/domain/model/Pay.java | 4 +++ .../lotto/domain/model/WinningResult.java | 4 +++ src/main/java/lotto/view/InputView.java | 12 ++++----- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 0385ac6d63..e47835876a 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -15,22 +15,22 @@ public class LottoApplication { public static void main(String[] args) { - int pay = InputView.inputPurchaseAmount(); - int manualNumber = InputView.inputManulNumber(); + String pay = InputView.inputPurchaseAmount(); + String manualNumber = InputView.inputManulNumber(); List manualLottoNumbers = new ArrayList<>(); - InputView.inputManulMessage(); - for(int i = 0; i < manualNumber; i++) { + if(manualNumber.isEmpty()) InputView.inputManulMessage(); + for(int i = 0; i < Integer.parseInt(manualNumber); i++) { manualLottoNumbers.add(InputView.inputManulLotto()); } - LottoBuyResult lottoBuyResult = new LottoBuyResult(pay, manualLottoNumbers); ResultView.printAutoManualCount(lottoBuyResult.combineBuyCount()); + LottoGame lottoGame = new LottoGame(pay, lottoBuyResult.combineLotto()); ResultView.printLottos(lottoGame.getLottos()); String winningNumbers = InputView.inputWinningNumbers(); - int bonusNumbers = InputView.inputBonusNumbers(); + String bonusNumbers = InputView.inputBonusNumbers(); WinningResult winningResult = lottoGame.calculateWinningResult(winningNumbers, bonusNumbers); String totalReturn = winningResult.calculateTotalReturn(pay); ResultView.printResult(winningResult, totalReturn); diff --git a/src/main/java/lotto/domain/business/LottoBuyResult.java b/src/main/java/lotto/domain/business/LottoBuyResult.java index f3e4ee9fae..935f4633c1 100644 --- a/src/main/java/lotto/domain/business/LottoBuyResult.java +++ b/src/main/java/lotto/domain/business/LottoBuyResult.java @@ -1,7 +1,7 @@ package lotto.domain.business; -import java.util.ArrayList; import java.util.List; +import java.util.stream.Stream; import lotto.domain.model.*; public class LottoBuyResult { @@ -9,17 +9,20 @@ public class LottoBuyResult { private final Manual manual; private final Auto auto; + public LottoBuyResult(String pay, List manualLottoNumbers) { + this(Integer.parseInt(pay), manualLottoNumbers); + } + public LottoBuyResult(int pay, List manualLottoNumbers) { - this(new Manual(toLottoList(manualLottoNumbers)), - new Auto(getTotalNumber(pay) - manualLottoNumbers.size()), - new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), getTotalNumber(pay) - manualLottoNumbers.size()) - ); + this(new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(),getTotalNumber(pay) - manualLottoNumbers.size()), + new Manual(toLottoList(manualLottoNumbers)), + new Auto(getTotalNumber(pay) - manualLottoNumbers.size())); } - public LottoBuyResult(Manual manual, Auto auto, BuyCount buyCount) { + public LottoBuyResult(BuyCount buyCount, Manual manual, Auto auto) { + this.buyCount = buyCount; this.manual = manual; this.auto = auto; - this.buyCount = buyCount; } private static int getTotalNumber(int pay) { @@ -33,10 +36,10 @@ private static List toLottoList(List lottoNumbers) { } public LottoTickets combineLotto() { - List lottoList = new ArrayList<>(); - lottoList.addAll(this.manual.getManualLottoList()); - lottoList.addAll(this.auto.getAutoLottoList()); - return new LottoTickets(lottoList); + return new LottoTickets(Stream.concat( + this.manual.getManualLottoList().stream(), + this.auto.getAutoLottoList().stream()) + .toList()); } public BuyCount combineBuyCount() { diff --git a/src/main/java/lotto/domain/business/LottoGame.java b/src/main/java/lotto/domain/business/LottoGame.java index 8e3913968b..5bb9a61637 100644 --- a/src/main/java/lotto/domain/business/LottoGame.java +++ b/src/main/java/lotto/domain/business/LottoGame.java @@ -5,6 +5,10 @@ public record LottoGame(Pay pay, LottoTickets lottoTickets) { + public LottoGame(String pay, LottoTickets lottoTickets) { + this(new Pay(pay), generateLottos(new Pay(pay))); + } + public LottoGame(int pay) { this(new Pay(pay), generateLottos(new Pay(pay))); } @@ -24,4 +28,8 @@ public List getLottos() { public WinningResult calculateWinningResult(String winnerLottoNumber, int bonus) { return this.lottoTickets.identifyWinners(new WinningLotto(bonus, winnerLottoNumber)); } + + public WinningResult calculateWinningResult(String winnerLottoNumber, String bonus) { + return calculateWinningResult(winnerLottoNumber, Integer.parseInt(bonus)); + } } diff --git a/src/main/java/lotto/domain/model/Pay.java b/src/main/java/lotto/domain/model/Pay.java index 4659a43027..db85a3040c 100644 --- a/src/main/java/lotto/domain/model/Pay.java +++ b/src/main/java/lotto/domain/model/Pay.java @@ -4,6 +4,10 @@ public record Pay(int pay) { public static final int LOTTO_PRICE = 1000; + public Pay(String pay) { + this(Integer.parseInt(pay)); + } + public Pay { validate(pay); positiveValidate(pay); diff --git a/src/main/java/lotto/domain/model/WinningResult.java b/src/main/java/lotto/domain/model/WinningResult.java index fe388623db..8432e0b980 100644 --- a/src/main/java/lotto/domain/model/WinningResult.java +++ b/src/main/java/lotto/domain/model/WinningResult.java @@ -28,6 +28,10 @@ public String calculateTotalReturn(int pay) { return rate.toPlainString(); } + public String calculateTotalReturn(String pay) { + return calculateTotalReturn(Integer.parseInt(pay)); + } + private BigDecimal getProfit() { BigDecimal profit = BigDecimal.ZERO; for(Entry matchIntegerEntry: winningRankCounts.entrySet()) { diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index a49385a32c..46de9fbfd0 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -6,14 +6,14 @@ public class InputView { private static final Scanner scanner = new Scanner(System.in); - public static int inputPurchaseAmount() { + public static String inputPurchaseAmount() { System.out.println("구입금액을 입력해 주세요."); - return Integer.parseInt(scanner.nextLine()); + return scanner.nextLine(); } - public static int inputBonusNumbers() { + public static String inputBonusNumbers() { System.out.println("보너스 볼을 입력해 주세요."); - return Integer.parseInt(scanner.nextLine()); + return scanner.nextLine(); } public static String inputWinningNumbers() { @@ -21,9 +21,9 @@ public static String inputWinningNumbers() { return scanner.nextLine(); } - public static int inputManulNumber() { + public static String inputManulNumber() { System.out.println("수동으로 구매할 로또 수를 입력해 주세요."); - return Integer.parseInt(scanner.nextLine()); + return scanner.nextLine(); } public static void inputManulMessage() { From a48749327d9f0261f9f4289309704530f3fcbca9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Mon, 1 Dec 2025 02:24:19 +0900 Subject: [PATCH 07/22] =?UTF-8?q?refactor=20:=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoApplication.java | 12 +++----- .../{LottoBuyResult.java => LottoBuy.java} | 8 ++--- .../domain/business/LottoBuyResultTest.java | 29 ------------------- .../lotto/domain/business/LottoBuyTest.java | 29 +++++++++++++++++++ 4 files changed, 37 insertions(+), 41 deletions(-) rename src/main/java/lotto/domain/business/{LottoBuyResult.java => LottoBuy.java} (83%) delete mode 100644 src/test/java/lotto/domain/business/LottoBuyResultTest.java create mode 100644 src/test/java/lotto/domain/business/LottoBuyTest.java diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index e47835876a..1d6cf94c9e 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -2,12 +2,8 @@ import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import lotto.domain.business.LottoBuyResult; +import lotto.domain.business.LottoBuy; import lotto.domain.business.LottoGame; -import lotto.domain.model.BuyCount; -import lotto.domain.model.LottoTickets; import lotto.domain.model.WinningResult; import lotto.view.InputView; import lotto.view.ResultView; @@ -23,10 +19,10 @@ public static void main(String[] args) { for(int i = 0; i < Integer.parseInt(manualNumber); i++) { manualLottoNumbers.add(InputView.inputManulLotto()); } - LottoBuyResult lottoBuyResult = new LottoBuyResult(pay, manualLottoNumbers); - ResultView.printAutoManualCount(lottoBuyResult.combineBuyCount()); + LottoBuy lottoBuy = new LottoBuy(pay, manualLottoNumbers); + ResultView.printAutoManualCount(lottoBuy.combineBuyCount()); - LottoGame lottoGame = new LottoGame(pay, lottoBuyResult.combineLotto()); + LottoGame lottoGame = new LottoGame(pay, lottoBuy.combineLotto()); ResultView.printLottos(lottoGame.getLottos()); String winningNumbers = InputView.inputWinningNumbers(); diff --git a/src/main/java/lotto/domain/business/LottoBuyResult.java b/src/main/java/lotto/domain/business/LottoBuy.java similarity index 83% rename from src/main/java/lotto/domain/business/LottoBuyResult.java rename to src/main/java/lotto/domain/business/LottoBuy.java index 935f4633c1..f540afcbc6 100644 --- a/src/main/java/lotto/domain/business/LottoBuyResult.java +++ b/src/main/java/lotto/domain/business/LottoBuy.java @@ -4,22 +4,22 @@ import java.util.stream.Stream; import lotto.domain.model.*; -public class LottoBuyResult { +public class LottoBuy { private final BuyCount buyCount; private final Manual manual; private final Auto auto; - public LottoBuyResult(String pay, List manualLottoNumbers) { + public LottoBuy(String pay, List manualLottoNumbers) { this(Integer.parseInt(pay), manualLottoNumbers); } - public LottoBuyResult(int pay, List manualLottoNumbers) { + public LottoBuy(int pay, List manualLottoNumbers) { this(new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(),getTotalNumber(pay) - manualLottoNumbers.size()), new Manual(toLottoList(manualLottoNumbers)), new Auto(getTotalNumber(pay) - manualLottoNumbers.size())); } - public LottoBuyResult(BuyCount buyCount, Manual manual, Auto auto) { + public LottoBuy(BuyCount buyCount, Manual manual, Auto auto) { this.buyCount = buyCount; this.manual = manual; this.auto = auto; diff --git a/src/test/java/lotto/domain/business/LottoBuyResultTest.java b/src/test/java/lotto/domain/business/LottoBuyResultTest.java deleted file mode 100644 index 5c7a45c73c..0000000000 --- a/src/test/java/lotto/domain/business/LottoBuyResultTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package lotto.domain.business; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import java.util.List; -import org.junit.jupiter.api.Test; - -class LottoBuyResultTest { - - @Test - void 수동으로_생성한_만큼_보여준다() { - LottoBuyResult lottoBuyResult = new LottoBuyResult(5000, List.of("1,2,3,4,5,6")); - assertThat(lottoBuyResult.combineBuyCount().getManual()).isEqualTo(1); - } - - @Test - void 자동으로_생성한_만큼_보여준다() { - LottoBuyResult lottoBuyResult = new LottoBuyResult(5000, List.of("1,2,3,4,5,6")); - assertThat(lottoBuyResult.combineBuyCount().getAuto()).isEqualTo(4); - } - - @Test - void 수동생성에다가_자동생성을_합친것을_보여준다() { - LottoBuyResult lottoBuyResult = new LottoBuyResult(5000, List.of("1,2,3,4,5,6")); - assertThat(lottoBuyResult.combineLotto().tickets()).hasSize(5); - } - -} \ No newline at end of file diff --git a/src/test/java/lotto/domain/business/LottoBuyTest.java b/src/test/java/lotto/domain/business/LottoBuyTest.java new file mode 100644 index 0000000000..cca8eeb12e --- /dev/null +++ b/src/test/java/lotto/domain/business/LottoBuyTest.java @@ -0,0 +1,29 @@ +package lotto.domain.business; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.List; +import org.junit.jupiter.api.Test; + +class LottoBuyTest { + + @Test + void 수동으로_생성한_만큼_보여준다() { + LottoBuy lottoBuy = new LottoBuy(5000, List.of("1,2,3,4,5,6")); + assertThat(lottoBuy.combineBuyCount().getManual()).isEqualTo(1); + } + + @Test + void 자동으로_생성한_만큼_보여준다() { + LottoBuy lottoBuy = new LottoBuy(5000, List.of("1,2,3,4,5,6")); + assertThat(lottoBuy.combineBuyCount().getAuto()).isEqualTo(4); + } + + @Test + void 수동생성에다가_자동생성을_합친것을_보여준다() { + LottoBuy lottoBuy = new LottoBuy(5000, List.of("1,2,3,4,5,6")); + assertThat(lottoBuy.combineLotto().tickets()).hasSize(5); + } + +} \ No newline at end of file From cc149cb21b92e0dc488f5724db6524b629ac7f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Mon, 1 Dec 2025 02:29:48 +0900 Subject: [PATCH 08/22] =?UTF-8?q?refactor=201.=20class=20=EB=A5=BC=20recor?= =?UTF-8?q?d=EB=A1=9C=20=EB=B3=80=ED=99=94=202.=20=EC=BB=A8=EB=B2=A4?= =?UTF-8?q?=EC=85=98=20=EB=B0=8F=20=EC=93=B0=EC=A7=80=EC=95=8A=EB=8A=94=20?= =?UTF-8?q?import=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoApplication.java | 4 +++- .../java/lotto/domain/business/LottoBuy.java | 17 ++++------------- src/main/java/lotto/domain/model/Auto.java | 12 +----------- .../java/lotto/domain/model/BuyCount.java | 19 +------------------ .../java/lotto/domain/model/LottoNumber.java | 2 +- .../lotto/domain/model/LottoNumberCache.java | 2 -- src/main/java/lotto/domain/model/Manual.java | 11 +---------- src/main/java/lotto/view/InputView.java | 1 + src/main/java/lotto/view/ResultView.java | 2 +- .../lotto/domain/business/LottoBuyTest.java | 5 ++--- .../java/lotto/domain/model/AutoTest.java | 3 +-- .../domain/model/LottoNumberCacheTest.java | 1 - .../java/lotto/domain/model/LottoTest.java | 1 - .../java/lotto/domain/model/ManualTest.java | 4 ---- 14 files changed, 16 insertions(+), 68 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 1d6cf94c9e..f1b93f7059 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -15,7 +15,9 @@ public static void main(String[] args) { String manualNumber = InputView.inputManulNumber(); List manualLottoNumbers = new ArrayList<>(); - if(manualNumber.isEmpty()) InputView.inputManulMessage(); + if(manualNumber.isEmpty()) { + InputView.inputManulMessage(); + } for(int i = 0; i < Integer.parseInt(manualNumber); i++) { manualLottoNumbers.add(InputView.inputManulLotto()); } diff --git a/src/main/java/lotto/domain/business/LottoBuy.java b/src/main/java/lotto/domain/business/LottoBuy.java index f540afcbc6..bf82ee8755 100644 --- a/src/main/java/lotto/domain/business/LottoBuy.java +++ b/src/main/java/lotto/domain/business/LottoBuy.java @@ -4,27 +4,18 @@ import java.util.stream.Stream; import lotto.domain.model.*; -public class LottoBuy { - private final BuyCount buyCount; - private final Manual manual; - private final Auto auto; +public record LottoBuy(BuyCount buyCount, Manual manual, Auto auto) { public LottoBuy(String pay, List manualLottoNumbers) { this(Integer.parseInt(pay), manualLottoNumbers); } public LottoBuy(int pay, List manualLottoNumbers) { - this(new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(),getTotalNumber(pay) - manualLottoNumbers.size()), + this(new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), getTotalNumber(pay) - manualLottoNumbers.size()), new Manual(toLottoList(manualLottoNumbers)), new Auto(getTotalNumber(pay) - manualLottoNumbers.size())); } - public LottoBuy(BuyCount buyCount, Manual manual, Auto auto) { - this.buyCount = buyCount; - this.manual = manual; - this.auto = auto; - } - private static int getTotalNumber(int pay) { return new Pay(pay).convertToBuyCount(); } @@ -37,8 +28,8 @@ private static List toLottoList(List lottoNumbers) { public LottoTickets combineLotto() { return new LottoTickets(Stream.concat( - this.manual.getManualLottoList().stream(), - this.auto.getAutoLottoList().stream()) + this.manual.manualLottoList().stream(), + this.auto.autoLottoList().stream()) .toList()); } diff --git a/src/main/java/lotto/domain/model/Auto.java b/src/main/java/lotto/domain/model/Auto.java index 3c73173802..eece6a47d2 100644 --- a/src/main/java/lotto/domain/model/Auto.java +++ b/src/main/java/lotto/domain/model/Auto.java @@ -3,18 +3,12 @@ import java.util.List; import java.util.stream.IntStream; -public class Auto { - - private final List autoLottoList; +public record Auto(List autoLottoList) { public Auto(int autoNumber) { this(generateLottos(autoNumber)); } - public Auto(List autoLottoList) { - this.autoLottoList = autoLottoList; - } - private static List generateLottos(int num) { return IntStream .range(0, num) @@ -22,8 +16,4 @@ private static List generateLottos(int num) { .toList(); } - public List getAutoLottoList() { - return autoLottoList; - } - } diff --git a/src/main/java/lotto/domain/model/BuyCount.java b/src/main/java/lotto/domain/model/BuyCount.java index 9fbd3673f8..de5730622a 100644 --- a/src/main/java/lotto/domain/model/BuyCount.java +++ b/src/main/java/lotto/domain/model/BuyCount.java @@ -1,21 +1,4 @@ package lotto.domain.model; -public class BuyCount { - private final int total; - private final int auto; - private final int manual; - - public BuyCount(int total, int manual, int auto) { - this.total = total; - this.manual = manual; - this.auto = auto; - } - - public int getAuto() { - return auto; - } - - public int getManual() { - return manual; - } +public record BuyCount(int total, int manual, int auto) { } diff --git a/src/main/java/lotto/domain/model/LottoNumber.java b/src/main/java/lotto/domain/model/LottoNumber.java index 4ae072fe75..c796a982ee 100644 --- a/src/main/java/lotto/domain/model/LottoNumber.java +++ b/src/main/java/lotto/domain/model/LottoNumber.java @@ -2,7 +2,7 @@ import java.util.Objects; -public class LottoNumber{ +public class LottoNumber { private final int value; diff --git a/src/main/java/lotto/domain/model/LottoNumberCache.java b/src/main/java/lotto/domain/model/LottoNumberCache.java index c20fba082c..176e3d8a82 100644 --- a/src/main/java/lotto/domain/model/LottoNumberCache.java +++ b/src/main/java/lotto/domain/model/LottoNumberCache.java @@ -1,7 +1,5 @@ package lotto.domain.model; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; diff --git a/src/main/java/lotto/domain/model/Manual.java b/src/main/java/lotto/domain/model/Manual.java index ad27adc4d0..c8d32ac8f0 100644 --- a/src/main/java/lotto/domain/model/Manual.java +++ b/src/main/java/lotto/domain/model/Manual.java @@ -2,15 +2,6 @@ import java.util.List; -public class Manual { +public record Manual(List manualLottoList) { - private final List manualLottoList; - - public Manual(List manualLottoList) { - this.manualLottoList = manualLottoList; - } - - public List getManualLottoList() { - return manualLottoList; - } } diff --git a/src/main/java/lotto/view/InputView.java b/src/main/java/lotto/view/InputView.java index 46de9fbfd0..75a439b7cb 100644 --- a/src/main/java/lotto/view/InputView.java +++ b/src/main/java/lotto/view/InputView.java @@ -29,6 +29,7 @@ public static String inputManulNumber() { public static void inputManulMessage() { System.out.println("수동으로 구매할 번호를 입력해 주세요."); } + public static String inputManulLotto() { return scanner.nextLine(); } diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index 768ddf337e..319a4fc8bf 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -15,7 +15,7 @@ public static void printLottos(List lottoList) { } public static void printAutoManualCount(BuyCount buyCount) { - System.out.printf("수동으로 %d장, 자동으로 %d개를 구매했습니다.%n", buyCount.getManual(), buyCount.getAuto()); + System.out.printf("수동으로 %d장, 자동으로 %d개를 구매했습니다.%n", buyCount.manual(), buyCount.auto()); } public static void printResult(WinningResult winningResult, String totalReturnRate) { diff --git a/src/test/java/lotto/domain/business/LottoBuyTest.java b/src/test/java/lotto/domain/business/LottoBuyTest.java index cca8eeb12e..07b57af39c 100644 --- a/src/test/java/lotto/domain/business/LottoBuyTest.java +++ b/src/test/java/lotto/domain/business/LottoBuyTest.java @@ -1,7 +1,6 @@ package lotto.domain.business; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.List; import org.junit.jupiter.api.Test; @@ -11,13 +10,13 @@ class LottoBuyTest { @Test void 수동으로_생성한_만큼_보여준다() { LottoBuy lottoBuy = new LottoBuy(5000, List.of("1,2,3,4,5,6")); - assertThat(lottoBuy.combineBuyCount().getManual()).isEqualTo(1); + assertThat(lottoBuy.combineBuyCount().manual()).isEqualTo(1); } @Test void 자동으로_생성한_만큼_보여준다() { LottoBuy lottoBuy = new LottoBuy(5000, List.of("1,2,3,4,5,6")); - assertThat(lottoBuy.combineBuyCount().getAuto()).isEqualTo(4); + assertThat(lottoBuy.combineBuyCount().auto()).isEqualTo(4); } @Test diff --git a/src/test/java/lotto/domain/model/AutoTest.java b/src/test/java/lotto/domain/model/AutoTest.java index 921b886af3..72057abe62 100644 --- a/src/test/java/lotto/domain/model/AutoTest.java +++ b/src/test/java/lotto/domain/model/AutoTest.java @@ -1,7 +1,6 @@ package lotto.domain.model; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; @@ -10,7 +9,7 @@ class AutoTest { @Test void 갯수를_입력받으면_로또를_생성한다() { Auto auto = new Auto(5); - assertThat(auto.getAutoLottoList()).hasSize(5); + assertThat(auto.autoLottoList()).hasSize(5); } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/LottoNumberCacheTest.java b/src/test/java/lotto/domain/model/LottoNumberCacheTest.java index 7be99fa28f..c0287ef323 100644 --- a/src/test/java/lotto/domain/model/LottoNumberCacheTest.java +++ b/src/test/java/lotto/domain/model/LottoNumberCacheTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/src/test/java/lotto/domain/model/LottoTest.java b/src/test/java/lotto/domain/model/LottoTest.java index eb557583ce..5dd778747d 100644 --- a/src/test/java/lotto/domain/model/LottoTest.java +++ b/src/test/java/lotto/domain/model/LottoTest.java @@ -1,6 +1,5 @@ package lotto.domain.model; -import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/domain/model/ManualTest.java b/src/test/java/lotto/domain/model/ManualTest.java index 731242e99d..f7d0b4b8af 100644 --- a/src/test/java/lotto/domain/model/ManualTest.java +++ b/src/test/java/lotto/domain/model/ManualTest.java @@ -1,9 +1,5 @@ package lotto.domain.model; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import org.junit.jupiter.api.Test; - class ManualTest { } \ No newline at end of file From 8c8a98f5d3c15b56956b8ebcff340302f2836fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Mon, 1 Dec 2025 02:55:47 +0900 Subject: [PATCH 09/22] =?UTF-8?q?fix=20:=20=EC=88=98=EB=8F=99=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=20=EB=AF=B8=EB=B0=98=EC=98=81=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/business/LottoGame.java | 8 ++++++-- src/test/java/lotto/domain/business/LottoBuyTest.java | 9 ++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/lotto/domain/business/LottoGame.java b/src/main/java/lotto/domain/business/LottoGame.java index 5bb9a61637..052fe33b9d 100644 --- a/src/main/java/lotto/domain/business/LottoGame.java +++ b/src/main/java/lotto/domain/business/LottoGame.java @@ -6,17 +6,21 @@ public record LottoGame(Pay pay, LottoTickets lottoTickets) { public LottoGame(String pay, LottoTickets lottoTickets) { - this(new Pay(pay), generateLottos(new Pay(pay))); + this(new Pay(pay), lottoTickets); } public LottoGame(int pay) { - this(new Pay(pay), generateLottos(new Pay(pay))); + this(new Pay(pay)); } public LottoGame(int pay, LottoTickets lottoTickets) { this(new Pay(pay), lottoTickets); } + private LottoGame(Pay pay) { + this(pay, generateLottos(pay)); + } + private static LottoTickets generateLottos(Pay pay) { return new LottoTickets(pay.convertToBuyCount()); } diff --git a/src/test/java/lotto/domain/business/LottoBuyTest.java b/src/test/java/lotto/domain/business/LottoBuyTest.java index 07b57af39c..32465b7ca2 100644 --- a/src/test/java/lotto/domain/business/LottoBuyTest.java +++ b/src/test/java/lotto/domain/business/LottoBuyTest.java @@ -3,6 +3,7 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.List; +import lotto.domain.model.Lotto; import org.junit.jupiter.api.Test; class LottoBuyTest { @@ -20,9 +21,15 @@ class LottoBuyTest { } @Test - void 수동생성에다가_자동생성을_합친것을_보여준다() { + void 수동생성에다가_자동생성을_합친_수는_같다() { LottoBuy lottoBuy = new LottoBuy(5000, List.of("1,2,3,4,5,6")); assertThat(lottoBuy.combineLotto().tickets()).hasSize(5); } + @Test + void 수동생성에다가_자동생성을_합친것_중_수동입력은_같다() { + LottoBuy lottoBuy = new LottoBuy(5000, List.of("1,2,3,4,5,6")); + assertThat(lottoBuy.combineLotto().tickets().getFirst()).isEqualTo(new Lotto(1, 2, 3, 4, 5, 6)); + } + } \ No newline at end of file From 70ac1f627b5903dccf16b39edf30c96d134ed287 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Mon, 1 Dec 2025 03:04:23 +0900 Subject: [PATCH 10/22] =?UTF-8?q?feat=20:=20=EC=9E=98=EB=AA=BB=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EC=8B=9C=20=EC=9E=AC=20=EC=9E=85=EB=A0=A5=20=EC=9C=A0?= =?UTF-8?q?=EB=8F=84=ED=95=98=EA=B2=8C=20=EA=B8=B0=EB=8A=A5=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 --- README.md | 4 +- .../lotto/controller/LottoApplication.java | 47 ++++++++++++++----- src/main/java/lotto/view/ResultView.java | 4 ++ 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index abb6ef544f..353f7e58fa 100644 --- a/README.md +++ b/README.md @@ -177,13 +177,13 @@ - [x] : 수동으로 구매 할 로또 수 입력 - [x] : 수동으로 구매하는 로또가 총 구매가능 수 보다 적은지 - [x] :로또 곧바로 자동 생성이 아닌 총 구매 가능 수 제시 - - [ ] : 넘었을 경우 다시 입력 유도 + - [x] : 넘었을 경우 다시 입력 유도 - [x] : 수동으로 구매할 로또 번호 입력 - [x] : 수동 로또 수만큼 반복입력한다 - [ ] : 중복 입력, 1 ~ 45 범위 넘겨서 입력 시 다시 입력 유도 - 고민 : 입력 한번 할 때 마다 제시 or 모아서 넘기기 - [x] : 모아서 넘기기 -- [ ] : 로또 발행 결과 수동, 자동 갯수 카운트 +- [x] : 로또 발행 결과 수동, 자동 갯수 카운트 - [x] : 수동부터 먼저 제시 ## 클래스 다이어그램 설계 diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index f1b93f7059..434b6154f3 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -2,6 +2,8 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; +import java.util.stream.IntStream; import lotto.domain.business.LottoBuy; import lotto.domain.business.LottoGame; import lotto.domain.model.WinningResult; @@ -9,28 +11,49 @@ import lotto.view.ResultView; public class LottoApplication { - + public static void main(String[] args) { - String pay = InputView.inputPurchaseAmount(); - String manualNumber = InputView.inputManulNumber(); - - List manualLottoNumbers = new ArrayList<>(); - if(manualNumber.isEmpty()) { - InputView.inputManulMessage(); - } - for(int i = 0; i < Integer.parseInt(manualNumber); i++) { - manualLottoNumbers.add(InputView.inputManulLotto()); + new LottoApplication().run(); + } + + private void run() { + while(true) { + try { + play(); + return; + } catch(IllegalArgumentException e) { + ResultView.printError(e.getMessage()); + } } + } + + private void play() { + String pay = InputView.inputPurchaseAmount(); + String manualCount = InputView.inputManulNumber(); + + List manualLottoNumbers = readManualLottos(manualCount); LottoBuy lottoBuy = new LottoBuy(pay, manualLottoNumbers); ResultView.printAutoManualCount(lottoBuy.combineBuyCount()); - + LottoGame lottoGame = new LottoGame(pay, lottoBuy.combineLotto()); ResultView.printLottos(lottoGame.getLottos()); - + String winningNumbers = InputView.inputWinningNumbers(); String bonusNumbers = InputView.inputBonusNumbers(); WinningResult winningResult = lottoGame.calculateWinningResult(winningNumbers, bonusNumbers); String totalReturn = winningResult.calculateTotalReturn(pay); ResultView.printResult(winningResult, totalReturn); } + + private List readManualLottos(String count) { + if(count.isEmpty()) { + throw new IllegalArgumentException("수동 구매 수는 0 이상의 숫자로 입력해 주세요."); + } + int manualCount = Integer.parseInt(count); + if(manualCount > 0) InputView.inputManulMessage(); + + return IntStream.range(0, manualCount) + .mapToObj(i -> InputView.inputManulLotto()) + .toList(); + } } diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index 319a4fc8bf..18dca49662 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -32,4 +32,8 @@ public static void printResult(WinningResult winningResult, String totalReturnRa System.out.printf("총 수익률은 %s입니다.%n", totalReturnRate); } } + + public static void printError(String message) { + System.out.println(message); + } } From a4bb7094cb82c22002c651cfa2fa2540eb6e1436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Mon, 1 Dec 2025 03:10:14 +0900 Subject: [PATCH 11/22] =?UTF-8?q?refactor=20:=20main=20=EB=B6=80=EB=B6=84?= =?UTF-8?q?=20=EB=A9=94=EC=84=9C=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 --- .../lotto/controller/LottoApplication.java | 24 ++++++++----------- src/main/java/lotto/view/ResultView.java | 2 +- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 434b6154f3..7a645ab2b0 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -1,8 +1,6 @@ package lotto.controller; -import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.stream.IntStream; import lotto.domain.business.LottoBuy; import lotto.domain.business.LottoGame; @@ -11,11 +9,11 @@ import lotto.view.ResultView; public class LottoApplication { - + public static void main(String[] args) { new LottoApplication().run(); } - + private void run() { while(true) { try { @@ -26,32 +24,30 @@ private void run() { } } } - + private void play() { String pay = InputView.inputPurchaseAmount(); String manualCount = InputView.inputManulNumber(); - List manualLottoNumbers = readManualLottos(manualCount); LottoBuy lottoBuy = new LottoBuy(pay, manualLottoNumbers); + ResultView.printAutoManualCount(lottoBuy.combineBuyCount()); - LottoGame lottoGame = new LottoGame(pay, lottoBuy.combineLotto()); ResultView.printLottos(lottoGame.getLottos()); - - String winningNumbers = InputView.inputWinningNumbers(); - String bonusNumbers = InputView.inputBonusNumbers(); - WinningResult winningResult = lottoGame.calculateWinningResult(winningNumbers, bonusNumbers); + + WinningResult winningResult = lottoGame.calculateWinningResult(InputView.inputWinningNumbers(), InputView.inputBonusNumbers()); String totalReturn = winningResult.calculateTotalReturn(pay); ResultView.printResult(winningResult, totalReturn); } - + private List readManualLottos(String count) { if(count.isEmpty()) { throw new IllegalArgumentException("수동 구매 수는 0 이상의 숫자로 입력해 주세요."); } int manualCount = Integer.parseInt(count); - if(manualCount > 0) InputView.inputManulMessage(); - + if(manualCount > 0) { + InputView.inputManulMessage(); + } return IntStream.range(0, manualCount) .mapToObj(i -> InputView.inputManulLotto()) .toList(); diff --git a/src/main/java/lotto/view/ResultView.java b/src/main/java/lotto/view/ResultView.java index 18dca49662..e07ac1a522 100644 --- a/src/main/java/lotto/view/ResultView.java +++ b/src/main/java/lotto/view/ResultView.java @@ -32,7 +32,7 @@ public static void printResult(WinningResult winningResult, String totalReturnRa System.out.printf("총 수익률은 %s입니다.%n", totalReturnRate); } } - + public static void printError(String message) { System.out.println(message); } From 0419968a57a4cf6cf62c976094cfeb1eae308b61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Mon, 1 Dec 2025 21:56:52 +0900 Subject: [PATCH 12/22] =?UTF-8?q?refactor=20:=20LottoNumber=20=EC=99=80=20?= =?UTF-8?q?LottoCache=20=EB=A5=BC=20=ED=86=B5=ED=95=A9=ED=95=98=EC=97=AC?= =?UTF-8?q?=20LottoNumber=20=EC=97=90=EC=84=9C=20of=EB=A1=9C=20=EC=83=88?= =?UTF-8?q?=EB=A1=9C=EC=9A=B4=20=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=ED=95=98=EB=8A=94=20=EA=B2=83=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=B4=EC=84=9C=20=EB=B3=B4=EC=9E=A5=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 ++- src/main/java/lotto/domain/model/Lotto.java | 6 +- .../java/lotto/domain/model/LottoNumber.java | 56 +++++++++---------- .../lotto/domain/model/LottoNumberCache.java | 43 -------------- .../java/lotto/domain/model/WinningLotto.java | 8 +-- .../domain/model/LottoNumberCacheTest.java | 26 --------- .../lotto/domain/model/LottoTicketsTest.java | 2 +- .../lotto/domain/model/WinningLottoTest.java | 6 +- 8 files changed, 46 insertions(+), 110 deletions(-) delete mode 100644 src/main/java/lotto/domain/model/LottoNumberCache.java delete mode 100644 src/test/java/lotto/domain/model/LottoNumberCacheTest.java diff --git a/README.md b/README.md index 353f7e58fa..8e24b6ac41 100644 --- a/README.md +++ b/README.md @@ -180,7 +180,7 @@ - [x] : 넘었을 경우 다시 입력 유도 - [x] : 수동으로 구매할 로또 번호 입력 - [x] : 수동 로또 수만큼 반복입력한다 - - [ ] : 중복 입력, 1 ~ 45 범위 넘겨서 입력 시 다시 입력 유도 + - [x] : 중복 입력, 1 ~ 45 범위 넘겨서 입력 시 다시 입력 유도 - 고민 : 입력 한번 할 때 마다 제시 or 모아서 넘기기 - [x] : 모아서 넘기기 - [x] : 로또 발행 결과 수동, 자동 갯수 카운트 @@ -203,3 +203,10 @@ #### 추가 - `BuyLotto` : 로또 구매(자동 + 수동) 에 대한 관리 - `manualLotto` : 수동구매하는 로또와 그 갯수 관리 + +## 1차 피드백 후 리팩터링 + +- [ ] : 로또를 생성하는 부분 인터페이스로 분리해 보는 연습 +- [x] : of 메서드를 활용하면 LottoNumber 객체가 재사용되는 것을 보장하지 못함 + - `LottoNumber` 객체가 캐싱을 통해 재사용하는 것을 강제할 수 있도록 리팩터링 + - `LottoNumber`와 `LottoNumberCache`를 통합 \ No newline at end of file diff --git a/src/main/java/lotto/domain/model/Lotto.java b/src/main/java/lotto/domain/model/Lotto.java index 9c6d9a7358..ff0673a326 100644 --- a/src/main/java/lotto/domain/model/Lotto.java +++ b/src/main/java/lotto/domain/model/Lotto.java @@ -49,7 +49,7 @@ private static List getIntegers(int[] ints) { private static List generateLottoNumberByInput(String lottoNumbers) { return Arrays.stream(extractWinnerLottoNumber(lottoNumbers)) - .map(LottoNumberCache::getLottoNumber) + .map(LottoNumber::of) .toList(); } @@ -77,13 +77,13 @@ private static List generateNumberList() { private static List convertToLottoNumbers(List lottoNumbers) { return lottoNumbers.stream() - .map(LottoNumberCache::getLottoNumber) + .map(LottoNumber::of) .toList(); } public List numberValues() { return this.numbers.stream() - .map(LottoNumber::getValue) + .map(LottoNumber::value) .toList(); } diff --git a/src/main/java/lotto/domain/model/LottoNumber.java b/src/main/java/lotto/domain/model/LottoNumber.java index c796a982ee..574c00e3de 100644 --- a/src/main/java/lotto/domain/model/LottoNumber.java +++ b/src/main/java/lotto/domain/model/LottoNumber.java @@ -1,49 +1,47 @@ package lotto.domain.model; -import java.util.Objects; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.IntStream; -public class LottoNumber { +public record LottoNumber(int value) { - private final int value; + private final static Map cache; + public static final int MIN_LOTTO_NUMBER = 1; + public static final int MAX_LOTTO_NUMBER = 45; - private LottoNumber(String value) { - this(Integer.parseInt(value)); + static { + cache = getLottoNumberMap(); } - private LottoNumber(int value) { - validate(value); - this.value = value; + private static Map getLottoNumberMap() { + return IntStream.rangeClosed(MIN_LOTTO_NUMBER, MAX_LOTTO_NUMBER) + .boxed() + .collect( + Collectors.toMap( + Function.identity(), + LottoNumber::new) + ); + } + + private LottoNumber(String value) { + this(Integer.parseInt(value)); } public static LottoNumber of(int value) { - return new LottoNumber(value); + LottoNumber cachedLottoNumber = cache.get(value); + validate(cachedLottoNumber); + return cachedLottoNumber; } public static LottoNumber of(String value) { return of(Integer.parseInt(value)); } - public int getValue() { - return value; - } - - private void validate(int value) { - if(value < 1 || value > 45) { + private static void validate(LottoNumber result) { + if(result == null) { throw new IllegalArgumentException("로또 번호는 1~45사이 입력하시오"); } } - - @Override - public boolean equals(Object o) { - if(o == null || getClass() != o.getClass()) { - return false; - } - LottoNumber that = (LottoNumber) o; - return value == that.value; - } - - @Override - public int hashCode() { - return Objects.hashCode(value); - } } diff --git a/src/main/java/lotto/domain/model/LottoNumberCache.java b/src/main/java/lotto/domain/model/LottoNumberCache.java deleted file mode 100644 index 176e3d8a82..0000000000 --- a/src/main/java/lotto/domain/model/LottoNumberCache.java +++ /dev/null @@ -1,43 +0,0 @@ -package lotto.domain.model; - -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class LottoNumberCache { - - private final static Map cache; - public static final int MIN_LOTTO_NUMBER = 1; - public static final int MAX_LOTTO_NUMBER = 45; - - static { - cache = getLottoNumberMap(); - } - - private static Map getLottoNumberMap() { - return IntStream.rangeClosed(MIN_LOTTO_NUMBER, MAX_LOTTO_NUMBER) - .boxed() - .collect( - Collectors.toMap( - Function.identity(), - LottoNumber::of) - ); - } - - public static LottoNumber getLottoNumber(String lottoNumber) { - return getLottoNumber(Integer.parseInt(lottoNumber)); - } - - public static LottoNumber getLottoNumber(int lottoNumber) { - LottoNumber cachedLottoNumber = cache.get(lottoNumber); - validate(cachedLottoNumber); - return cachedLottoNumber; - } - - private static void validate(LottoNumber result) { - if(result == null) { - throw new IllegalArgumentException("로또 번호는 1~45사이 입력하시오"); - } - } -} diff --git a/src/main/java/lotto/domain/model/WinningLotto.java b/src/main/java/lotto/domain/model/WinningLotto.java index e5eab05466..1df494dd5a 100644 --- a/src/main/java/lotto/domain/model/WinningLotto.java +++ b/src/main/java/lotto/domain/model/WinningLotto.java @@ -5,19 +5,19 @@ public record WinningLotto(LottoNumber bonusNumber, Lotto winNumbers) { public WinningLotto(int bonusNumber, int... winNumbers) { - this(LottoNumberCache.getLottoNumber(bonusNumber), new Lotto(winNumbers)); + this(LottoNumber.of(bonusNumber), new Lotto(winNumbers)); } public WinningLotto(String bonusNumber, int... winNumbers) { - this(LottoNumberCache.getLottoNumber(bonusNumber), new Lotto(winNumbers)); + this(LottoNumber.of(bonusNumber), new Lotto(winNumbers)); } public WinningLotto(String bonusNumber, String winNumbers) { - this(LottoNumberCache.getLottoNumber(bonusNumber), new Lotto(winNumbers)); + this(LottoNumber.of(bonusNumber), new Lotto(winNumbers)); } public WinningLotto(int bonusNumber, String winNumbers) { - this(LottoNumberCache.getLottoNumber(bonusNumber), new Lotto(winNumbers)); + this(LottoNumber.of(bonusNumber), new Lotto(winNumbers)); } public WinningLotto { diff --git a/src/test/java/lotto/domain/model/LottoNumberCacheTest.java b/src/test/java/lotto/domain/model/LottoNumberCacheTest.java deleted file mode 100644 index c0287ef323..0000000000 --- a/src/test/java/lotto/domain/model/LottoNumberCacheTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package lotto.domain.model; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; - -class LottoNumberCacheTest { - - @Test - void lottoNumber를_입력하면_필요한_LottoNumber객체를_반환한다() { - assertThat(LottoNumberCache.getLottoNumber(5)) - .isEqualTo(LottoNumber.of(5)); - } - - @ParameterizedTest - @ValueSource(ints = {0, 46}) - void 로또번호가_범위_밖이면_에러(int num) { - assertThatThrownBy(() -> - LottoNumberCache.getLottoNumber(num) - ).isInstanceOf(IllegalArgumentException.class) - .hasMessage("로또 번호는 1~45사이 입력하시오"); - } -} \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/LottoTicketsTest.java b/src/test/java/lotto/domain/model/LottoTicketsTest.java index 3fa636df0a..de03301f43 100644 --- a/src/test/java/lotto/domain/model/LottoTicketsTest.java +++ b/src/test/java/lotto/domain/model/LottoTicketsTest.java @@ -22,7 +22,7 @@ class LottoTicketsTest { void 당첨2등과_3등이면_무엇인지_알려준다() { LottoTickets lottoTickets = new LottoTickets(new Lotto(10, 41, 42, 43, 44, 45), new Lotto(20, 41, 42, 43, 44, 45)); - WinningResult winningResult = lottoTickets.identifyWinners(new WinningLotto(LottoNumberCache.getLottoNumber(20), new Lotto(35, 41, 42, 43, 44, 45))); + WinningResult winningResult = lottoTickets.identifyWinners(new WinningLotto(LottoNumber.of(20), new Lotto(35, 41, 42, 43, 44, 45))); WinningResult expectedWinner = new WinningResult(); expectedWinner.recordRank(Rank.SECOND); expectedWinner.recordRank(Rank.THIRD); diff --git a/src/test/java/lotto/domain/model/WinningLottoTest.java b/src/test/java/lotto/domain/model/WinningLottoTest.java index f7a6518a9e..f752b2c430 100644 --- a/src/test/java/lotto/domain/model/WinningLottoTest.java +++ b/src/test/java/lotto/domain/model/WinningLottoTest.java @@ -11,21 +11,21 @@ class WinningLottoTest { @Test void 당첨번호와_보너스번호는_같으면_에러전파() { assertThatThrownBy(() -> - new WinningLotto(LottoNumberCache.getLottoNumber(1), new Lotto(1, 2, 3, 4, 5, 6)) + new WinningLotto(LottoNumber.of(1), new Lotto(1, 2, 3, 4, 5, 6)) ).isInstanceOf(IllegalArgumentException.class) .hasMessage("당첨번호 일부가 보너스 번호가 같습니다"); } @Test public void 로또번호4개_일치하면_FOURTH가_반환된다() { - WinningLotto winningLotto = new WinningLotto(LottoNumberCache.getLottoNumber(20), new Lotto(42, 36, 37, 43, 44, 45)); + WinningLotto winningLotto = new WinningLotto(LottoNumber.of(20), new Lotto(42, 36, 37, 43, 44, 45)); Rank rank = winningLotto.rankDecide(new Lotto(40, 41, 42, 43, 44, 45)); assertThat(rank).isEqualTo(Rank.FOURTH); } @Test public void 로또번호6개_일치하면_FIRST가_반환된다() { - WinningLotto winningLotto = new WinningLotto(LottoNumberCache.getLottoNumber(20), new Lotto(42, 41, 40, 43, 44, 45)); + WinningLotto winningLotto = new WinningLotto(LottoNumber.of(20), new Lotto(42, 41, 40, 43, 44, 45)); Rank rank = winningLotto.rankDecide(new Lotto(40, 41, 42, 43, 44, 45)); assertThat(rank).isEqualTo(Rank.FIRST); } From 76893fe5c17597b501247147aacbfec5fd2ec9af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Tue, 2 Dec 2025 00:02:10 +0900 Subject: [PATCH 13/22] =?UTF-8?q?fix=20:=20LottoNumber=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9E=90=20=EC=A0=91=EA=B7=BC=EC=9D=84=20=EC=B0=A8?= =?UTF-8?q?=EB=8B=A8=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20record=20?= =?UTF-8?q?=EC=97=90=EC=84=9C=20class=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/domain/model/Lotto.java | 2 +- .../java/lotto/domain/model/LottoNumber.java | 26 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/lotto/domain/model/Lotto.java b/src/main/java/lotto/domain/model/Lotto.java index ff0673a326..aa71808333 100644 --- a/src/main/java/lotto/domain/model/Lotto.java +++ b/src/main/java/lotto/domain/model/Lotto.java @@ -83,7 +83,7 @@ private static List convertToLottoNumbers(List lottoNumber public List numberValues() { return this.numbers.stream() - .map(LottoNumber::value) + .map(LottoNumber::getValue) .toList(); } diff --git a/src/main/java/lotto/domain/model/LottoNumber.java b/src/main/java/lotto/domain/model/LottoNumber.java index 574c00e3de..7b5c8c86e3 100644 --- a/src/main/java/lotto/domain/model/LottoNumber.java +++ b/src/main/java/lotto/domain/model/LottoNumber.java @@ -1,12 +1,14 @@ package lotto.domain.model; import java.util.Map; +import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.IntStream; -public record LottoNumber(int value) { +public class LottoNumber { + private final int value; private final static Map cache; public static final int MIN_LOTTO_NUMBER = 1; public static final int MAX_LOTTO_NUMBER = 45; @@ -29,6 +31,10 @@ private LottoNumber(String value) { this(Integer.parseInt(value)); } + private LottoNumber(int value) { + this.value = value; + } + public static LottoNumber of(int value) { LottoNumber cachedLottoNumber = cache.get(value); validate(cachedLottoNumber); @@ -39,9 +45,27 @@ public static LottoNumber of(String value) { return of(Integer.parseInt(value)); } + public int getValue() { + return value; + } + private static void validate(LottoNumber result) { if(result == null) { throw new IllegalArgumentException("로또 번호는 1~45사이 입력하시오"); } } + + @Override + public boolean equals(Object o) { + if(o == null || getClass() != o.getClass()) { + return false; + } + LottoNumber that = (LottoNumber) o; + return value == that.value; + } + + @Override + public int hashCode() { + return Objects.hashCode(value); + } } From 85b53dbb861c9bcc5e496cb9db8de0f7820ff10f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Tue, 2 Dec 2025 01:27:53 +0900 Subject: [PATCH 14/22] =?UTF-8?q?feat=20:=20=EB=A1=9C=EB=98=90=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EB=B0=A9=EC=8B=9D=EC=9D=84=20=EC=89=BD=EA=B2=8C=20?= =?UTF-8?q?=EA=B0=88=EC=95=84=EB=81=BC=EC=9A=B0=EA=B8=B0=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=20&?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84(=ED=98=BC=ED=95=A9=20+=20=EC=88=98?= =?UTF-8?q?=EB=8F=99=20+=20=EC=9E=90=EB=8F=99)=EA=B0=9C=EB=B0=9C=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoApplication.java | 23 +++++++++- .../java/lotto/domain/business/LottoBuy.java | 26 ++--------- .../java/lotto/domain/model/BuyCount.java | 10 +++++ .../lotto/domain/model/LottoGenerator.java | 15 +++++++ .../domain/model/impl/LottoAutoGenerator.java | 40 +++++++++++++++++ .../model/impl/LottoCombineGenerator.java | 43 +++++++++++++++++++ .../model/impl/LottoManulGenerator.java | 41 ++++++++++++++++++ .../lotto/domain/business/LottoBuyTest.java | 20 +++------ .../java/lotto/domain/model/BuyCountTest.java | 18 ++++++++ .../model/impl/LottoAutoGeneratorTest.java | 17 ++++++++ .../model/impl/LottoCombineGeneratorTest.java | 27 ++++++++++++ .../model/impl/LottoManulGeneratorTest.java | 18 ++++++++ 12 files changed, 261 insertions(+), 37 deletions(-) create mode 100644 src/main/java/lotto/domain/model/LottoGenerator.java create mode 100644 src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java create mode 100644 src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java create mode 100644 src/main/java/lotto/domain/model/impl/LottoManulGenerator.java create mode 100644 src/test/java/lotto/domain/model/BuyCountTest.java create mode 100644 src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java create mode 100644 src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java create mode 100644 src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 7a645ab2b0..80086b7053 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -4,7 +4,11 @@ import java.util.stream.IntStream; import lotto.domain.business.LottoBuy; import lotto.domain.business.LottoGame; +import lotto.domain.model.LottoGenerator; import lotto.domain.model.WinningResult; +import lotto.domain.model.impl.LottoAutoGenerator; +import lotto.domain.model.impl.LottoCombineGenerator; +import lotto.domain.model.impl.LottoManulGenerator; import lotto.view.InputView; import lotto.view.ResultView; @@ -28,8 +32,17 @@ private void run() { private void play() { String pay = InputView.inputPurchaseAmount(); String manualCount = InputView.inputManulNumber(); + + LottoGenerator lottoGenerator = null; + if(isAllAutoGenerate(manualCount)) { + lottoGenerator = new LottoAutoGenerator(); + } + if(isAllManualGenerate(manualCount, pay)) { + lottoGenerator = new LottoManulGenerator(); + } + lottoGenerator = new LottoCombineGenerator(); List manualLottoNumbers = readManualLottos(manualCount); - LottoBuy lottoBuy = new LottoBuy(pay, manualLottoNumbers); + LottoBuy lottoBuy = lottoGenerator.generate(pay, manualLottoNumbers); ResultView.printAutoManualCount(lottoBuy.combineBuyCount()); LottoGame lottoGame = new LottoGame(pay, lottoBuy.combineLotto()); @@ -40,6 +53,14 @@ private void play() { ResultView.printResult(winningResult, totalReturn); } + private static boolean isAllAutoGenerate(String manualCount) { + return manualCount.equals("0"); + } + + private static boolean isAllManualGenerate(String manualCount, String pay) { + return Integer.parseInt(manualCount) == Integer.parseInt(pay) / 1000; + } + private List readManualLottos(String count) { if(count.isEmpty()) { throw new IllegalArgumentException("수동 구매 수는 0 이상의 숫자로 입력해 주세요."); diff --git a/src/main/java/lotto/domain/business/LottoBuy.java b/src/main/java/lotto/domain/business/LottoBuy.java index bf82ee8755..e46f9c10d2 100644 --- a/src/main/java/lotto/domain/business/LottoBuy.java +++ b/src/main/java/lotto/domain/business/LottoBuy.java @@ -1,31 +1,13 @@ package lotto.domain.business; -import java.util.List; import java.util.stream.Stream; -import lotto.domain.model.*; +import lotto.domain.model.Auto; +import lotto.domain.model.BuyCount; +import lotto.domain.model.LottoTickets; +import lotto.domain.model.Manual; public record LottoBuy(BuyCount buyCount, Manual manual, Auto auto) { - public LottoBuy(String pay, List manualLottoNumbers) { - this(Integer.parseInt(pay), manualLottoNumbers); - } - - public LottoBuy(int pay, List manualLottoNumbers) { - this(new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), getTotalNumber(pay) - manualLottoNumbers.size()), - new Manual(toLottoList(manualLottoNumbers)), - new Auto(getTotalNumber(pay) - manualLottoNumbers.size())); - } - - private static int getTotalNumber(int pay) { - return new Pay(pay).convertToBuyCount(); - } - - private static List toLottoList(List lottoNumbers) { - return lottoNumbers.stream() - .map(Lotto::new) - .toList(); - } - public LottoTickets combineLotto() { return new LottoTickets(Stream.concat( this.manual.manualLottoList().stream(), diff --git a/src/main/java/lotto/domain/model/BuyCount.java b/src/main/java/lotto/domain/model/BuyCount.java index de5730622a..27054e110d 100644 --- a/src/main/java/lotto/domain/model/BuyCount.java +++ b/src/main/java/lotto/domain/model/BuyCount.java @@ -1,4 +1,14 @@ package lotto.domain.model; public record BuyCount(int total, int manual, int auto) { + + public BuyCount { + validate(total, manual, auto); + } + + void validate(int total, int manual, int auto) { + if(total != (manual + auto)) { + throw new IllegalArgumentException("지불금액 대비 구매수가 일치하지 않습니다."); + } + } } diff --git a/src/main/java/lotto/domain/model/LottoGenerator.java b/src/main/java/lotto/domain/model/LottoGenerator.java new file mode 100644 index 0000000000..7835256eeb --- /dev/null +++ b/src/main/java/lotto/domain/model/LottoGenerator.java @@ -0,0 +1,15 @@ +package lotto.domain.model; + +import java.util.List; +import lotto.domain.business.LottoBuy; + +public interface LottoGenerator { + + LottoBuy generate(int pay, List manualLottoNumbers); + + LottoBuy generate(String pay, List manualLottoNumbers); + + LottoBuy generate(int pay); + + LottoBuy generate(String pay); +} diff --git a/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java b/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java new file mode 100644 index 0000000000..5bf68ddb8e --- /dev/null +++ b/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java @@ -0,0 +1,40 @@ +package lotto.domain.model.impl; + +import java.util.List; +import lotto.domain.business.LottoBuy; +import lotto.domain.model.*; + +public class LottoAutoGenerator implements LottoGenerator { + + @Override + public LottoBuy generate(int pay, List manualLottoNumbers) { + return new LottoBuy( + new BuyCount(getTotalNumber(pay), 0, getTotalNumber(pay)), + new Manual(List.of()), + new Auto(getTotalNumber(pay)) + ); + } + + @Override + public LottoBuy generate(String pay, List manualLottoNumbers) { + return generate(Integer.parseInt(pay), manualLottoNumbers); + } + + @Override + public LottoBuy generate(int pay) { + return new LottoBuy( + new BuyCount(getTotalNumber(pay), 0, getTotalNumber(pay)), + new Manual(List.of()), + new Auto(getTotalNumber(pay)) + ); + } + + @Override + public LottoBuy generate(String pay) { + return generate(Integer.parseInt(pay)); + } + + private int getTotalNumber(int pay) { + return new Pay(pay).convertToBuyCount(); + } +} diff --git a/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java b/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java new file mode 100644 index 0000000000..f3adbd42dc --- /dev/null +++ b/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java @@ -0,0 +1,43 @@ +package lotto.domain.model.impl; + +import java.util.List; +import lotto.domain.business.LottoBuy; +import lotto.domain.model.*; + +public class LottoCombineGenerator implements LottoGenerator { + + @Override + public LottoBuy generate(int pay, List manualLottoNumbers) { + return + new LottoBuy( + new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), getTotalNumber(pay) - manualLottoNumbers.size()), + new Manual(toLottoList(manualLottoNumbers)), + new Auto(getTotalNumber(pay) - manualLottoNumbers.size()) + ); + } + + @Override + public LottoBuy generate(String pay, List manualLottoNumbers) { + return generate(Integer.parseInt(pay), manualLottoNumbers); + } + + @Override + public LottoBuy generate(int pay) { + throw new IllegalArgumentException("수동생성에는 수동 입력이 필요합니다."); + } + + @Override + public LottoBuy generate(String pay) { + throw new IllegalArgumentException("수동생성에는 수동 입력이 필요합니다."); + } + + private static int getTotalNumber(int pay) { + return new Pay(pay).convertToBuyCount(); + } + + private static List toLottoList(List lottoNumbers) { + return lottoNumbers.stream() + .map(Lotto::new) + .toList(); + } +} diff --git a/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java b/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java new file mode 100644 index 0000000000..2e231326c5 --- /dev/null +++ b/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java @@ -0,0 +1,41 @@ +package lotto.domain.model.impl; + +import java.util.List; +import lotto.domain.business.LottoBuy; +import lotto.domain.model.*; + +public class LottoManulGenerator implements LottoGenerator { + + public LottoBuy generate(int pay, List manualLottoNumbers) { + return new LottoBuy( + new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), 0), + new Manual(toLottoList(manualLottoNumbers)), + new Auto(0) + ); + } + + @Override + public LottoBuy generate(String pay, List manualLottoNumbers) { + return generate(Integer.parseInt(pay), manualLottoNumbers); + } + + @Override + public LottoBuy generate(int pay) { + throw new IllegalArgumentException("혼합 생성에는 수동 입력이 필요합니다."); + } + + @Override + public LottoBuy generate(String pay) { + throw new IllegalArgumentException("혼합 생성에는 수동 입력이 필요합니다."); + } + + private static int getTotalNumber(int pay) { + return new Pay(pay).convertToBuyCount(); + } + + private static List toLottoList(List lottoNumbers) { + return lottoNumbers.stream() + .map(Lotto::new) + .toList(); + } +} diff --git a/src/test/java/lotto/domain/business/LottoBuyTest.java b/src/test/java/lotto/domain/business/LottoBuyTest.java index 32465b7ca2..bb5784ec8f 100644 --- a/src/test/java/lotto/domain/business/LottoBuyTest.java +++ b/src/test/java/lotto/domain/business/LottoBuyTest.java @@ -4,31 +4,23 @@ import java.util.List; import lotto.domain.model.Lotto; +import lotto.domain.model.LottoGenerator; +import lotto.domain.model.impl.LottoCombineGenerator; import org.junit.jupiter.api.Test; class LottoBuyTest { - @Test - void 수동으로_생성한_만큼_보여준다() { - LottoBuy lottoBuy = new LottoBuy(5000, List.of("1,2,3,4,5,6")); - assertThat(lottoBuy.combineBuyCount().manual()).isEqualTo(1); - } - - @Test - void 자동으로_생성한_만큼_보여준다() { - LottoBuy lottoBuy = new LottoBuy(5000, List.of("1,2,3,4,5,6")); - assertThat(lottoBuy.combineBuyCount().auto()).isEqualTo(4); - } - @Test void 수동생성에다가_자동생성을_합친_수는_같다() { - LottoBuy lottoBuy = new LottoBuy(5000, List.of("1,2,3,4,5,6")); + LottoGenerator lottoGenerator = new LottoCombineGenerator(); + LottoBuy lottoBuy = lottoGenerator.generate(5000, List.of("1,2,3,4,5,6")); assertThat(lottoBuy.combineLotto().tickets()).hasSize(5); } @Test void 수동생성에다가_자동생성을_합친것_중_수동입력은_같다() { - LottoBuy lottoBuy = new LottoBuy(5000, List.of("1,2,3,4,5,6")); + LottoGenerator lottoGenerator = new LottoCombineGenerator(); + LottoBuy lottoBuy = lottoGenerator.generate(5000, List.of("1,2,3,4,5,6")); assertThat(lottoBuy.combineLotto().tickets().getFirst()).isEqualTo(new Lotto(1, 2, 3, 4, 5, 6)); } diff --git a/src/test/java/lotto/domain/model/BuyCountTest.java b/src/test/java/lotto/domain/model/BuyCountTest.java new file mode 100644 index 0000000000..3fe8ea9635 --- /dev/null +++ b/src/test/java/lotto/domain/model/BuyCountTest.java @@ -0,0 +1,18 @@ +package lotto.domain.model; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +class BuyCountTest { + + @Test + void 지불금액으로_만드는로또수가_실제로또수와_다르면_에러전파() { + + assertThatThrownBy(() -> { + new BuyCount(5, 1, 1); + }).isInstanceOf(IllegalArgumentException.class) + .hasMessage("지불금액 대비 구매수가 일치하지 않습니다."); + + } +} \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java b/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java new file mode 100644 index 0000000000..41e362c665 --- /dev/null +++ b/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java @@ -0,0 +1,17 @@ +package lotto.domain.model.impl; + +import static org.assertj.core.api.Assertions.assertThat; + +import lotto.domain.business.LottoBuy; +import lotto.domain.model.LottoGenerator; +import org.junit.jupiter.api.Test; + +class LottoAutoGeneratorTest { + + @Test + void 자동으로_생성한_만큼_보여준다() { + LottoGenerator lottoGenerator = new LottoAutoGenerator(); + LottoBuy lottoBuy = lottoGenerator.generate(5000); + assertThat(lottoBuy.combineBuyCount().total()).isEqualTo(5); + } +} \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java b/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java new file mode 100644 index 0000000000..b64c3769ef --- /dev/null +++ b/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java @@ -0,0 +1,27 @@ +package lotto.domain.model.impl; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import lotto.domain.business.LottoBuy; +import lotto.domain.model.LottoGenerator; +import org.junit.jupiter.api.Test; + +class LottoCombineGeneratorTest { + + @Test + void 수동으로_생성한_만큼_보여준다() { + LottoGenerator lottoGenerator = new LottoCombineGenerator(); + LottoBuy lottoBuy = lottoGenerator.generate(5000, List.of("1,2,3,4,5,6")); + + assertThat(lottoBuy.combineBuyCount().manual()).isEqualTo(1); + } + + @Test + void 자동으로_생성한_만큼_보여준다() { + LottoGenerator lottoGenerator = new LottoCombineGenerator(); + LottoBuy lottoBuy = lottoGenerator.generate(5000, List.of("1,2,3,4,5,6")); + assertThat(lottoBuy.combineBuyCount().auto()).isEqualTo(4); + } + +} \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java b/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java new file mode 100644 index 0000000000..2dc3dc7af1 --- /dev/null +++ b/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java @@ -0,0 +1,18 @@ +package lotto.domain.model.impl; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import lotto.domain.business.LottoBuy; +import lotto.domain.model.LottoGenerator; +import org.junit.jupiter.api.Test; + +class LottoManulGeneratorTest { + + @Test + void 수동으로_생성한_만큼_보여준다() { + LottoGenerator lottoGenerator = new LottoManulGenerator(); + LottoBuy lottoBuy = lottoGenerator.generate(3000, List.of("1,2,3,4,5,6", "1,2,3,4,5,7", "1,2,3,4,5,9")); + assertThat(lottoBuy.combineBuyCount().total()).isEqualTo(3); + } +} \ No newline at end of file From ca2a55d731e3a840fff6747fb9bded992b3c8598 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Tue, 2 Dec 2025 01:35:01 +0900 Subject: [PATCH 15/22] =?UTF-8?q?fix=20:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EC=B2=B4=20=EC=A3=BC=EC=9E=85=EC=88=9C?= =?UTF-8?q?=EC=84=9C=EB=A1=9C=20=EB=AC=B4=EC=A1=B0=EA=B1=B4=20`LottoCombin?= =?UTF-8?q?eGenerator`=20=EA=B0=80=20=EC=A3=BC=EC=9E=85=EB=90=98=EB=8A=94?= =?UTF-8?q?=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lotto/controller/LottoApplication.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 80086b7053..3c5f2d6035 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -33,14 +33,13 @@ private void play() { String pay = InputView.inputPurchaseAmount(); String manualCount = InputView.inputManulNumber(); - LottoGenerator lottoGenerator = null; + LottoGenerator lottoGenerator = new LottoCombineGenerator(); if(isAllAutoGenerate(manualCount)) { lottoGenerator = new LottoAutoGenerator(); } if(isAllManualGenerate(manualCount, pay)) { lottoGenerator = new LottoManulGenerator(); } - lottoGenerator = new LottoCombineGenerator(); List manualLottoNumbers = readManualLottos(manualCount); LottoBuy lottoBuy = lottoGenerator.generate(pay, manualLottoNumbers); From c351e9a0011f87cbefffc5abde29a0c8f6f1bca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Sun, 7 Dec 2025 16:35:04 +0900 Subject: [PATCH 16/22] =?UTF-8?q?refactor=20:=20=EB=B3=B5=EC=9E=A1?= =?UTF-8?q?=ED=95=B4=EC=A7=84=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=EB=A5=BC=20=EB=8B=A8=EC=88=9C=ED=99=94=ED=95=98?= =?UTF-8?q?=EC=97=AC=EC=84=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoApplication.java | 39 +++++++++++++------ .../lotto/domain/model/LottoGenerator.java | 9 +---- .../domain/model/impl/LottoAutoGenerator.java | 23 ++++------- .../model/impl/LottoCombineGenerator.java | 33 ++++++++-------- .../model/impl/LottoManulGenerator.java | 30 +++++++------- .../lotto/domain/business/LottoBuyTest.java | 22 +++++++---- .../model/impl/LottoAutoGeneratorTest.java | 4 +- .../model/impl/LottoCombineGeneratorTest.java | 9 ++--- .../model/impl/LottoManulGeneratorTest.java | 4 +- 9 files changed, 92 insertions(+), 81 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 3c5f2d6035..985ec715e1 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -33,15 +33,8 @@ private void play() { String pay = InputView.inputPurchaseAmount(); String manualCount = InputView.inputManulNumber(); - LottoGenerator lottoGenerator = new LottoCombineGenerator(); - if(isAllAutoGenerate(manualCount)) { - lottoGenerator = new LottoAutoGenerator(); - } - if(isAllManualGenerate(manualCount, pay)) { - lottoGenerator = new LottoManulGenerator(); - } - List manualLottoNumbers = readManualLottos(manualCount); - LottoBuy lottoBuy = lottoGenerator.generate(pay, manualLottoNumbers); + LottoGenerator lottoGenerator = createGenerator(pay, manualCount); + LottoBuy lottoBuy = lottoGenerator.generate(); ResultView.printAutoManualCount(lottoBuy.combineBuyCount()); LottoGame lottoGame = new LottoGame(pay, lottoBuy.combineLotto()); @@ -52,14 +45,38 @@ private void play() { ResultView.printResult(winningResult, totalReturn); } - private static boolean isAllAutoGenerate(String manualCount) { + private LottoGenerator createGenerator(String pay, String manualCount) { + if(isAllAutoGenerate(manualCount)) { + return new LottoAutoGenerator(pay); + } + + List manualLottoNumbers = readManualLottos(manualCount); + if(isAllManualGenerate(manualCount, pay)) { + return new LottoManulGenerator(pay, manualLottoNumbers); + } + + if(isCombineGenerate(manualCount, pay)) { + return new LottoCombineGenerator(pay, manualLottoNumbers); + } + + throw new IllegalStateException("로또 생성기 결정 실패"); + } + + private boolean isAllAutoGenerate(String manualCount) { return manualCount.equals("0"); } - private static boolean isAllManualGenerate(String manualCount, String pay) { + private boolean isAllManualGenerate(String manualCount, String pay) { return Integer.parseInt(manualCount) == Integer.parseInt(pay) / 1000; } + private boolean isCombineGenerate(String manualCount, String pay) { + if(isAllAutoGenerate(manualCount)) { + return false; + } + return Integer.parseInt(manualCount) != Integer.parseInt(pay) / 1000; + } + private List readManualLottos(String count) { if(count.isEmpty()) { throw new IllegalArgumentException("수동 구매 수는 0 이상의 숫자로 입력해 주세요."); diff --git a/src/main/java/lotto/domain/model/LottoGenerator.java b/src/main/java/lotto/domain/model/LottoGenerator.java index 7835256eeb..0327f8dcf3 100644 --- a/src/main/java/lotto/domain/model/LottoGenerator.java +++ b/src/main/java/lotto/domain/model/LottoGenerator.java @@ -1,15 +1,8 @@ package lotto.domain.model; -import java.util.List; import lotto.domain.business.LottoBuy; public interface LottoGenerator { - LottoBuy generate(int pay, List manualLottoNumbers); - - LottoBuy generate(String pay, List manualLottoNumbers); - - LottoBuy generate(int pay); - - LottoBuy generate(String pay); + LottoBuy generate(); } diff --git a/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java b/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java index 5bf68ddb8e..4b3a53e921 100644 --- a/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java +++ b/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java @@ -6,22 +6,18 @@ public class LottoAutoGenerator implements LottoGenerator { - @Override - public LottoBuy generate(int pay, List manualLottoNumbers) { - return new LottoBuy( - new BuyCount(getTotalNumber(pay), 0, getTotalNumber(pay)), - new Manual(List.of()), - new Auto(getTotalNumber(pay)) - ); + int pay; + + public LottoAutoGenerator(String pay) { + this(Integer.parseInt(pay)); } - @Override - public LottoBuy generate(String pay, List manualLottoNumbers) { - return generate(Integer.parseInt(pay), manualLottoNumbers); + public LottoAutoGenerator(int pay) { + this.pay = pay; } @Override - public LottoBuy generate(int pay) { + public LottoBuy generate() { return new LottoBuy( new BuyCount(getTotalNumber(pay), 0, getTotalNumber(pay)), new Manual(List.of()), @@ -29,11 +25,6 @@ public LottoBuy generate(int pay) { ); } - @Override - public LottoBuy generate(String pay) { - return generate(Integer.parseInt(pay)); - } - private int getTotalNumber(int pay) { return new Pay(pay).convertToBuyCount(); } diff --git a/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java b/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java index f3adbd42dc..a18c50401d 100644 --- a/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java +++ b/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java @@ -6,29 +6,30 @@ public class LottoCombineGenerator implements LottoGenerator { - @Override - public LottoBuy generate(int pay, List manualLottoNumbers) { - return - new LottoBuy( - new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), getTotalNumber(pay) - manualLottoNumbers.size()), - new Manual(toLottoList(manualLottoNumbers)), - new Auto(getTotalNumber(pay) - manualLottoNumbers.size()) - ); + private final int pay; + private final List manualLottoNumbers; + + public LottoCombineGenerator(int pay, String manualLottoNumbers) { + this(pay, List.of(manualLottoNumbers)); } - @Override - public LottoBuy generate(String pay, List manualLottoNumbers) { - return generate(Integer.parseInt(pay), manualLottoNumbers); + public LottoCombineGenerator(String pay, List manualLottoNumbers) { + this(Integer.parseInt(pay), manualLottoNumbers); } - @Override - public LottoBuy generate(int pay) { - throw new IllegalArgumentException("수동생성에는 수동 입력이 필요합니다."); + public LottoCombineGenerator(int pay, List manualLottoNumbers) { + this.pay = pay; + this.manualLottoNumbers = toLottoList(manualLottoNumbers); } @Override - public LottoBuy generate(String pay) { - throw new IllegalArgumentException("수동생성에는 수동 입력이 필요합니다."); + public LottoBuy generate() { + return + new LottoBuy( + new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), getTotalNumber(pay) - manualLottoNumbers.size()), + new Manual(manualLottoNumbers), + new Auto(getTotalNumber(pay) - manualLottoNumbers.size()) + ); } private static int getTotalNumber(int pay) { diff --git a/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java b/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java index 2e231326c5..9ca57744fe 100644 --- a/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java +++ b/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java @@ -6,27 +6,29 @@ public class LottoManulGenerator implements LottoGenerator { - public LottoBuy generate(int pay, List manualLottoNumbers) { - return new LottoBuy( - new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), 0), - new Manual(toLottoList(manualLottoNumbers)), - new Auto(0) - ); + private final int pay; + private final List manualLottoNumbers; + + public LottoManulGenerator(int pay, String manualLottoNumbers) { + this(pay, List.of(manualLottoNumbers)); } - @Override - public LottoBuy generate(String pay, List manualLottoNumbers) { - return generate(Integer.parseInt(pay), manualLottoNumbers); + public LottoManulGenerator(String pay, List manualLottoNumbers) { + this(Integer.parseInt(pay), manualLottoNumbers); } - @Override - public LottoBuy generate(int pay) { - throw new IllegalArgumentException("혼합 생성에는 수동 입력이 필요합니다."); + public LottoManulGenerator(int pay, List manualLottoNumbers) { + this.pay = pay; + this.manualLottoNumbers = toLottoList(manualLottoNumbers); } @Override - public LottoBuy generate(String pay) { - throw new IllegalArgumentException("혼합 생성에는 수동 입력이 필요합니다."); + public LottoBuy generate() { + return new LottoBuy( + new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), 0), + new Manual(manualLottoNumbers), + new Auto(0) + ); } private static int getTotalNumber(int pay) { diff --git a/src/test/java/lotto/domain/business/LottoBuyTest.java b/src/test/java/lotto/domain/business/LottoBuyTest.java index bb5784ec8f..662000c027 100644 --- a/src/test/java/lotto/domain/business/LottoBuyTest.java +++ b/src/test/java/lotto/domain/business/LottoBuyTest.java @@ -3,25 +3,33 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.List; -import lotto.domain.model.Lotto; import lotto.domain.model.LottoGenerator; +import lotto.domain.model.impl.LottoAutoGenerator; import lotto.domain.model.impl.LottoCombineGenerator; +import lotto.domain.model.impl.LottoManulGenerator; import org.junit.jupiter.api.Test; class LottoBuyTest { @Test void 수동생성에다가_자동생성을_합친_수는_같다() { - LottoGenerator lottoGenerator = new LottoCombineGenerator(); - LottoBuy lottoBuy = lottoGenerator.generate(5000, List.of("1,2,3,4,5,6")); + LottoGenerator lottoGenerator = new LottoManulGenerator(1000, List.of("1,2,3,4,5,6")); + LottoBuy lottoBuy = lottoGenerator.generate(); + assertThat(lottoBuy.combineLotto().tickets()).hasSize(1); + } + + @Test + void 혼합생성에다가_자동생성을_합친_수는_같다() { + LottoGenerator lottoGenerator = new LottoCombineGenerator(5000, List.of("1,2,3,4,5,6")); + LottoBuy lottoBuy = lottoGenerator.generate(); assertThat(lottoBuy.combineLotto().tickets()).hasSize(5); } @Test - void 수동생성에다가_자동생성을_합친것_중_수동입력은_같다() { - LottoGenerator lottoGenerator = new LottoCombineGenerator(); - LottoBuy lottoBuy = lottoGenerator.generate(5000, List.of("1,2,3,4,5,6")); - assertThat(lottoBuy.combineLotto().tickets().getFirst()).isEqualTo(new Lotto(1, 2, 3, 4, 5, 6)); + void 자동생성에다가_자동생성을_합친_수는_같다() { + LottoGenerator lottoGenerator = new LottoAutoGenerator(5000); + LottoBuy lottoBuy = lottoGenerator.generate(); + assertThat(lottoBuy.combineLotto().tickets()).hasSize(5); } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java b/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java index 41e362c665..fd45ffbe2c 100644 --- a/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java +++ b/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java @@ -10,8 +10,8 @@ class LottoAutoGeneratorTest { @Test void 자동으로_생성한_만큼_보여준다() { - LottoGenerator lottoGenerator = new LottoAutoGenerator(); - LottoBuy lottoBuy = lottoGenerator.generate(5000); + LottoGenerator lottoGenerator = new LottoAutoGenerator(5000); + LottoBuy lottoBuy = lottoGenerator.generate(); assertThat(lottoBuy.combineBuyCount().total()).isEqualTo(5); } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java b/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java index b64c3769ef..34dfb45cd4 100644 --- a/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java +++ b/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java @@ -2,7 +2,6 @@ import static org.assertj.core.api.Assertions.assertThat; -import java.util.List; import lotto.domain.business.LottoBuy; import lotto.domain.model.LottoGenerator; import org.junit.jupiter.api.Test; @@ -11,16 +10,16 @@ class LottoCombineGeneratorTest { @Test void 수동으로_생성한_만큼_보여준다() { - LottoGenerator lottoGenerator = new LottoCombineGenerator(); - LottoBuy lottoBuy = lottoGenerator.generate(5000, List.of("1,2,3,4,5,6")); + LottoGenerator lottoGenerator = new LottoCombineGenerator(5000, "1,2,3,4,5,6"); + LottoBuy lottoBuy = lottoGenerator.generate(); assertThat(lottoBuy.combineBuyCount().manual()).isEqualTo(1); } @Test void 자동으로_생성한_만큼_보여준다() { - LottoGenerator lottoGenerator = new LottoCombineGenerator(); - LottoBuy lottoBuy = lottoGenerator.generate(5000, List.of("1,2,3,4,5,6")); + LottoGenerator lottoGenerator = new LottoCombineGenerator(5000, "1,2,3,4,5,6"); + LottoBuy lottoBuy = lottoGenerator.generate(); assertThat(lottoBuy.combineBuyCount().auto()).isEqualTo(4); } diff --git a/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java b/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java index 2dc3dc7af1..afa360ca14 100644 --- a/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java +++ b/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java @@ -11,8 +11,8 @@ class LottoManulGeneratorTest { @Test void 수동으로_생성한_만큼_보여준다() { - LottoGenerator lottoGenerator = new LottoManulGenerator(); - LottoBuy lottoBuy = lottoGenerator.generate(3000, List.of("1,2,3,4,5,6", "1,2,3,4,5,7", "1,2,3,4,5,9")); + LottoGenerator lottoGenerator = new LottoManulGenerator(3000, List.of("1,2,3,4,5,6", "1,2,3,4,5,7", "1,2,3,4,5,9")); + LottoBuy lottoBuy = lottoGenerator.generate(); assertThat(lottoBuy.combineBuyCount().total()).isEqualTo(3); } } \ No newline at end of file From a9faec29fb8125aaaca40987c22ef4d95e95697e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Sun, 7 Dec 2025 16:59:20 +0900 Subject: [PATCH 17/22] =?UTF-8?q?refactor=20:=20controller=EC=97=90?= =?UTF-8?q?=EC=84=9C=20interface=20=EB=B6=84=EB=A6=AC=20=EC=9B=90=EC=B9=99?= =?UTF-8?q?=EC=97=90=20=EB=B6=80=ED=95=A9=ED=95=98=EC=A7=80=EC=95=8A?= =?UTF-8?q?=EB=8A=94=20=EC=A1=B0=EA=B1=B4=EB=AC=B8=20=EB=B6=84=EA=B8=B0?= =?UTF-8?q?=EB=A1=9C=20=EA=B5=AC=ED=98=84=EC=B2=B4=20=EC=A0=95=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=B0=A9=EC=8B=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoApplication.java | 37 +------------------ 1 file changed, 2 insertions(+), 35 deletions(-) diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index 985ec715e1..f40f4980dd 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -6,9 +6,7 @@ import lotto.domain.business.LottoGame; import lotto.domain.model.LottoGenerator; import lotto.domain.model.WinningResult; -import lotto.domain.model.impl.LottoAutoGenerator; import lotto.domain.model.impl.LottoCombineGenerator; -import lotto.domain.model.impl.LottoManulGenerator; import lotto.view.InputView; import lotto.view.ResultView; @@ -33,7 +31,8 @@ private void play() { String pay = InputView.inputPurchaseAmount(); String manualCount = InputView.inputManulNumber(); - LottoGenerator lottoGenerator = createGenerator(pay, manualCount); + List manualLottoNumbers = readManualLottos(manualCount); + LottoGenerator lottoGenerator = new LottoCombineGenerator(pay, manualLottoNumbers); LottoBuy lottoBuy = lottoGenerator.generate(); ResultView.printAutoManualCount(lottoBuy.combineBuyCount()); @@ -45,38 +44,6 @@ private void play() { ResultView.printResult(winningResult, totalReturn); } - private LottoGenerator createGenerator(String pay, String manualCount) { - if(isAllAutoGenerate(manualCount)) { - return new LottoAutoGenerator(pay); - } - - List manualLottoNumbers = readManualLottos(manualCount); - if(isAllManualGenerate(manualCount, pay)) { - return new LottoManulGenerator(pay, manualLottoNumbers); - } - - if(isCombineGenerate(manualCount, pay)) { - return new LottoCombineGenerator(pay, manualLottoNumbers); - } - - throw new IllegalStateException("로또 생성기 결정 실패"); - } - - private boolean isAllAutoGenerate(String manualCount) { - return manualCount.equals("0"); - } - - private boolean isAllManualGenerate(String manualCount, String pay) { - return Integer.parseInt(manualCount) == Integer.parseInt(pay) / 1000; - } - - private boolean isCombineGenerate(String manualCount, String pay) { - if(isAllAutoGenerate(manualCount)) { - return false; - } - return Integer.parseInt(manualCount) != Integer.parseInt(pay) / 1000; - } - private List readManualLottos(String count) { if(count.isEmpty()) { throw new IllegalArgumentException("수동 구매 수는 0 이상의 숫자로 입력해 주세요."); From 2f0f94caa98b1870171c89dea3a18f6d1b613406 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Tue, 9 Dec 2025 22:16:43 +0900 Subject: [PATCH 18/22] =?UTF-8?q?refactor=20:=20=EB=A1=9C=EB=98=90=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EA=B8=B0=EC=97=90=EC=84=9C=20=EA=B3=A7?= =?UTF-8?q?=EB=B0=94=EB=A1=9C=20LottoBuy=20=EA=B0=80=20=EC=95=84=EB=8B=8C?= =?UTF-8?q?=20LottoTickets=20=EC=9C=BC=EB=A1=9C=20=EB=A6=AC=ED=84=B4?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoApplication.java | 6 ++-- .../java/lotto/domain/business/LottoBuy.java | 21 ----------- .../lotto/domain/model/LottoGenerator.java | 6 ++-- .../java/lotto/domain/model/LottoTickets.java | 4 +++ .../domain/model/impl/LottoAutoGenerator.java | 15 ++++---- .../model/impl/LottoCombineGenerator.java | 18 ++++++---- .../model/impl/LottoManulGenerator.java | 14 ++++---- .../lotto/domain/business/LottoBuyTest.java | 35 ------------------- .../model/impl/LottoAutoGeneratorTest.java | 8 +++-- .../model/impl/LottoCombineGeneratorTest.java | 13 ++++--- .../model/impl/LottoManulGeneratorTest.java | 6 ++-- 11 files changed, 51 insertions(+), 95 deletions(-) delete mode 100644 src/main/java/lotto/domain/business/LottoBuy.java delete mode 100644 src/test/java/lotto/domain/business/LottoBuyTest.java diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index f40f4980dd..eab79d08ef 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -2,7 +2,6 @@ import java.util.List; import java.util.stream.IntStream; -import lotto.domain.business.LottoBuy; import lotto.domain.business.LottoGame; import lotto.domain.model.LottoGenerator; import lotto.domain.model.WinningResult; @@ -33,10 +32,9 @@ private void play() { List manualLottoNumbers = readManualLottos(manualCount); LottoGenerator lottoGenerator = new LottoCombineGenerator(pay, manualLottoNumbers); - LottoBuy lottoBuy = lottoGenerator.generate(); - ResultView.printAutoManualCount(lottoBuy.combineBuyCount()); - LottoGame lottoGame = new LottoGame(pay, lottoBuy.combineLotto()); + ResultView.printAutoManualCount(lottoGenerator.getBuyCount()); + LottoGame lottoGame = new LottoGame(pay, lottoGenerator.generateTickets()); ResultView.printLottos(lottoGame.getLottos()); WinningResult winningResult = lottoGame.calculateWinningResult(InputView.inputWinningNumbers(), InputView.inputBonusNumbers()); diff --git a/src/main/java/lotto/domain/business/LottoBuy.java b/src/main/java/lotto/domain/business/LottoBuy.java deleted file mode 100644 index e46f9c10d2..0000000000 --- a/src/main/java/lotto/domain/business/LottoBuy.java +++ /dev/null @@ -1,21 +0,0 @@ -package lotto.domain.business; - -import java.util.stream.Stream; -import lotto.domain.model.Auto; -import lotto.domain.model.BuyCount; -import lotto.domain.model.LottoTickets; -import lotto.domain.model.Manual; - -public record LottoBuy(BuyCount buyCount, Manual manual, Auto auto) { - - public LottoTickets combineLotto() { - return new LottoTickets(Stream.concat( - this.manual.manualLottoList().stream(), - this.auto.autoLottoList().stream()) - .toList()); - } - - public BuyCount combineBuyCount() { - return this.buyCount; - } -} diff --git a/src/main/java/lotto/domain/model/LottoGenerator.java b/src/main/java/lotto/domain/model/LottoGenerator.java index 0327f8dcf3..0481730556 100644 --- a/src/main/java/lotto/domain/model/LottoGenerator.java +++ b/src/main/java/lotto/domain/model/LottoGenerator.java @@ -1,8 +1,8 @@ package lotto.domain.model; -import lotto.domain.business.LottoBuy; - public interface LottoGenerator { - LottoBuy generate(); + LottoTickets generateTickets(); + + BuyCount getBuyCount(); } diff --git a/src/main/java/lotto/domain/model/LottoTickets.java b/src/main/java/lotto/domain/model/LottoTickets.java index ba4f69a534..b3060611e0 100644 --- a/src/main/java/lotto/domain/model/LottoTickets.java +++ b/src/main/java/lotto/domain/model/LottoTickets.java @@ -14,6 +14,10 @@ public LottoTickets(int num) { this(generateLottos(num)); } + public int getLottoTicketCount() { + return tickets.size(); + } + private static List generateLottos(int num) { return IntStream .range(0, num) diff --git a/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java b/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java index 4b3a53e921..3a3e57dce9 100644 --- a/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java +++ b/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java @@ -1,7 +1,5 @@ package lotto.domain.model.impl; -import java.util.List; -import lotto.domain.business.LottoBuy; import lotto.domain.model.*; public class LottoAutoGenerator implements LottoGenerator { @@ -17,14 +15,17 @@ public LottoAutoGenerator(int pay) { } @Override - public LottoBuy generate() { - return new LottoBuy( - new BuyCount(getTotalNumber(pay), 0, getTotalNumber(pay)), - new Manual(List.of()), - new Auto(getTotalNumber(pay)) + public LottoTickets generateTickets() { + return new LottoTickets( + new Auto(getTotalNumber(pay)).autoLottoList().stream().toList() ); } + @Override + public BuyCount getBuyCount() { + return new BuyCount(getTotalNumber(pay), 0, getTotalNumber(pay)); + } + private int getTotalNumber(int pay) { return new Pay(pay).convertToBuyCount(); } diff --git a/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java b/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java index a18c50401d..743c2b8fbc 100644 --- a/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java +++ b/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java @@ -1,7 +1,7 @@ package lotto.domain.model.impl; import java.util.List; -import lotto.domain.business.LottoBuy; +import java.util.stream.Stream; import lotto.domain.model.*; public class LottoCombineGenerator implements LottoGenerator { @@ -23,13 +23,17 @@ public LottoCombineGenerator(int pay, List manualLottoNumbers) { } @Override - public LottoBuy generate() { + public LottoTickets generateTickets() { return - new LottoBuy( - new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), getTotalNumber(pay) - manualLottoNumbers.size()), - new Manual(manualLottoNumbers), - new Auto(getTotalNumber(pay) - manualLottoNumbers.size()) - ); + new LottoTickets(Stream.concat( + new Manual(manualLottoNumbers).manualLottoList().stream(), + new Auto(getTotalNumber(pay) - manualLottoNumbers.size()).autoLottoList().stream() + ).toList()); + } + + @Override + public BuyCount getBuyCount() { + return new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), getTotalNumber(pay) - manualLottoNumbers.size()); } private static int getTotalNumber(int pay) { diff --git a/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java b/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java index 9ca57744fe..9be6111338 100644 --- a/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java +++ b/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java @@ -1,7 +1,6 @@ package lotto.domain.model.impl; import java.util.List; -import lotto.domain.business.LottoBuy; import lotto.domain.model.*; public class LottoManulGenerator implements LottoGenerator { @@ -23,12 +22,13 @@ public LottoManulGenerator(int pay, List manualLottoNumbers) { } @Override - public LottoBuy generate() { - return new LottoBuy( - new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), 0), - new Manual(manualLottoNumbers), - new Auto(0) - ); + public LottoTickets generateTickets() { + return new LottoTickets(manualLottoNumbers); + } + + @Override + public BuyCount getBuyCount() { + return new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), 0); } private static int getTotalNumber(int pay) { diff --git a/src/test/java/lotto/domain/business/LottoBuyTest.java b/src/test/java/lotto/domain/business/LottoBuyTest.java deleted file mode 100644 index 662000c027..0000000000 --- a/src/test/java/lotto/domain/business/LottoBuyTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package lotto.domain.business; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.List; -import lotto.domain.model.LottoGenerator; -import lotto.domain.model.impl.LottoAutoGenerator; -import lotto.domain.model.impl.LottoCombineGenerator; -import lotto.domain.model.impl.LottoManulGenerator; -import org.junit.jupiter.api.Test; - -class LottoBuyTest { - - @Test - void 수동생성에다가_자동생성을_합친_수는_같다() { - LottoGenerator lottoGenerator = new LottoManulGenerator(1000, List.of("1,2,3,4,5,6")); - LottoBuy lottoBuy = lottoGenerator.generate(); - assertThat(lottoBuy.combineLotto().tickets()).hasSize(1); - } - - @Test - void 혼합생성에다가_자동생성을_합친_수는_같다() { - LottoGenerator lottoGenerator = new LottoCombineGenerator(5000, List.of("1,2,3,4,5,6")); - LottoBuy lottoBuy = lottoGenerator.generate(); - assertThat(lottoBuy.combineLotto().tickets()).hasSize(5); - } - - @Test - void 자동생성에다가_자동생성을_합친_수는_같다() { - LottoGenerator lottoGenerator = new LottoAutoGenerator(5000); - LottoBuy lottoBuy = lottoGenerator.generate(); - assertThat(lottoBuy.combineLotto().tickets()).hasSize(5); - } - -} \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java b/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java index fd45ffbe2c..d801b043c5 100644 --- a/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java +++ b/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java @@ -2,8 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; -import lotto.domain.business.LottoBuy; import lotto.domain.model.LottoGenerator; +import lotto.domain.model.LottoTickets; import org.junit.jupiter.api.Test; class LottoAutoGeneratorTest { @@ -11,7 +11,9 @@ class LottoAutoGeneratorTest { @Test void 자동으로_생성한_만큼_보여준다() { LottoGenerator lottoGenerator = new LottoAutoGenerator(5000); - LottoBuy lottoBuy = lottoGenerator.generate(); - assertThat(lottoBuy.combineBuyCount().total()).isEqualTo(5); + + LottoTickets lottoTickets = lottoGenerator.generateTickets(); + assertThat(lottoTickets.getLottoTicketCount()).isEqualTo(5); + assertThat(lottoGenerator.getBuyCount().total()).isEqualTo(5); } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java b/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java index 34dfb45cd4..b3d5353a3c 100644 --- a/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java +++ b/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java @@ -2,8 +2,8 @@ import static org.assertj.core.api.Assertions.assertThat; -import lotto.domain.business.LottoBuy; import lotto.domain.model.LottoGenerator; +import lotto.domain.model.LottoTickets; import org.junit.jupiter.api.Test; class LottoCombineGeneratorTest { @@ -11,16 +11,19 @@ class LottoCombineGeneratorTest { @Test void 수동으로_생성한_만큼_보여준다() { LottoGenerator lottoGenerator = new LottoCombineGenerator(5000, "1,2,3,4,5,6"); - LottoBuy lottoBuy = lottoGenerator.generate(); + LottoTickets lottoTickets = lottoGenerator.generateTickets(); - assertThat(lottoBuy.combineBuyCount().manual()).isEqualTo(1); + assertThat(lottoTickets).isNotNull(); + assertThat(lottoGenerator.getBuyCount().manual()).isEqualTo(1); } @Test void 자동으로_생성한_만큼_보여준다() { LottoGenerator lottoGenerator = new LottoCombineGenerator(5000, "1,2,3,4,5,6"); - LottoBuy lottoBuy = lottoGenerator.generate(); - assertThat(lottoBuy.combineBuyCount().auto()).isEqualTo(4); + LottoTickets lottoTickets = lottoGenerator.generateTickets(); + + assertThat(lottoTickets).isNotNull(); + assertThat(lottoGenerator.getBuyCount().auto()).isEqualTo(4); } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java b/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java index afa360ca14..02dd804d2e 100644 --- a/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java +++ b/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java @@ -3,8 +3,8 @@ import static org.assertj.core.api.Assertions.assertThat; import java.util.List; -import lotto.domain.business.LottoBuy; import lotto.domain.model.LottoGenerator; +import lotto.domain.model.LottoTickets; import org.junit.jupiter.api.Test; class LottoManulGeneratorTest { @@ -12,7 +12,7 @@ class LottoManulGeneratorTest { @Test void 수동으로_생성한_만큼_보여준다() { LottoGenerator lottoGenerator = new LottoManulGenerator(3000, List.of("1,2,3,4,5,6", "1,2,3,4,5,7", "1,2,3,4,5,9")); - LottoBuy lottoBuy = lottoGenerator.generate(); - assertThat(lottoBuy.combineBuyCount().total()).isEqualTo(3); + LottoTickets lottoTickets = lottoGenerator.generateTickets(); + assertThat(lottoTickets.getLottoTicketCount()).isEqualTo(3); } } \ No newline at end of file From 676d1351ef7eaf65fcf221011b1ce0f18771a882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Tue, 9 Dec 2025 22:19:34 +0900 Subject: [PATCH 19/22] =?UTF-8?q?refactor=20:=20LottoManulGenerator=20?= =?UTF-8?q?=EC=97=90=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20pay=20?= =?UTF-8?q?=ED=95=84=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/model/impl/LottoManulGenerator.java | 14 ++++---------- .../domain/model/impl/LottoManulGeneratorTest.java | 2 +- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java b/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java index 9be6111338..d08b60b96d 100644 --- a/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java +++ b/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java @@ -5,19 +5,13 @@ public class LottoManulGenerator implements LottoGenerator { - private final int pay; private final List manualLottoNumbers; - public LottoManulGenerator(int pay, String manualLottoNumbers) { - this(pay, List.of(manualLottoNumbers)); + public LottoManulGenerator(String manualLottoNumbers) { + this(List.of(manualLottoNumbers)); } - public LottoManulGenerator(String pay, List manualLottoNumbers) { - this(Integer.parseInt(pay), manualLottoNumbers); - } - - public LottoManulGenerator(int pay, List manualLottoNumbers) { - this.pay = pay; + public LottoManulGenerator(List manualLottoNumbers) { this.manualLottoNumbers = toLottoList(manualLottoNumbers); } @@ -28,7 +22,7 @@ public LottoTickets generateTickets() { @Override public BuyCount getBuyCount() { - return new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), 0); + return new BuyCount(manualLottoNumbers.size(), manualLottoNumbers.size(), 0); } private static int getTotalNumber(int pay) { diff --git a/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java b/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java index 02dd804d2e..7dfe4ad094 100644 --- a/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java +++ b/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java @@ -11,7 +11,7 @@ class LottoManulGeneratorTest { @Test void 수동으로_생성한_만큼_보여준다() { - LottoGenerator lottoGenerator = new LottoManulGenerator(3000, List.of("1,2,3,4,5,6", "1,2,3,4,5,7", "1,2,3,4,5,9")); + LottoGenerator lottoGenerator = new LottoManulGenerator(List.of("1,2,3,4,5,6", "1,2,3,4,5,7", "1,2,3,4,5,9")); LottoTickets lottoTickets = lottoGenerator.generateTickets(); assertThat(lottoTickets.getLottoTicketCount()).isEqualTo(3); } From 7a06675a652f76a5c469db3e27d54602de6f9738 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Tue, 9 Dec 2025 22:19:47 +0900 Subject: [PATCH 20/22] =?UTF-8?q?docs=20:=20=EA=B0=9C=EB=B0=9C=20=EA=B3=BC?= =?UTF-8?q?=EC=A0=95=20=EB=A9=94=EB=AA=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8e24b6ac41..6bbb269283 100644 --- a/README.md +++ b/README.md @@ -206,7 +206,31 @@ ## 1차 피드백 후 리팩터링 -- [ ] : 로또를 생성하는 부분 인터페이스로 분리해 보는 연습 +- [x] : 로또를 생성하는 부분 인터페이스로 분리해 보는 연습 - [x] : of 메서드를 활용하면 LottoNumber 객체가 재사용되는 것을 보장하지 못함 - `LottoNumber` 객체가 캐싱을 통해 재사용하는 것을 강제할 수 있도록 리팩터링 - - `LottoNumber`와 `LottoNumberCache`를 통합 \ No newline at end of file + - `LottoNumber`와 `LottoNumberCache`를 통합 + +## 2차 피드백 후 리팩터링 + +- [x] : 오히려 복잡해진 인터페이스 분리를 단순화하여서 구현 + - 이유 + - + 1. 이전에는 인터페이스 구현체들은 필드가 모두 같아야한다는 것으로 잘못된 이해를 한점 + + - 그 이유는 인터페이스 이용을 스프링 bean 생성 때만 주로 해봤기 때문 + - + 2. 필드가 같아야한다는 잘못된 이해로 메서드 인자는 모두 같게, 그 내부 로직을 달리해서 구현한 점 + - 이러한 이유 때문에 오히려 인터페이스가 더 복잡해짐 +- [x] : Controller 에서 분기 처리에 따라 인터페이스 구현체 갈아끼우는 것 제거하기 + - 조건문으로 같은 일(모드, 도메인)의 규칙 갈아끼우기에 불과함 +- 이렇게 인터페이스 분리하면 장점 + - 클라이언트 코드가 당장 필요한 구현체로 쉽게 갈아끼울수 있게 변경 + +## 3차 피드백 후 리팩터링 + +- [x] : LottoGenerator 가 LottoBuy 가 아닌 LottoTickets 을 생성하게 하기 +- [x] : LottoGenerator 구현체에서 바로 LottoTickets를 생성하도록 접근하기 +- [x] : LottoManulGenerator 에서 불필요한 pay 제거 + - 자동, 수동, 혼합 간에 필드는 비슷하게 pay, pay + lotto, lotto 각각 상황에 따라 인자가 달라짐 + - 즉 충분히 필드가 다를 수있다. \ No newline at end of file From e6f4e034ae58837768c2f7ae421de32727ffb94b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Sat, 13 Dec 2025 01:27:21 +0900 Subject: [PATCH 21/22] =?UTF-8?q?refactor=20:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20`Manual`,=20'Auto'=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0=ED=95=98=EC=97=AC=20=EA=B3=A7=EB=B0=94?= =?UTF-8?q?=EB=A1=9C=20=EC=83=9D=EC=84=B1=EA=B0=80=EB=8A=A5=ED=95=98?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lotto/controller/LottoApplication.java | 4 +-- src/main/java/lotto/domain/model/Auto.java | 19 -------------- .../lotto/domain/model/LottoGenerator.java | 8 ------ .../LottoAutoGenerator.java | 20 +++++++++++---- .../LottoCombineGenerator.java | 25 +++++++++++++------ .../model/LottoGenertor/LottoGenerator.java | 11 ++++++++ .../LottoManulGenerator.java | 10 +++----- src/main/java/lotto/domain/model/Manual.java | 7 ------ .../java/lotto/domain/model/AutoTest.java | 15 ----------- .../LottoAutoGeneratorTest.java | 3 +-- .../LottoCombineGeneratorTest.java | 3 +-- .../LottoManulGeneratorTest.java | 3 +-- .../java/lotto/domain/model/ManualTest.java | 5 ---- 13 files changed, 53 insertions(+), 80 deletions(-) delete mode 100644 src/main/java/lotto/domain/model/Auto.java delete mode 100644 src/main/java/lotto/domain/model/LottoGenerator.java rename src/main/java/lotto/domain/model/{impl => LottoGenertor}/LottoAutoGenerator.java (52%) rename src/main/java/lotto/domain/model/{impl => LottoGenertor}/LottoCombineGenerator.java (66%) create mode 100644 src/main/java/lotto/domain/model/LottoGenertor/LottoGenerator.java rename src/main/java/lotto/domain/model/{impl => LottoGenertor}/LottoManulGenerator.java (83%) delete mode 100644 src/main/java/lotto/domain/model/Manual.java delete mode 100644 src/test/java/lotto/domain/model/AutoTest.java rename src/test/java/lotto/domain/model/{impl => LottoGenertor}/LottoAutoGeneratorTest.java (87%) rename src/test/java/lotto/domain/model/{impl => LottoGenertor}/LottoCombineGeneratorTest.java (92%) rename src/test/java/lotto/domain/model/{impl => LottoGenertor}/LottoManulGeneratorTest.java (87%) delete mode 100644 src/test/java/lotto/domain/model/ManualTest.java diff --git a/src/main/java/lotto/controller/LottoApplication.java b/src/main/java/lotto/controller/LottoApplication.java index eab79d08ef..beddbc4076 100644 --- a/src/main/java/lotto/controller/LottoApplication.java +++ b/src/main/java/lotto/controller/LottoApplication.java @@ -3,9 +3,9 @@ import java.util.List; import java.util.stream.IntStream; import lotto.domain.business.LottoGame; -import lotto.domain.model.LottoGenerator; +import lotto.domain.model.LottoGenertor.LottoCombineGenerator; +import lotto.domain.model.LottoGenertor.LottoGenerator; import lotto.domain.model.WinningResult; -import lotto.domain.model.impl.LottoCombineGenerator; import lotto.view.InputView; import lotto.view.ResultView; diff --git a/src/main/java/lotto/domain/model/Auto.java b/src/main/java/lotto/domain/model/Auto.java deleted file mode 100644 index eece6a47d2..0000000000 --- a/src/main/java/lotto/domain/model/Auto.java +++ /dev/null @@ -1,19 +0,0 @@ -package lotto.domain.model; - -import java.util.List; -import java.util.stream.IntStream; - -public record Auto(List autoLottoList) { - - public Auto(int autoNumber) { - this(generateLottos(autoNumber)); - } - - private static List generateLottos(int num) { - return IntStream - .range(0, num) - .mapToObj(i -> new Lotto()) - .toList(); - } - -} diff --git a/src/main/java/lotto/domain/model/LottoGenerator.java b/src/main/java/lotto/domain/model/LottoGenerator.java deleted file mode 100644 index 0481730556..0000000000 --- a/src/main/java/lotto/domain/model/LottoGenerator.java +++ /dev/null @@ -1,8 +0,0 @@ -package lotto.domain.model; - -public interface LottoGenerator { - - LottoTickets generateTickets(); - - BuyCount getBuyCount(); -} diff --git a/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java b/src/main/java/lotto/domain/model/LottoGenertor/LottoAutoGenerator.java similarity index 52% rename from src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java rename to src/main/java/lotto/domain/model/LottoGenertor/LottoAutoGenerator.java index 3a3e57dce9..2e3b26eda5 100644 --- a/src/main/java/lotto/domain/model/impl/LottoAutoGenerator.java +++ b/src/main/java/lotto/domain/model/LottoGenertor/LottoAutoGenerator.java @@ -1,6 +1,11 @@ -package lotto.domain.model.impl; +package lotto.domain.model.LottoGenertor; -import lotto.domain.model.*; +import java.util.List; +import java.util.stream.IntStream; +import lotto.domain.model.BuyCount; +import lotto.domain.model.Lotto; +import lotto.domain.model.LottoTickets; +import lotto.domain.model.Pay; public class LottoAutoGenerator implements LottoGenerator { @@ -16,9 +21,14 @@ public LottoAutoGenerator(int pay) { @Override public LottoTickets generateTickets() { - return new LottoTickets( - new Auto(getTotalNumber(pay)).autoLottoList().stream().toList() - ); + return new LottoTickets(generateLottos(getTotalNumber(pay)).stream().toList()); + } + + private List generateLottos(int num) { + return IntStream + .range(0, num) + .mapToObj(i -> new Lotto()) + .toList(); } @Override diff --git a/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java b/src/main/java/lotto/domain/model/LottoGenertor/LottoCombineGenerator.java similarity index 66% rename from src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java rename to src/main/java/lotto/domain/model/LottoGenertor/LottoCombineGenerator.java index 743c2b8fbc..d145c951da 100644 --- a/src/main/java/lotto/domain/model/impl/LottoCombineGenerator.java +++ b/src/main/java/lotto/domain/model/LottoGenertor/LottoCombineGenerator.java @@ -1,8 +1,12 @@ -package lotto.domain.model.impl; +package lotto.domain.model.LottoGenertor; import java.util.List; +import java.util.stream.IntStream; import java.util.stream.Stream; -import lotto.domain.model.*; +import lotto.domain.model.BuyCount; +import lotto.domain.model.Lotto; +import lotto.domain.model.LottoTickets; +import lotto.domain.model.Pay; public class LottoCombineGenerator implements LottoGenerator { @@ -24,10 +28,10 @@ public LottoCombineGenerator(int pay, List manualLottoNumbers) { @Override public LottoTickets generateTickets() { - return - new LottoTickets(Stream.concat( - new Manual(manualLottoNumbers).manualLottoList().stream(), - new Auto(getTotalNumber(pay) - manualLottoNumbers.size()).autoLottoList().stream() + return new LottoTickets(Stream. + concat( + manualLottoNumbers.stream(), + generateLottos(getTotalNumber(pay)).stream() ).toList()); } @@ -36,7 +40,14 @@ public BuyCount getBuyCount() { return new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), getTotalNumber(pay) - manualLottoNumbers.size()); } - private static int getTotalNumber(int pay) { + private List generateLottos(int num) { + return IntStream + .range(0, num) + .mapToObj(i -> new Lotto()) + .toList(); + } + + private int getTotalNumber(int pay) { return new Pay(pay).convertToBuyCount(); } diff --git a/src/main/java/lotto/domain/model/LottoGenertor/LottoGenerator.java b/src/main/java/lotto/domain/model/LottoGenertor/LottoGenerator.java new file mode 100644 index 0000000000..eb5dc7a31a --- /dev/null +++ b/src/main/java/lotto/domain/model/LottoGenertor/LottoGenerator.java @@ -0,0 +1,11 @@ +package lotto.domain.model.LottoGenertor; + +import lotto.domain.model.BuyCount; +import lotto.domain.model.LottoTickets; + +public interface LottoGenerator { + + LottoTickets generateTickets(); + + BuyCount getBuyCount(); +} diff --git a/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java b/src/main/java/lotto/domain/model/LottoGenertor/LottoManulGenerator.java similarity index 83% rename from src/main/java/lotto/domain/model/impl/LottoManulGenerator.java rename to src/main/java/lotto/domain/model/LottoGenertor/LottoManulGenerator.java index d08b60b96d..3cfaec48ae 100644 --- a/src/main/java/lotto/domain/model/impl/LottoManulGenerator.java +++ b/src/main/java/lotto/domain/model/LottoGenertor/LottoManulGenerator.java @@ -1,7 +1,9 @@ -package lotto.domain.model.impl; +package lotto.domain.model.LottoGenertor; import java.util.List; -import lotto.domain.model.*; +import lotto.domain.model.BuyCount; +import lotto.domain.model.Lotto; +import lotto.domain.model.LottoTickets; public class LottoManulGenerator implements LottoGenerator { @@ -25,10 +27,6 @@ public BuyCount getBuyCount() { return new BuyCount(manualLottoNumbers.size(), manualLottoNumbers.size(), 0); } - private static int getTotalNumber(int pay) { - return new Pay(pay).convertToBuyCount(); - } - private static List toLottoList(List lottoNumbers) { return lottoNumbers.stream() .map(Lotto::new) diff --git a/src/main/java/lotto/domain/model/Manual.java b/src/main/java/lotto/domain/model/Manual.java deleted file mode 100644 index c8d32ac8f0..0000000000 --- a/src/main/java/lotto/domain/model/Manual.java +++ /dev/null @@ -1,7 +0,0 @@ -package lotto.domain.model; - -import java.util.List; - -public record Manual(List manualLottoList) { - -} diff --git a/src/test/java/lotto/domain/model/AutoTest.java b/src/test/java/lotto/domain/model/AutoTest.java deleted file mode 100644 index 72057abe62..0000000000 --- a/src/test/java/lotto/domain/model/AutoTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package lotto.domain.model; - -import static org.assertj.core.api.Assertions.assertThat; - -import org.junit.jupiter.api.Test; - -class AutoTest { - - @Test - void 갯수를_입력받으면_로또를_생성한다() { - Auto auto = new Auto(5); - assertThat(auto.autoLottoList()).hasSize(5); - } - -} \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java b/src/test/java/lotto/domain/model/LottoGenertor/LottoAutoGeneratorTest.java similarity index 87% rename from src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java rename to src/test/java/lotto/domain/model/LottoGenertor/LottoAutoGeneratorTest.java index d801b043c5..4caa899cdd 100644 --- a/src/test/java/lotto/domain/model/impl/LottoAutoGeneratorTest.java +++ b/src/test/java/lotto/domain/model/LottoGenertor/LottoAutoGeneratorTest.java @@ -1,8 +1,7 @@ -package lotto.domain.model.impl; +package lotto.domain.model.LottoGenertor; import static org.assertj.core.api.Assertions.assertThat; -import lotto.domain.model.LottoGenerator; import lotto.domain.model.LottoTickets; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java b/src/test/java/lotto/domain/model/LottoGenertor/LottoCombineGeneratorTest.java similarity index 92% rename from src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java rename to src/test/java/lotto/domain/model/LottoGenertor/LottoCombineGeneratorTest.java index b3d5353a3c..ddc6baca0b 100644 --- a/src/test/java/lotto/domain/model/impl/LottoCombineGeneratorTest.java +++ b/src/test/java/lotto/domain/model/LottoGenertor/LottoCombineGeneratorTest.java @@ -1,8 +1,7 @@ -package lotto.domain.model.impl; +package lotto.domain.model.LottoGenertor; import static org.assertj.core.api.Assertions.assertThat; -import lotto.domain.model.LottoGenerator; import lotto.domain.model.LottoTickets; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java b/src/test/java/lotto/domain/model/LottoGenertor/LottoManulGeneratorTest.java similarity index 87% rename from src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java rename to src/test/java/lotto/domain/model/LottoGenertor/LottoManulGeneratorTest.java index 7dfe4ad094..3132f4ff37 100644 --- a/src/test/java/lotto/domain/model/impl/LottoManulGeneratorTest.java +++ b/src/test/java/lotto/domain/model/LottoGenertor/LottoManulGeneratorTest.java @@ -1,9 +1,8 @@ -package lotto.domain.model.impl; +package lotto.domain.model.LottoGenertor; import static org.assertj.core.api.Assertions.assertThat; import java.util.List; -import lotto.domain.model.LottoGenerator; import lotto.domain.model.LottoTickets; import org.junit.jupiter.api.Test; diff --git a/src/test/java/lotto/domain/model/ManualTest.java b/src/test/java/lotto/domain/model/ManualTest.java deleted file mode 100644 index f7d0b4b8af..0000000000 --- a/src/test/java/lotto/domain/model/ManualTest.java +++ /dev/null @@ -1,5 +0,0 @@ -package lotto.domain.model; - -class ManualTest { - -} \ No newline at end of file From 870094c87d26b3e4042a83e5d1b9b1ac762aaf05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E1=84=86=E1=85=A9=E1=84=8C=E1=85=A2=E1=84=8B=E1=85=A7?= =?UTF-8?q?=E1=86=BC?= Date: Sat, 13 Dec 2025 02:45:58 +0900 Subject: [PATCH 22/22] =?UTF-8?q?refactor=20:=20LottoCombineGenerator=20?= =?UTF-8?q?=EC=9D=98=20generateTickets=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=8B=A8=EC=88=9C=20=EC=A1=B0=EB=A6=BD?= =?UTF-8?q?=EC=97=90=EC=84=9C=20composite=20=ED=8C=A8=ED=84=B4=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=ED=95=98=EC=97=AC=20=EC=89=BD=EA=B2=8C=20=ED=96=89?= =?UTF-8?q?=EC=9C=84=EC=9D=98=20=ED=95=A9=EC=84=B1=EC=9D=B4=20=EB=90=98?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++- .../java/lotto/domain/model/BuyCount.java | 15 +++++- .../LottoGenertor/LottoCombineGenerator.java | 51 ++++++++----------- src/main/java/lotto/domain/model/Pay.java | 16 ++++-- .../java/lotto/domain/model/BuyCountTest.java | 12 +++++ src/test/java/lotto/domain/model/PayTest.java | 6 +++ 6 files changed, 75 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 6bbb269283..b9b1aa2013 100644 --- a/README.md +++ b/README.md @@ -233,4 +233,12 @@ - [x] : LottoGenerator 구현체에서 바로 LottoTickets를 생성하도록 접근하기 - [x] : LottoManulGenerator 에서 불필요한 pay 제거 - 자동, 수동, 혼합 간에 필드는 비슷하게 pay, pay + lotto, lotto 각각 상황에 따라 인자가 달라짐 - - 즉 충분히 필드가 다를 수있다. \ No newline at end of file + - 즉 충분히 필드가 다를 수있다. + +## 4차 피드백 후 리팩터링 + +- [x] : 이미 `LottoAutoGenerator`, `LottoManualGenerator` 각각의 구현체가 있는데 굳이 수동 자동관련 `Auto`, `Manual` 객체가 필요한지 고민할 것 + - 고민 : 기존에는 Auto, Manual 이 필요할 수있었다. 그러나 인터페이스 구현체가 그 역할을 대체한다 +- [ ] : composite 패턴을 이용해 part 인 구현체 `LottoAutoGenerator`, `LottoManualGenerator` 를 합친 composite 인 `LottoCombineGenerator` 를 이용한다 + - 그러면 필드도 두개 구현체를 합친 인터페이스의 List로 한다 그리고 기존 생성도 두개를 각각 넣어주는 방식으로 구현한다 + - 즉 여러 LottoGenerator 를 묶어서 두개를 하나처럼 쓸 수 있게 됨 \ No newline at end of file diff --git a/src/main/java/lotto/domain/model/BuyCount.java b/src/main/java/lotto/domain/model/BuyCount.java index 27054e110d..9d8734b53d 100644 --- a/src/main/java/lotto/domain/model/BuyCount.java +++ b/src/main/java/lotto/domain/model/BuyCount.java @@ -6,9 +6,22 @@ public record BuyCount(int total, int manual, int auto) { validate(total, manual, auto); } - void validate(int total, int manual, int auto) { + private void validate(int total, int manual, int auto) { if(total != (manual + auto)) { throw new IllegalArgumentException("지불금액 대비 구매수가 일치하지 않습니다."); } } + + public BuyCount add(BuyCount other) { + return new BuyCount( + this.total + other.total, + this.manual + other.manual, + this.auto + other.auto + ); + } + + public static BuyCount empty() { + return new BuyCount(0, 0, 0); + } + } diff --git a/src/main/java/lotto/domain/model/LottoGenertor/LottoCombineGenerator.java b/src/main/java/lotto/domain/model/LottoGenertor/LottoCombineGenerator.java index d145c951da..867eae66da 100644 --- a/src/main/java/lotto/domain/model/LottoGenertor/LottoCombineGenerator.java +++ b/src/main/java/lotto/domain/model/LottoGenertor/LottoCombineGenerator.java @@ -1,17 +1,14 @@ package lotto.domain.model.LottoGenertor; import java.util.List; -import java.util.stream.IntStream; import java.util.stream.Stream; import lotto.domain.model.BuyCount; -import lotto.domain.model.Lotto; import lotto.domain.model.LottoTickets; import lotto.domain.model.Pay; public class LottoCombineGenerator implements LottoGenerator { - private final int pay; - private final List manualLottoNumbers; + private final List generators; public LottoCombineGenerator(int pay, String manualLottoNumbers) { this(pay, List.of(manualLottoNumbers)); @@ -22,38 +19,34 @@ public LottoCombineGenerator(String pay, List manualLottoNumbers) { } public LottoCombineGenerator(int pay, List manualLottoNumbers) { - this.pay = pay; - this.manualLottoNumbers = toLottoList(manualLottoNumbers); + this(toLottosGenerators(pay, manualLottoNumbers)); } - @Override - public LottoTickets generateTickets() { - return new LottoTickets(Stream. - concat( - manualLottoNumbers.stream(), - generateLottos(getTotalNumber(pay)).stream() - ).toList()); + public LottoCombineGenerator(List generators) { + this.generators = generators; } @Override - public BuyCount getBuyCount() { - return new BuyCount(getTotalNumber(pay), manualLottoNumbers.size(), getTotalNumber(pay) - manualLottoNumbers.size()); - } - - private List generateLottos(int num) { - return IntStream - .range(0, num) - .mapToObj(i -> new Lotto()) + public LottoTickets generateTickets() { + return new LottoTickets(generators. + stream() + .map(LottoGenerator::generateTickets) + .flatMap(t -> t.tickets().stream()) + .toList()); + } + + private static List toLottosGenerators(int pay, List manualLottoNumbers) { + int remainPay = new Pay(pay).calculateRemainingPayment(manualLottoNumbers.size()); + return Stream.of( + new LottoManulGenerator(manualLottoNumbers), + new LottoAutoGenerator(remainPay)) .toList(); } - private int getTotalNumber(int pay) { - return new Pay(pay).convertToBuyCount(); - } - - private static List toLottoList(List lottoNumbers) { - return lottoNumbers.stream() - .map(Lotto::new) - .toList(); + @Override + public BuyCount getBuyCount() { + return generators.stream() + .map(LottoGenerator::getBuyCount) + .reduce(BuyCount.empty(), BuyCount::add); } } diff --git a/src/main/java/lotto/domain/model/Pay.java b/src/main/java/lotto/domain/model/Pay.java index db85a3040c..1bc19d308e 100644 --- a/src/main/java/lotto/domain/model/Pay.java +++ b/src/main/java/lotto/domain/model/Pay.java @@ -1,6 +1,6 @@ package lotto.domain.model; -public record Pay(int pay) { +public record Pay(int value) { public static final int LOTTO_PRICE = 1000; @@ -9,12 +9,20 @@ public Pay(String pay) { } public Pay { - validate(pay); - positiveValidate(pay); + validate(value); + positiveValidate(value); } public int convertToBuyCount() { - return this.pay / LOTTO_PRICE; + return this.value / LOTTO_PRICE; + } + + public int calculateRemainingPayment(int count) { + int remainPay = (convertToBuyCount() - count) * LOTTO_PRICE; + if(remainPay < 0) { + positiveValidate(remainPay); + } + return remainPay; } private static void validate(int pay) { diff --git a/src/test/java/lotto/domain/model/BuyCountTest.java b/src/test/java/lotto/domain/model/BuyCountTest.java index 3fe8ea9635..4bf556231b 100644 --- a/src/test/java/lotto/domain/model/BuyCountTest.java +++ b/src/test/java/lotto/domain/model/BuyCountTest.java @@ -1,5 +1,6 @@ package lotto.domain.model; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import org.junit.jupiter.api.Test; @@ -15,4 +16,15 @@ class BuyCountTest { .hasMessage("지불금액 대비 구매수가 일치하지 않습니다."); } + + @Test + void 구매갯수를_누적해서_만든다() { + BuyCount buyCountBase = BuyCount.empty(); + BuyCount buyCountFirstAdd = buyCountBase.add(new BuyCount(5, 3, 2)); + BuyCount buyCountSecondAdd = buyCountFirstAdd.add(new BuyCount(15, 5, 10)); + + BuyCount expected = new BuyCount(20, 8, 12); + assertThat(buyCountSecondAdd).isEqualTo(expected); + + } } \ No newline at end of file diff --git a/src/test/java/lotto/domain/model/PayTest.java b/src/test/java/lotto/domain/model/PayTest.java index edff53c913..b127c94d68 100644 --- a/src/test/java/lotto/domain/model/PayTest.java +++ b/src/test/java/lotto/domain/model/PayTest.java @@ -29,4 +29,10 @@ class PayTest { ).isInstanceOf(IllegalArgumentException.class) .hasMessage("금액은 양수로 입력하시오"); } + + @Test + void 수동_3개_구매후_남은_금액계산은_3000원_빠진다() { + Pay pay = new Pay(10000); + assertThat(pay.calculateRemainingPayment(3)).isEqualTo(7000); + } } \ No newline at end of file