Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
b4287d6
Merge pull request #5 from babysean/미션_3-로또게임_2등
babysean Jun 27, 2024
d6529c2
chore: 수동 로또 번호 구매 로직 추가
babysean Jun 27, 2024
02dde32
test: 테스트 코드 추가
babysean Jun 27, 2024
e25d0e0
test: 테스트 코드 오타 수정
babysean Jun 27, 2024
9dc4cce
refactor: 코드 컨벤션에 맞추어 format 변경
babysean Jun 28, 2024
f0e2d5c
chore: 로또 티켓 합치기
babysean Jul 1, 2024
2338e36
test: 로또 티켓 개수 확인 테스트 코드 수정
babysean Jul 1, 2024
5dbd0e7
refactor: 클래스 이름 변경
babysean Jul 1, 2024
c6429fb
refactor: 메서드 이름 변경
babysean Jul 1, 2024
6576481
refactor: 클래스 생성 구문 위치 변경
babysean Jul 1, 2024
e94b114
refactor: 로또 번호 생성 주체 변경
babysean Jul 1, 2024
2a6e1b6
refactor: 주석 및 줄바꿈 제거
babysean Jul 1, 2024
e3c822c
refactor: 수동 로또 티켓 구매 프로세스 수정
babysean Jul 1, 2024
ab04122
test: LottoService 테스트 코드 추가
babysean Jul 1, 2024
0471dfb
test: LottoCalculator 테스트 코드 수정
babysean Jul 11, 2024
442c41c
chore: 수동 로또 개수 final 선언
babysean Jul 11, 2024
d3d0aba
chore: 수동 로또 개수 final 키워드 제거
babysean Jul 15, 2024
167e34a
refactor: LottoGenerator 파일명 변경
babysean Jul 15, 2024
37aa7fb
chore: LottoTicketGenerator 의존성 해결
babysean Jul 15, 2024
51a569e
refactor: 상수 관리 대상 변경
babysean Jul 15, 2024
eb6d329
refactor: 전략 패턴 적용
babysean Jul 15, 2024
a913957
test: 테스트 코드 작성
babysean Jul 15, 2024
6d38f29
test: 테스트 코드 수정
babysean Jul 15, 2024
032c611
refactor: javadoc 수정
babysean Jul 15, 2024
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
28 changes: 19 additions & 9 deletions src/main/java/lotto/LottoApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import lotto.domain.LottoConsumer;
import lotto.domain.LottoPrize;
import lotto.domain.LottoTicket;
import lotto.domain.purchaseStrategy.AutoStrategy;
import lotto.domain.purchaseStrategy.ManualStrategy;
import lotto.dto.LottoPurchaseDto;
import lotto.factory.LottoApplicationFactory;
import lotto.service.LottoService;
import lotto.view.InputView;
Expand All @@ -24,24 +27,31 @@ public LottoApplication(InputView inputView, OutputView outputView, LottoService
}

