Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Lee, Nathan] 로또 2단계 - 보너스 번호 추가 #41

Open
wants to merge 19 commits into
base: nathan29849
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
97da692
[step2] 시작
nathan29849 Feb 23, 2022
edf45b6
[step2] Enum 클래스 이름 변경(Rank) 및 switch문 Enum 클래스 내부로 이동
nathan29849 Feb 23, 2022
c59c7d5
[step2] makeAutoTicket(), makeManualTicket 분리해 수동 추첨 구현
street62 Feb 23, 2022
f438af0
[step2] 보너스 볼 기능 추가
nathan29849 Feb 23, 2022
cedce92
[step2] recactoring : 당첨 티켓과 현재 로또 티켓을 비교하는 기능을 TicketOffice에서 LottoT…
nathan29849 Feb 23, 2022
0a0f20d
[step2] 로또 자동/수동 입력 오류 수정
street62 Feb 23, 2022
2be4b31
[step2] TicketOffice 클래스 자동/수동 설정 리팩토링
street62 Feb 23, 2022
00a3220
[step2] TicketOffice.checkBonusNumber() -> LottoTicket.checkBonusNumb…
nathan29849 Feb 23, 2022
7162394
[step2] TicketOffice 클래스의 당첨 관련 기능을 LottoCompany 클래스로 분리
street62 Feb 24, 2022
ff671c5
[step2] User 클래스 추가
street62 Feb 24, 2022
2778b9a
[step2] LottoCompany 클래스를 통해 User에서 당첨 정보를 조회
nathan29849 Feb 24, 2022
a89c370
[step2] Rank 수정, 당첨 통계 Map key Integer -> Rank 수정
street62 Feb 24, 2022
6cc42b8
[step2] OutputView.showWinningResult 개선
nathan29849 Feb 24, 2022
8cc12ad
[step2] Rank 클래스 리팩토링 : checkBonus 메서드를 통해 indent를 줄임
nathan29849 Feb 24, 2022
68655b3
[step2] Rank 클래스에 FAIL 추가
nathan29849 Feb 24, 2022
c988010
[step3] 수동 티켓 개수 입력 받은 후 한꺼번에 생성하는 기능 구현
nathan29849 Feb 25, 2022
643fd1f
[step3] AutoTicketOffice, ManualTicketOffice 클래스 추가
street62 Feb 25, 2022
01591d8
[step3] User.goTicketOffice 메서드 구현
nathan29849 Feb 25, 2022
a2bed80
[step3] README 3단계 수동구매 기능 추가 관련 정보 기입
nathan29849 Feb 25, 2022
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
Binary file modified .gradle/6.7/executionHistory/executionHistory.bin
Binary file not shown.
Binary file modified .gradle/6.7/executionHistory/executionHistory.lock
Binary file not shown.
Binary file modified .gradle/6.7/fileHashes/fileHashes.bin
Binary file not shown.
Binary file modified .gradle/6.7/fileHashes/fileHashes.lock
Binary file not shown.
Binary file modified .gradle/6.7/javaCompile/classAnalysis.bin
Binary file not shown.
Binary file modified .gradle/6.7/javaCompile/javaCompile.lock
Binary file not shown.
Binary file modified .gradle/6.7/javaCompile/taskHistory.bin
Binary file not shown.
Binary file modified .gradle/buildOutputCleanup/buildOutputCleanup.lock
Binary file not shown.
30 changes: 26 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,33 @@
- 기대 수익은 동작 예시를 참고하자.

### 프로그래밍 요구사항
- [ ] indent(인덴트, 들여쓰기) depth를 1단계로 구현한다.
- [ ] depth의 경우 if문을 사용하는 경우 1단계의 depth가 증가한다. if문 안에 while문을 사용한다면 depth가 2단계가 된다.
- [x] indent(인덴트, 들여쓰기) depth를 1단계로 구현한다.
- [x] depth의 경우 if문을 사용하는 경우 1단계의 depth가 증가한다. if문 안에 while문을 사용한다면 depth가 2단계가 된다.
- [x] else를 사용하지 마라.
- [x] 메소드의 크기가 최대 10라인을 넘지 않도록 구현한다.
- [ ] method가 한 가지 일만 하도록 최대한 작게 만들어라.
- [x] method가 한 가지 일만 하도록 최대한 작게 만들어라.
- [x] ArrayList를 사용해서 구현한다.

---
---

## 로또 2단계 - 보너스 번호 추가
### 기능요구사항
- [x] 2등을 위해 추가 번호를 하나 더 추첨한다. 당첨 통계에 2등도 추가해야 한다.

