Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions src/main/java/lotto/LottoMain.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,23 @@
import lotto.view.InputView;
import lotto.view.ResultView;

import java.util.List;

public class LottoMain {
public static void main(String[] args) {
Money money = new Money(InputView.getInputMoney());

LottoGroup lottoGroup = new LottoGroup(money);
int inputManualLottoCount = InputView.getInputManualLottoCount();

LottoCount lottoCount = new LottoCount(money, inputManualLottoCount);

LottoPurChase lottoPurChase = new LottoPurChase(money, lottoCount);

List<Lotto> manualLottos = InputView.getInputManualLottos(inputManualLottoCount);

LottoGroup lottoGroup = new LottoGroup(new MixedLottoGenerator(lottoPurChase, manualLottos));

ResultView.showBuyLottos(lottoGroup);
ResultView.showBuyLottos(lottoGroup, lottoPurChase);

Lotto winLotto = new Lotto(InputView.getInputWinNumber());

Expand Down
29 changes: 29 additions & 0 deletions src/main/java/lotto/domain/AutoLottoGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package lotto.domain;

import java.util.ArrayList;
import java.util.List;

public class AutoLottoGenerator implements LottoGenerator {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

private final Money money;

public AutoLottoGenerator(int number) {
this(new Money(number));
}

public AutoLottoGenerator(Money money) {
this.money = money;
}

@Override
public List<Lotto> generate() {
int cnt = money.getBuyableCount();

List<Lotto> lottoArray = new ArrayList<>();

for (int i = 0; i < cnt; i++) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
int cnt = money.getBuyableCount();
List<Lotto> lottoArray = new ArrayList<>();
for (int i = 0; i < cnt; i++) {
List<Lotto> lottoArray = new ArrayList<>();
for (int i = 0; i < money.getBuyableCount(); i++) {

저는 굳이 불필요한 로컬 변수 사용하지 않는 방식을 선호함
한번 고려해 보면 어떨까?

lottoArray.add(new Lotto(LottoMachine.createLottoNumbers()));
}

return lottoArray;
}
}
28 changes: 19 additions & 9 deletions src/main/java/lotto/domain/Lotto.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
package lotto.domain;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;

public class Lotto {
private final List<LottoNumber> numbers;
private final Set<LottoNumber> numbers;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍


public Lotto(int... numbers) {
this(intToList(numbers));
Expand All @@ -15,20 +14,31 @@ public Lotto(String... numbers) {
this(stringToList(numbers));
}

public Lotto(List<LottoNumber> numbers) {
public Lotto(String numbers) {
this(stringToList(numbers.split(",")));
}

public Lotto(Set<LottoNumber> numbers) {
validation(numbers);
this.numbers = numbers;
}

private static List<LottoNumber> stringToList(String... numbers) {
private void validation(Set<LottoNumber> numbers) {
if (numbers.size() != 6) {
throw new IllegalArgumentException("로또 번호는 6개여야 합니다.");
}
}

private static Set<LottoNumber> stringToList(String... numbers) {
return Arrays.stream(numbers)
.map(LottoNumber::valueOf)
.toList();
.collect(Collectors.toSet());
}

private static List<LottoNumber> intToList(int... numbers) {
private static Set<LottoNumber> intToList(int... numbers) {
return Arrays.stream(numbers)
.mapToObj(LottoNumber::valueOf)
.toList();
.collect(Collectors.toSet());
}

public int countMatchedNumbers(Lotto winningLotto) {
Expand Down
23 changes: 23 additions & 0 deletions src/main/java/lotto/domain/LottoCount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package lotto.domain;

public class LottoCount {
private final int manualCount;
private final int autoCount;

public LottoCount(Money money, int manualCount) {
this(money.getBuyableCount() - manualCount, manualCount);
}

public LottoCount(int autoCount, int manualCount) {
this.autoCount = autoCount;
this.manualCount = manualCount;
}

public int getManualCount() {
return this.manualCount;
}

public int getAutoCount() {
return this.autoCount;
}
}
7 changes: 7 additions & 0 deletions src/main/java/lotto/domain/LottoGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package lotto.domain;

import java.util.List;

public interface LottoGenerator {
List<Lotto> generate();
}
15 changes: 2 additions & 13 deletions src/main/java/lotto/domain/LottoGroup.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,13 @@
public class LottoGroup {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LottoGroup이 구매한 로또와 관련한 로직을 구현하는 책임과 로또 생성하는 책임을 가지는 것으로 보여진다.
기능이 추가되면서 로또 생성하는 책임의 비율이 높아지고 있는데 로또 생성에 대한 책임을 다른 객체로 분리하는 것은 어떨까?

3단계에서 4단계로 요구사항이 변경될 때 로또를 생성하는 부분의 요구사항만 변경됐다.
로또를 생성하는 부분을 다음과 같은 구조의 인터페이스로 분리해 보는 연습을 해보면 어떨까?
이와 같이 인터페이스로 구현했을 때의 잇점에 대해 고민해 보는 시간을 가져본다.

public interface LottosGenerator {
    Lottos generate();
}

private final List<Lotto> lottos;

public LottoGroup(Money money) {
this(buyLotto(money));
public LottoGroup(LottoGenerator lottoGenerator) {
this(lottoGenerator.generate());
}

public LottoGroup(List<Lotto> lottos) {
this.lottos = lottos;
}
private static List<Lotto> buyLotto(Money money) {
int cnt = money.getBuyableCount();

List<Lotto> lottoArray = new ArrayList<>();

for(int i = 0; i < cnt; i++) {
lottoArray.add(new Lotto(LottoMachine.createLottoNumbers()));
}

return lottoArray;
}

public List<Lotto> getLottoNumbers() {
return lottos;
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/lotto/domain/LottoMachine.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class LottoMachine {

public static int[] createLottoNumbers() {
List<Integer> nums = new ArrayList<>();
for(int i = MIN_NUMBER; i <= MAX_NUMBER; i++){
for (int i = MIN_NUMBER; i <= MAX_NUMBER; i++) {
nums.add(i);
}

Expand All @@ -22,7 +22,7 @@ public static int[] createLottoNumbers() {

private static int[] selectLottoNumbers(List<Integer> lottoNumbers) {
int[] nums = new int[COUNT];
for(int i = 0; i < COUNT; i++){
for (int i = 0; i < COUNT; i++) {
nums[i] = lottoNumbers.get(i);
}
return nums;
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/lotto/domain/LottoNumber.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ public class LottoNumber {
private static final int MAX = 45;
private static final Map<Integer, LottoNumber> CACHE_NUM = new HashMap<>();

static{
for (int i = MIN; i <= MAX; i++){
static {
for (int i = MIN; i <= MAX; i++) {
CACHE_NUM.put(i, new LottoNumber(i));
}
}
Expand All @@ -22,12 +22,12 @@ public LottoNumber(int number) {
this.number = number;
}

public static LottoNumber valueOf(String number){
public static LottoNumber valueOf(String number) {
validation(Integer.parseInt(number));
return CACHE_NUM.get(Integer.parseInt(number));
return valueOf(Integer.parseInt(number));
}

public static LottoNumber valueOf(int number){
public static LottoNumber valueOf(int number) {
validation(number);
return CACHE_NUM.get(number);
}
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/lotto/domain/LottoPurChase.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package lotto.domain;

public class LottoPurChase {
private final Money money;
private final LottoCount lottoCount;


public LottoPurChase(int money, int autoCount, int manualCount) {
this(new Money(money), new LottoCount(autoCount, manualCount));
}

public LottoPurChase(Money money, LottoCount lottoCount) {
this.money = money;
this.lottoCount = lottoCount;
}

public Money getMoney() {
return this.money;
}

public int getAutoCount() {
return this.lottoCount.getAutoCount();
}

public int getManualCount() {
return this.lottoCount.getManualCount();
}
}
5 changes: 3 additions & 2 deletions src/main/java/lotto/domain/LottoResult.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ public class LottoResult {
public LottoResult() {
this(initResult());
}
public LottoResult(Map<LottoRank, Integer> result) {

public LottoResult(Map<LottoRank, Integer> result) {
this.result = result;
}

Expand All @@ -36,7 +37,7 @@ private static Map<LottoRank, Integer> initResult() {
}

public void rank(LottoRank rank) {
if(rank.isAddAble()) {
if (rank.isAddAble()) {
result.put(rank, result.get(rank) + 1);
}
}
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/lotto/domain/LottoWinningNumbers.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ public class LottoWinningNumbers {
private final Lotto winningLotto;
private final LottoNumber bonusNumber;

public LottoWinningNumbers(Lotto winningLotto, int bonusNumber) {
this(winningLotto, new LottoNumber(bonusNumber));
}

public LottoWinningNumbers(Lotto winningLotto, LottoNumber bonusNumber) {
this.winningLotto = winningLotto;
this.bonusNumber = bonusNumber;
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/lotto/domain/MixedLottoGenerator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package lotto.domain;

import java.util.ArrayList;
import java.util.List;

public class MixedLottoGenerator implements LottoGenerator {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수동과 자동 로또를 생성하는 구현체를 만들고 아래와 같은 구현체를 통해 구현체를 통합할 수 있음.
보통 디자인 패턴에서 컴포지트 패턴으로 알려져 있음.
아래와 같은 객체 추가에 따른 효과를 느껴 봤으면 하는 바람으로 피드백 남겨봄.

public class LottosBundleGenerator implements LottosGenerator {
    private final Money money;
    private final List<String> manualLottoText;

    public LottosBundleGenerator(Money money, List<String> manualLottoText) {
        this.money = money;
        this.manualLottoText = manualLottoText;
    }

    @Override
    public Lottos generate() {
        // ManualLottosGenerator 활용해 수동 로또 생성
        // AutoLottosGenerator 활용해 자동 로또 생성(수동 로또 수 만큼 Money 차감)
        return  로또를 합쳐서 반환;
    }
}

인터페이스 기반으로 구현할 경우 자동 로또만 구매하는 기능을 지원하다 수동 로또를 생성하는 기능이 추가될 경우 다른 부분의 영향을 주지 않으면서 기능을 확장할 수 있다는 것이 가장 큰 강점일 것 같아요.

private final LottoPurChase lottoPurchase;
private final List<Lotto> manualLottos;

public MixedLottoGenerator(LottoPurChase lottoPurchase, List<Lotto> manualLottos) {
this.lottoPurchase = lottoPurchase;
this.manualLottos = manualLottos;
}

@Override
public List<Lotto> generate() {
List<Lotto> lottoArray = new ArrayList<>(manualLottos);

for (int i = 0; i < lottoPurchase.getAutoCount(); i++) {
lottoArray.add(new Lotto(LottoMachine.createLottoNumbers()));
}

return lottoArray;
}
}
18 changes: 18 additions & 0 deletions src/main/java/lotto/view/InputView.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import lotto.domain.Lotto;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class InputView {
Expand All @@ -12,6 +14,22 @@ public static int getInputMoney() {
return Integer.parseInt(scanner.nextLine());
}

public static int getInputManualLottoCount() {
System.out.println("수동으로 구매할 로또 수를 입력해 주세요.");
return Integer.parseInt(scanner.nextLine());
}

public static List<Lotto> getInputManualLottos(int manualLottoCount) {
System.out.println("수동으로 구매할 번호를 입력해 주세요.");

List<Lotto> manualLottos = new ArrayList<>();
for (int i = 0; i < manualLottoCount; i++) {
manualLottos.add(new Lotto(parse(scanner.nextLine())));
}

return manualLottos;
}

public static String[] getInputWinNumber() {
System.out.println("지난 주 당첨 번호를 입력해 주세요.");

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/lotto/view/ResultView.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

public class ResultView {

public static void showBuyLottos(LottoGroup lottoGroup) {
System.out.printf("%d개를 구매했습니다.%n", lottoGroup.getLottoNumbers().size());
public static void showBuyLottos(LottoGroup lottoGroup, LottoPurChase lottoPurchase) {
System.out.printf("수동으로 %d장, 자동으로 %d개를 구매했습니다.%n", lottoPurchase.getManualCount(), lottoPurchase.getAutoCount());

for (Lotto lotto : lottoGroup.getLottoNumbers()) {
System.out.println(lotto);
Expand Down
14 changes: 14 additions & 0 deletions src/test/java/lotto/domain/LottoCountTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package lotto.domain;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;

public class LottoCountTest {

@Test
void 수동_자동_카운트해서_생성() {
LottoCount lottoCount = new LottoCount(11, 3);

Assertions.assertThat(lottoCount.getAutoCount()).isEqualTo(11);
}
}
28 changes: 28 additions & 0 deletions src/test/java/lotto/domain/LottoGeneratorTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package lotto.domain;

import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;

public class LottoGeneratorTest {

@Test
@DisplayName("돈을 입력하여 자동으로 몇장 살 수 있는지")
void AutoGenerator() {
LottoGenerator autoLottoGenerator = new AutoLottoGenerator(14000);

Assertions.assertThat(autoLottoGenerator.generate()).hasSize(14);
}

@Test
@DisplayName("돈을 입력하여 자동과 수동으로 몇장 살 수 있는지")
void mixGenerator() {
LottoGenerator mixedLottoGenerator = new MixedLottoGenerator(
new LottoPurChase(3000, 2, 1), List.of(new Lotto(1,2,3,4,5,6))
);

Assertions.assertThat(mixedLottoGenerator.generate()).hasSize(3);
}
}
2 changes: 1 addition & 1 deletion src/test/java/lotto/domain/LottoGroupTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
public class LottoGroupTest {
@Test
void 로또_몇장_구매할_수_있는지() {
LottoGroup lottoGroup = new LottoGroup(new Money(14000));
LottoGroup lottoGroup = new LottoGroup(new AutoLottoGenerator(new Money(14000)));

assertThat(lottoGroup.getLottoNumbers()).hasSize(14);
}
Expand Down
Loading