public void run() {
LottoConsumer consumer = new LottoConsumer();

// 로또 구매 금액 입력
int money = inputView.insertMoney();

// 수동 구매 로또 수 입력
int manuallyPurchasedLottoTicketCount = inputView.inputManuallyPurchasedLottoTicketCount();

LottoConsumer consumer = new LottoConsumer();
// 수동 로또 번호 입력
List<String[]> manuallyPurchasedLottoNumbers = inputView.inputManuallyPurchasedLottoTicketNumbers(manuallyPurchasedLottoTicketCount);

// 구매 정보 DTO
LottoPurchaseDto purchaseDto = new LottoPurchaseDto(money, manuallyPurchasedLottoNumbers);

// 수동 구매로 전략 변경
lottoService.setPurchaseStrategy(new ManualStrategy());

if (manuallyPurchasedLottoTicketCount > 0) {
// 수동 로또 번호 입력
List<String[]> manuallyPurchasedLottoNumbers = inputView.inputManuallyPurchasedLottoTicketNumbers(manuallyPurchasedLottoTicketCount);
// 수동 로또 티켓 구매
lottoService.buyLottoTicket(consumer, purchaseDto);

// 수동 로또 티켓 구매
lottoService.buyManualLotto(consumer, manuallyPurchasedLottoNumbers);
}
// 자동 구매로 전략 변경
lottoService.setPurchaseStrategy(new AutoStrategy());

// 자동 티켓 구매
lottoService.buyLotto(consumer, money);
// 자동 로또 티켓 구매
lottoService.buyLottoTicket(consumer, purchaseDto);

// 로또 구매 정보 출력
outputView.printLottoTicketsInformation(consumer);
Expand Down
53 changes: 23 additions & 30 deletions src/main/java/lotto/domain/LottoConsumer.java
Original file line number Diff line number Diff line change
@@ -1,56 +1,49 @@
package lotto.domain;

import static lotto.domain.LottoTicket.LOTTO_PRICE;

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

public class LottoConsumer {

/** 구매한 로또 티켓 목록 */
private final List<LottoTicket> lottoTickets;
/** 자동 로또 티켓 목록 */
private final List<LottoTicket> lottoTicketsByAuto;

/** 수동 로또 구매 개수 */
private int manualLottoCount = 0;
/** 수동 로또 티켓 목록 */
private final List<LottoTicket> lottoTicketsByManual;

public LottoConsumer() {
this.lottoTickets = new ArrayList<>();
this.lottoTicketsByAuto = new ArrayList<>();
this.lottoTicketsByManual = new ArrayList<>();
}

/**
* 자동 로또 티켓을 구매합니다.
* 자동 로또 티켓을 추가합니다.
*
* @param money 구매할 금액
* @param lottoTickets 로또 티켓 목록
*/
public void buyLotto(int money, LottoTicketGenerator generator) {
int purchasedCount = money / LOTTO_PRICE;
int autoPurchasedCount = purchasedCount - manualLottoCount;

for (int i = 0 ; i < autoPurchasedCount ; i++) {
lottoTickets.add(generator.autoGenerate());
}
public void addAutoLottoTickets(List<LottoTicket> lottoTickets) {
this.lottoTicketsByAuto.addAll(lottoTickets);
}

/**
* 수동 로또 티켓을 구매합니다.
* 수동 로또 티켓을 추가합니다.
*
* @param lottoNumbers 수동 로또 티켓 목록
* @param lottoTickets 로또 티켓 목록
*/
public void buyManualLotto(List<String[]> lottoNumbers, LottoTicketGenerator generator) {
for (String[] lottoNumber : lottoNumbers) {
lottoTickets.add(generator.manualGenerate(lottoNumber));
}

// 수동 로또 티켓 수 저장
manualLottoCount = lottoNumbers.size();
public void addManualLottoTickets(List<LottoTicket> lottoTickets) {
this.lottoTicketsByManual.addAll(lottoTickets);
}

/**
* 구매한 로또 티켓 목록을 반환 합니다.
* 전체 로또 티켓 목록을 반환 합니다.
*
* @return List<LottoTicket>
*/
public List<LottoTicket> getLottoTickets() {
List<LottoTicket> lottoTickets = new ArrayList<>();
lottoTickets.addAll(lottoTicketsByAuto);
lottoTickets.addAll(lottoTicketsByManual);

return lottoTickets;
}

Expand All @@ -59,16 +52,16 @@ public List<LottoTicket> getLottoTickets() {
*
* @return int
*/
public int getAutoLottoTicketCount() {
return lottoTickets.size() - manualLottoCount;
public int getAutoTicketCount() {
return lottoTicketsByAuto.size();
}

/**
* 수동 로또 티켓 개수를 반환합니다.
*
* @return int
*/
public int getManualLottoTicketCount() {
return manualLottoCount;
public int getManualTicketCount() {
return lottoTicketsByManual.size();
}
}
28 changes: 28 additions & 0 deletions src/main/java/lotto/domain/purchaseStrategy/AutoStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package lotto.domain.purchaseStrategy;

import static lotto.domain.LottoTicket.LOTTO_PRICE;

import java.util.ArrayList;
import java.util.List;
import lotto.domain.LottoConsumer;
import lotto.domain.LottoTicket;
import lotto.domain.LottoTicketGenerator;
import lotto.dto.LottoPurchaseDto;

public class AutoStrategy implements PurchaseStrategy {

@Override
public void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto purchaseDto, LottoTicketGenerator generator) {
List<LottoTicket> lottoTickets = new ArrayList<>();

int purchasedCount = purchaseDto.getMoney() / LOTTO_PRICE;
int autoPurchasedCount = purchasedCount - consumer.getManualTicketCount();

for (int i = 0 ; i < autoPurchasedCount ; i++) {
lottoTickets.add(generator.autoGenerate());
}

// 로또 티켓 추가
consumer.addAutoLottoTickets(lottoTickets);
}
}
23 changes: 23 additions & 0 deletions src/main/java/lotto/domain/purchaseStrategy/ManualStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package lotto.domain.purchaseStrategy;

import java.util.ArrayList;
import java.util.List;
import lotto.domain.LottoConsumer;
import lotto.domain.LottoTicket;
import lotto.domain.LottoTicketGenerator;
import lotto.dto.LottoPurchaseDto;

public class ManualStrategy implements PurchaseStrategy {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

어쩌피 lottoTicketGenerator는 항상 써야 하니까 필수 파라미터로 두고 메서드에서는 제거 할거 같네요.

public class ManualStrategy implements PurchaseStrategy {
    
    private final LottoTicketGenerator lottoTicketGenerator;

    public ManualStrategy(LottoTicketGenerator lottoTicketGenerator) {
        this.lottoTicketGenerator = lottoTicketGenerator;
    }

    @Override
    public void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto purchaseDto) {
        List<LottoTicket> lottoTickets = new ArrayList<>();

        for (String[] lottoNumber : purchaseDto.getLottoNumbers()) {
            lottoTickets.add(lottoTicketGenerator.manualGenerate(lottoNumber));
        }

        // 로또 티켓 추가
        consumer.addManualLottoTickets(lottoTickets);
    }
}


@Override
public void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto purchaseDto, LottoTicketGenerator generator) {
List<LottoTicket> lottoTickets = new ArrayList<>();

for (String[] lottoNumber : purchaseDto.getLottoNumbers()) {
lottoTickets.add(generator.manualGenerate(lottoNumber));
}

// 로또 티켓 추가
consumer.addManualLottoTickets(lottoTickets);
}
}
10 changes: 10 additions & 0 deletions src/main/java/lotto/domain/purchaseStrategy/PurchaseStrategy.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package lotto.domain.purchaseStrategy;

import lotto.domain.LottoConsumer;
import lotto.domain.LottoTicketGenerator;
import lotto.dto.LottoPurchaseDto;

public interface PurchaseStrategy {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

오호... 구매행위에 대한 전략을 취하셨군요!

사실 의도한건 로또번호에 대한 전략을 말한거긴 한데 좋습니다


void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto purchaseDto, LottoTicketGenerator generator);
}
27 changes: 27 additions & 0 deletions src/main/java/lotto/dto/LottoPurchaseDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package lotto.dto;

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

public class LottoPurchaseDto {

private final int money;

private final List<String[]> lottoNumbers;

public LottoPurchaseDto(int money, List<String[]> lottoNumbers) {
this.money = money;
this.lottoNumbers = new ArrayList<>();
if (lottoNumbers != null) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

디폴트 변수를 못넣는 자바의 숙명 ㅠㅠ

this.lottoNumbers.addAll(lottoNumbers);
}
}

public int getMoney() {
return money;
}

public List<String[]> getLottoNumbers() {
return lottoNumbers;
}
}
24 changes: 13 additions & 11 deletions src/main/java/lotto/service/LottoService.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
import lotto.domain.LottoPrize;
import lotto.domain.LottoTicket;
import lotto.domain.LottoTicketGenerator;
import lotto.domain.purchaseStrategy.PurchaseStrategy;
import lotto.dto.LottoPurchaseDto;
import lotto.view.OutputView;

public class LottoService {
Expand All @@ -18,29 +20,29 @@ public class LottoService {
/** 로또 번호 생성기 */
private final LottoTicketGenerator generator;

/** 로또 구매 전략 */
private PurchaseStrategy strategy;

public LottoService(LottoCalculator calculator, LottoTicketGenerator generator) {
this.calculator = calculator;
this.generator = generator;
}

/**
* 로또 티켓을 구매합니다.
*
* @param consumer 로또 구매자 객체
* @param money 구매 금액
* 구매 전략 세팅
*/
public void buyLotto(LottoConsumer consumer, int money) {
consumer.buyLotto(money, generator);
public void setPurchaseStrategy(PurchaseStrategy strategy) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

조금 위험한 코드네요
LottoSerivce를 사용자마다 만들지 않으면 해당 부분은 쓰레드 세이프 하지 않은 코드가 될꺼 같아요
차라리 사용하는 메서드에서 아래와 같이 하는 편이 좋을꺼 같아요

public void buyLottoTicket(/*PurchaseStrategy strategy*/ LottoConsumer consumer, LottoPurchaseDto dto) {

this.strategy = strategy;
}

/**
* 수동 로또 티켓을 구매합니다.
* 로또 티켓을 구매합니다.
*
* @param consumer LottoConsumer
* @param lottoNumbers 로또 번호 목록
* @param consumer 구매자
* @param dto 구매정보 DTO
*/
public void buyManualLotto(LottoConsumer consumer, List<String[]> lottoNumbers) {
consumer.buyManualLotto(lottoNumbers, generator);
public void buyLottoTicket(LottoConsumer consumer, LottoPurchaseDto dto) {
strategy.buyLottoTicket(consumer, dto, generator);
}

/**
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/lotto/view/InputView.java
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ public int inputManuallyPurchasedLottoTicketCount() {
* @return List<String [ ]>
*/
public List<String[]> inputManuallyPurchasedLottoTicketNumbers(int purchasedCount) {
if (purchasedCount < 1) {
return null;
}

List<String[]> numbers = new ArrayList<>();

System.out.println("수동으로 구매할 번호를 입력해 주세요.");
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/lotto/view/OutputView.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class OutputView {
* @param consumer 로또 구매자
*/
public void printLottoTicketsInformation(LottoConsumer consumer) {
System.out.println("수동으로 " + consumer.getManualLottoTicketCount() + "개, 자동으로 " + consumer.getAutoLottoTicketCount() + "를 구매했습니다.");
System.out.println("수동으로 " + consumer.getManualTicketCount() + "개, 자동으로 " + consumer.getAutoTicketCount() + "를 구매했습니다.");

for (LottoTicket lottoTicket : consumer.getLottoTickets()) {
System.out.println(lottoTicket.get());
Expand Down