### 프로그래밍 요구사항
- [x] enum을 적용해 프로그래밍을 구현한다.

### 힌트
- [x] Lotto 클래스를 사용자가 구매한 Lotto와 기계에 의해 추첨한 Lotto로 구분해서 생성한다.

---

## 로또 3단계 - 수동구매 기능 추가
### 기능요구사항
- [x] 현재 로또 생성기는 자동 생성 기능만 제공한다. 사용자가 수동으로 추첨 번호를 입력할 수 있도록 해야 한다.
- [x] 입력한 금액, 자동 생성 숫자, 수동 생성 번호를 입력하도록 해야 한다.

### 프로그래밍 요구사항
- [ ] 예외가 발생하는 부분에 대해 자바 Exception을 적용해 예외처리한다.
- [ ] 사용자가 입력한 값에 대한 예외 처리를 철저히 한다.
- [x] 상속과 인터페이스를 통해 구현을 간결히 할 수 없는지 고민해 본다.
8 changes: 6 additions & 2 deletions build/tmp/compileJava/source-classes-mapping.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
Main.java
Main
domain/Rank.java
domain.Rank
view/OutputView.java
view.OutputView
domain/LottoTicket.java
domain.LottoTicket
view/InputView.java
view.InputView
domain/ProfitAmount.java
domain.ProfitAmount
domain/User.java
domain.User
domain/TicketOffice.java
domain.TicketOffice
domain/LottoCompany.java
domain.LottoCompany
11 changes: 5 additions & 6 deletions src/main/java/Main.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import domain.LottoTicket;
import domain.TicketOffice;
import domain.*;

import java.util.List;

public class Main {
public static void main(String[] args) {
TicketOffice to = new TicketOffice();
List<LottoTicket> tickets = to.issueTickets();
to.setWinningNumber();
to.getStatistic(tickets);
LottoCompany lottoCompany = new LottoCompany();
User user = new User();
user.goTicketOffice();
user.checkMyTicketsFrom(lottoCompany);
}
}
38 changes: 38 additions & 0 deletions src/main/java/domain/AutoTicketOffice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package domain;

import java.util.*;

public class AutoTicketOffice extends TicketOffice {
private final List<Integer> lottoNumber = new ArrayList<>();
private final int SELECTABLE_NUMBER = 45;
private final int SELECTED_NUMBER = 6;

public AutoTicketOffice() {
setLottoNumber();
}

@Override
public List<LottoTicket> issueTickets(int numberOfTickets) {
List<LottoTicket> tickets = new ArrayList<>();
for (int j = 0; j < numberOfTickets; j++){
tickets.add(makeAutoTicket());
}
return tickets;
}

private LottoTicket makeAutoTicket() {
List<Integer> ticketNumber = new ArrayList<>();
Collections.shuffle(lottoNumber);
for (int i = 0; i < SELECTED_NUMBER; i++) {
ticketNumber.add(lottoNumber.get(i));
}
Collections.sort(ticketNumber);
return new LottoTicket(ticketNumber);
}

private void setLottoNumber() {
for (int i = 1; i <= SELECTABLE_NUMBER; i++) {
this.lottoNumber.add(i);
}
}
}
59 changes: 59 additions & 0 deletions src/main/java/domain/LottoCompany.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package domain;

import view.InputView;
import view.OutputView;

import java.util.*;

