-
Notifications
You must be signed in to change notification settings - Fork 21
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
[2주차] 객체지향 코드연습 (Suehyun666) #31
base: main
Are you sure you want to change the base?
Changes from 3 commits
e6ecb6a
e287377
41845b7
69aba52
928bcc2
87adba7
26c32dd
355ebf0
619aae4
7aaa590
77bae68
6049a3f
a14bc17
bff4f55
0d78f68
20eb9f3
97b2cd3
1a2ebfe
1858311
fde267e
f208822
55be10e
a6c7390
a5440df
bcb6e36
e48a13c
3867749
6de8f99
771e99b
8382b15
64269f2
f018d51
89a61c1
f7c2bbf
3430382
743cfc9
732acb0
ec97241
2aa1c6f
01e7fe1
d2112f1
c1af815
96bbaf3
4a63945
e764b62
dfb20a1
bea7598
958f0a5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,9 @@ | ||
package lotto; | ||
|
||
public class Application { | ||
|
||
public static void main(String[] args) { | ||
// TODO: 프로그램 구현 | ||
LottoGame lottoGame = new LottoGame(); | ||
lottoGame.start(); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -1,20 +1,59 @@ | ||||||
package lotto; | ||||||
|
||||||
import camp.nextstep.edu.missionutils.Randoms; | ||||||
|
||||||
import java.util.HashSet; | ||||||
import java.util.List; | ||||||
import java.util.Set; | ||||||
|
||||||
public class Lotto { | ||||||
private final List<Integer> numbers; | ||||||
private final int bonusNumber; | ||||||
|
||||||
// 번호를 저장할 수 있는 리스트 생성(ALL) | ||||||
public Lotto() { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 매개변수가 없는 생성자를 추가할 수 없다는 요구사항이 있습니다. 요구사항 지켜주세요 |
||||||
this.numbers = new ArrayList<>(); | ||||||
} | ||||||
|
||||||
// 사용자가 입력한 번호를 받는 생성자 (User) | ||||||
public Lotto(List<Integer> numbers) { | ||||||
validate(numbers); | ||||||
this.numbers = numbers; | ||||||
} | ||||||
|
||||||
|
||||||
//일반 번호 6개 생성 (Lotto) | ||||||
public void generateRandomNumbers() { | ||||||
numbers.clear(); | ||||||
numbers.addAll(Randoms.pickUniqueNumbersInRange(1, 45, 6)); | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 1, 45, 6이 어떤 의미를 가지는지 이름을 지어주세요. |
||||||
} | ||||||
|
||||||
// 보너스 번호 생성 (Lotto ) | ||||||
private int generateBonusNumber() { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 코드 컨벤션을 지켜주세요. |
||||||
int bonus; | ||||||
do { | ||||||
bonus = Randoms.pickNumberInRange(1, 45); | ||||||
} while (numbers.contains(bonus)); | ||||||
return bonus; | ||||||
} | ||||||
|
||||||
//get | ||||||
public List<Integer> getNumbers() { | ||||||
return numbers; | ||||||
} | ||||||
|
||||||
public int getBonusNumber() { | ||||||
return bonusNumber; | ||||||
} | ||||||
|
||||||
//validate | ||||||
private void validate(List<Integer> numbers) { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 어떤 검사를 하고있는지, 메소드 명을 구체적으로 변경하여도 좋을 것 같습니다. |
||||||
if (numbers.size() != 6) { | ||||||
throw new IllegalArgumentException(); | ||||||
if (numbers.size() != 6 || hasDuplicate(numbers)) { | ||||||
throw new IllegalArgumentException("[ERROR] 잘못된 로또 번호입니다."); | ||||||
} | ||||||
} | ||||||
|
||||||
// TODO: 추가 기능 구현 | ||||||
private boolean hasDuplicate(List<Integer> numbers) { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
메소드 명은 개인이 짓는 것이지만, 의견 하나 내보고 갑니다! |
||||||
Set<Integer> uniqueNumbers = new HashSet<>(numbers); | ||||||
return uniqueNumbers.size() != numbers.size(); | ||||||
} | ||||||
} |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,156 @@ | ||||||
package lotto; | ||||||
|
||||||
import camp.nextstep.edu.missionutils.Console; | ||||||
|
||||||
import java.util.ArrayList; | ||||||
import java.util.HashSet; | ||||||
import java.util.List; | ||||||
import java.util.Set; | ||||||
|
||||||
public class LottoGame { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이 클래스에 너무 많은 책임이 부여되어 있습니다.
이외에도 여러 책임이 있고 조금 분리해야할 필요성이 보입니다. |
||||||
// | ||||||
private static final int LOTTO_PRICE = 1000; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 매직넘버로 변수를 관리하는 것은 가독성인 면에서 아주 좋습니다! |
||||||
|
||||||
//method | ||||||
public void start() { | ||||||
//구성요소 | ||||||
int money = getMoney(); | ||||||
int lottoCount = getLottoCount(money); | ||||||
List<Lotto> boughtLottos = buyLottos(lottoCount); | ||||||
printLottos(boughtLottos); | ||||||
|
||||||
// 사용자가 당첨 번호와 보너스 번호 입력 | ||||||
List<Integer> winningNumbers = getWinningNumbers(); | ||||||
int bonusNumber = getBonusNumber(winningNumbers); | ||||||
|
||||||
// Lotto 클래스에서 자동 생성된 번호와 비교 | ||||||
calculateResults(boughtLottos, winningNumbers, bonusNumber); | ||||||
} | ||||||
|
||||||
//Input | ||||||
//입금 | ||||||
private int getMoney() { | ||||||
System.out.println("구입금액을 입력해 주세요."); | ||||||
String input = Console.readLine(); | ||||||
return validateMoney(input); | ||||||
} | ||||||
//잘못된 입금 시 에러 처리 | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 메소드간 간격 유지 해주시기 바랍니다. |
||||||
private int validateMoney(String input) { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 무언가를 검사하는 메소드에서 String타입을 int타입의 Money를 반환하는 것을 올바르지 않은 것 같습니다.
Suggested change
|
||||||
if (!input.matches("\\d+")) { | ||||||
throw new IllegalArgumentException("[ERROR] 유효한 금액을 입력해 주세요."); | ||||||
} | ||||||
int money = Integer.parseInt(input); | ||||||
if (money < LOTTO_PRICE) { | ||||||
throw new IllegalArgumentException("[ERROR] 금액은 1000원 이상이어야 합니다."); | ||||||
} | ||||||
return money; | ||||||
} | ||||||
// how many bought lottos | ||||||
private int getLottoCount(int money) { | ||||||
return money / LOTTO_PRICE; | ||||||
} | ||||||
// generate lotto (manually) | ||||||
private List<Lotto> buyLottos(int count) { | ||||||
List<Lotto> lottos = new ArrayList<>(); | ||||||
for (int i = 0; i < count; i++) { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. stream API를 사용하여 가독성을 높일 수 있습니다 |
||||||
lottos.add(new Lotto()); | ||||||
} | ||||||
return lottos; | ||||||
} | ||||||
|
||||||
private List<Integer> getWinningNumbers() { | ||||||
System.out.println("당첨 번호를 입력해 주세요."); | ||||||
String input = Console.readLine(); | ||||||
return parseWinningNumbers(input); | ||||||
} | ||||||
|
||||||
//,로 파싱 => indentation 수정 예정 | ||||||
private List<Integer> parseWinningNumbers(String input) { | ||||||
String[] tokens = input.split(","); | ||||||
if (tokens.length != 6) { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 여기서 사용한 6이라는 변수가 무엇을 의미하는지 모르겠습니다! |
||||||
throw new IllegalArgumentException("[ERROR] 당첨 번호는 6개여야 합니다."); | ||||||
} | ||||||
List<Integer> numbers = new ArrayList<>(); | ||||||
for (String token : tokens) { | ||||||
int number = Integer.parseInt(token.trim()); | ||||||
if (number < 1 || number > 45) { | ||||||
throw new IllegalArgumentException("[ERROR] 번호는 1부터 45 사이여야 합니다."); | ||||||
} | ||||||
numbers.add(number); | ||||||
} | ||||||
if (HasDuplicate(numbers)) { | ||||||
throw new IllegalArgumentException("[ERROR] 중복된 번호가 있습니다."); | ||||||
} | ||||||
return numbers; | ||||||
} | ||||||
|
||||||
private boolean HasDuplicate(List<Integer> numbers) { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 메소드 네이밍 컨벤션 지켜주세요
Suggested change
|
||||||
Set<Integer> uniqueNumbers = new HashSet<>(numbers); | ||||||
return uniqueNumbers.size() != numbers.size(); | ||||||
} | ||||||
|
||||||
private int getBonusNumber(List<Integer> winningNumbers) { | ||||||
System.out.println("보너스 번호를 입력해 주세요."); | ||||||
String input = Console.readLine(); | ||||||
int bonusNumber = Integer.parseInt(input.trim()); | ||||||
if (bonusNumber < 1 || bonusNumber > 45 || winningNumbers.contains(bonusNumber)) { | ||||||
throw new IllegalArgumentException("[ERROR] 보너스 번호는 1부터 45 사이의 당첨 번호와 중복되지 않는 번호여야 합니다."); | ||||||
} | ||||||
return bonusNumber; | ||||||
} | ||||||
|
||||||
|
||||||
//Output | ||||||
// 얼마나 구입했는지 출력 | ||||||
private void printLottos(List<Lotto> lottos) { | ||||||
System.out.println(lottos.size() + "개를 구매했습니다."); | ||||||
for (Lotto lotto : lottos) { | ||||||
System.out.println(lotto.getNumbers()); | ||||||
} | ||||||
} | ||||||
|
||||||
//로또 결과 출력 | ||||||
private void calculateResults(List<Lotto> boughtLottos, List<Integer> winningNumbers, int bonusNumber) { | ||||||
int[] matchCounts = new int[7]; | ||||||
for (Lotto lotto : boughtLottos) { | ||||||
int matchCount = getMatchCount(lotto.getNumbers(), winningNumbers); | ||||||
boolean bonusMatch = (lotto.getBonusNumber() == bonusNumber); | ||||||
matchCounts[getResultIndex(matchCount, bonusMatch)]++; | ||||||
} | ||||||
printStatistics(matchCounts); | ||||||
} | ||||||
|
||||||
//로또 맞은 개수 출력 | ||||||
private int getMatchCount(List<Integer> numbers, List<Integer> winningNumbers) { | ||||||
int count = 0; | ||||||
for (int number : numbers) { | ||||||
if (winningNumbers.contains(number)) { | ||||||
count++; | ||||||
} | ||||||
} | ||||||
return count; | ||||||
} | ||||||
//1등과 2등 구분 | ||||||
private int getResultIndex(int matchCount, boolean bonusMatch) { | ||||||
if (matchCount == 6) return 6; | ||||||
if (matchCount == 5 && bonusMatch) return 5; | ||||||
return matchCount; | ||||||
} | ||||||
|
||||||
//통계 출력 | ||||||
private void printStatistics(int[] matchCounts) { | ||||||
System.out.println("3개 일치 (5,000원) - " + matchCounts[3] + "개"); | ||||||
System.out.println("4개 일치 (50,000원) - " + matchCounts[4] + "개"); | ||||||
System.out.println("5개 일치 (1,500,000원) - " + matchCounts[5] + "개"); | ||||||
System.out.println("5개 일치, 보너스 볼 일치 (30,000,000원) - " + matchCounts[5] + "개"); | ||||||
System.out.println("6개 일치 (2,000,000,000원) - " + matchCounts[6] + "개"); | ||||||
calculateProfit(matchCounts); | ||||||
} | ||||||
|
||||||
//수익률 출력 | ||||||
private void calculateProfit(int[] matchCounts) { | ||||||
double totalPrize = matchCounts[3] * 5000 + matchCounts[4] * 50000 + matchCounts[5] * 1500000 + matchCounts[6] * 2000000000; | ||||||
double profitRate = (totalPrize / (matchCounts.length * LOTTO_PRICE)) * 100; | ||||||
System.out.println("총 수익률은 " + profitRate + "%입니다."); | ||||||
} | ||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
과제 요구사항 중 Lotto클래스 내부에 필드를 추가할 수 없다고 적혀있습니다!
요구사항을 지켜주세요
그래도 bonusNumber를 Lotto내에 한곳에 관리한다는 접근은 굉장히 좋았던 것 같습니다.