public class LottoCompany {
private LottoTicket winningTicket;
private int bonusNumber;
private int totalPrice;
private final int PRICE = 1000;

Choose a reason for hiding this comment

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

인스턴스 변수인데 대문자로 선언되어 있고 값도 부여되어 있군요.
제 생각에 이 변수는 인스턴스 변수로 관리할 것이 아니라 static 키워드를 추가로 부여해서 런타임 상수로 보존하는 게 좋을 것 같군요.

private final Map<Rank, Integer> statistics = new HashMap<>();

Choose a reason for hiding this comment

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

statistics 라는 것이 제가 이해하기론 몇 등짜리가 몇 장 당첨되었느냐를 알려주면 되는 부분인 것 같네요.
그렇다면 굳이 Map 형태로 보관할 필요 있을까요?
필요할 때마다 List<LottoTicket> 을 순회하며 계산하면 될 것 같기도 한데요? 자신이 몇 등 당첨되었는지는 LottoTicket 이 직접 말하게 하면 되고요.



public void setInitialStatistic() {
for (Rank rank : Rank.values()) {
statistics.put(rank, 0);
}
}

public void check(List<LottoTicket> tickets){
setWinningTicket();
setBonusNumber();
this.totalPrice = tickets.size() * PRICE;
getStatistic(tickets);
}

public void setWinningTicket() {
this.winningTicket = new LottoTicket(InputView.getWinningNumber());
}

public void setBonusNumber() { // 추후 당첨 번호에 없는 번호만 받도록 예외처리 필요
this.bonusNumber = InputView.getBonusNumber();
}

public void getStatistic(List<LottoTicket> tickets) {
setInitialStatistic();
int matchedNumber;
boolean isBonus;
Rank currentRank;
Comment on lines +39 to +41

Choose a reason for hiding this comment

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

이 세가지 정보를 LottoTicket 이 직접 줄 수 있어야 한다고 생각되네요.

for (LottoTicket ticket : tickets) {
matchedNumber = ticket.comparisonWinningTicket(this.winningTicket);
isBonus = ticket.checkBonusNumber(this.bonusNumber);
currentRank = Rank.designateRank(matchedNumber, isBonus);
statistics.computeIfPresent(currentRank, (k, v) -> v + 1);
}
OutputView.showWinningResult(this.statistics, calculateProfit());
}

public double calculateProfit() {
int totalPrize = 0;
for (Rank rank : this.statistics.keySet()) {
totalPrize += rank.getPrize() * statistics.get(rank);
}
return ((double) (totalPrize - totalPrice) / totalPrice) * 100;
}

}
29 changes: 27 additions & 2 deletions src/main/java/domain/LottoTicket.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,35 @@ public LottoTicket(List<Integer> lottoTicket) {
this.lottoTicket = lottoTicket;
}



public List<Integer> getTicketInfo() {
return Collections.unmodifiableList(this.lottoTicket);
}

public int get(int index){
if (index < 0 || index >= lottoTicket.size()){
throw new IndexOutOfBoundsException("인덱스를 초과하였습니다.");
}
return lottoTicket.get(index);
}

public int comparisonWinningTicket(LottoTicket winningTicket){
int count = 0;
for(int i=0; i<lottoTicket.size(); i++){
count+=checkNumber(winningTicket, i);
}
return count;
}

private int checkNumber(LottoTicket winningTicket, int index){
if (lottoTicket.contains(winningTicket.get(index))){
return 1;
}
return 0;
}

public boolean checkBonusNumber(int bonusNumber){
return lottoTicket.contains(bonusNumber);
}


}
26 changes: 26 additions & 0 deletions src/main/java/domain/ManualTicketOffice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package domain;

import view.InputView;

import java.util.*;

public class ManualTicketOffice extends TicketOffice {

@Override
public List<LottoTicket> issueTickets(int numberOfManualTicket) {
List<LottoTicket> tickets = new ArrayList<>();
if (numberOfManualTicket > 0) {
tickets.addAll(makeManualTickets(numberOfManualTicket));
}
return tickets;
}

private List<LottoTicket> makeManualTickets(int numberOfManualTicket) {
List<LottoTicket> manualLottoTickets = new ArrayList<>();
System.out.println("수동으로 구매할 번호를 입력해 주세요. (응모할 번호 6자리)");
for (int i = 0; i < numberOfManualTicket; i++) {
manualLottoTickets.add(new LottoTicket(InputView.getManualNumber()));
}
return manualLottoTickets;
}
}
24 changes: 0 additions & 24 deletions src/main/java/domain/ProfitAmount.java

This file was deleted.

47 changes: 47 additions & 0 deletions src/main/java/domain/Rank.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package domain;

public enum Rank {
FAIL(0, 0),
FIFTH(3, 5_000),
FORTH(4, 50_000),
THIRD(5, 1_500_000),
SECOND(5, 30_000_000),
FIRST(6, 2_000_000_000);

private final int matchedNumber;
private final int prize;

private Rank(int matchedNumber, int prize) {
this.matchedNumber = matchedNumber;
this.prize = prize;
}

public int getMatchedNumber() {
return matchedNumber;
}

public int getPrize() {
return prize;
}

public static Rank designateRank(int matchedNumber, boolean isBonus) {
switch (matchedNumber) {
case 3:
return FIFTH;
case 4:
return FORTH;
case 5:
return checkBonus(isBonus);
case 6:
return FIRST;
default:
return FAIL;
}
}
Comment on lines +28 to +40

Choose a reason for hiding this comment

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

스위치문 없앨 수 있습니다. 없애주세요.

힌트: .values(), .stream(), .filter()


private static Rank checkBonus(boolean isBonus){
if(isBonus)
return SECOND;
return THIRD;
}
}
Loading