
UML을 기반으로 lotto 프로그램을 작성 하시오
1. 변수 설명
winningNum: HashSet
당참 번호 1~25까지의 숫자 중 3개를 선정
prizeMoney: double
당첨 금액 랜덤하게 생성 ( 1 ~ 2000000000)
2 함수 설명
makeWinningNumberMoney(): void
당첨 번호와 당첨금을 생성 한다.
checkRanking(myNum: ArrayList): int
본인이 입력한 숫자 3개를 argument로 입력 하면
몇개가 일치한지를 check 한후 등수를 리턴
등수는 자유롭게 설정
prizeMoney(grade: int): double
등수 정보를 입력 하면 당첨 금액을 리턴
당첨 금액 비율은 자유롭게 설정
class를 처음 생성하면서 prizeMoney와 winningNum을 선언했지만, 하단에서 다시한번 double prizeMoney/ HashSet winningNum을 선언해서 에러가 발생함.
arr.size를 이용하여 for문 말고 while문을 돌릴 수도 있다.
ArrayList와 HashSet을 비교해야 하는데 어떻게 할지 고민. for문을 돌리며 HashSet.contains(ArrayList.get[i]) 비슷하게 구현하려고 했는데 안해봄.
그냥 for Each로 element를 하나씩 빼오면서 HashSet.contains를 true false 비교함. 그리고 true시 cnt를 ++하고 grade를 정함.
prizeMoney를 구현할 때는 전역변수 지역변수로 인해서 생긴 문제 말고 없었음.
DAO dao = new DAO로 함수를 썼던 것 처럼, 직접적으로 사용하지는 않겠지만 Lotto lt = new Lotto()로 선언을 먼저 해줌.
이어서 random하게 당첨 번호와 상금을 정하였다.(리턴값이 없는 void. 나중에 비교대상으로 사용됨).
sc로 출력을 받아서 번호를 받을 myNum 변수를 ArrayList로 선언했고 세개의 수를 입력받아서 대입.
1-25사이 수가 아닌 경우 오류를 내서 종료를 시켰지만, 문자가 들어올 때 예외처리는 하지 못했다.
lt 클래스를 호출하고 checkRanking(myNum) 메서드를 호출하여 grade를 받아서 int grade에 넣어주었고, lt 클래스를 호출하여 prizeMoney() 메서드를 사용하였다.

package ws0309;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;
public class Lotto {
private HashSet<Integer> winningNum = new HashSet<Integer>();
private double prizeMoney;
public void makeWinningNumberMoney() {
Random r = new Random();
while (winningNum.size() < 3) {
winningNum.add(r.nextInt(25) + 1);
}
prizeMoney = (r.nextDouble() * 2000000000) + 1;
System.out.printf("정답 : %s, 상금 : %10.2f\n", winningNum, prizeMoney);
}
public int checkRanking(ArrayList<Integer> myNum) {
int cnt = 0;
int grade = 0;
for (int num : myNum) {
if(winningNum.contains(num) == true) {
cnt ++;
}
}
if (cnt == 3) {
grade = 1;
}
if (cnt == 2) {
grade = 2;
}
if (cnt == 1) {
grade = 3;
}
return grade;
}
public double prizeMoney(int grade) {
double result = 0.0;
switch (grade) {
case 1 :
result = prizeMoney * 0.7;
System.out.printf("%d등! %10.2f원 당첨", grade, result);
return result;
case 2 :
result = prizeMoney * 0.2;
System.out.printf("%d등! %10.2f원 당첨", grade, result);
return result;
case 3 :
result = prizeMoney * 0.1;
System.out.printf("%d등! %10.2f원 당첨", grade, result);
return result;
default :
result = 0.0;
System.out.println("꽝");
return result;
}
}
}
이하 복기
package lotto;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;
public class Lotto {
private HashSet<Integer> winningNum;
private double prizeMoney;
public double getPrizeMoney() {
return prizeMoney;
}
public Lotto() {
winningNum = new HashSet<Integer>();
}
public void makeWinningNumberMoney() {
//번호 생성, 당첨금 생성
Random r = new Random();
prizeMoney = r.nextInt(2000000000) + 1;
while (winningNum.size() < 3) {
winningNum.add(r.nextInt(25) + 1);
}
System.out.println(prizeMoney);
System.out.println(winningNum.toString());
}
//생성자 안에 넣어서 class를 호출하면 실행되게 할 수도 있다.
//그러나 게임을 여러번 하고 싶을 경우를 위해 함수호출을 생성자가 아닌
//따로 호출하게 밖으로 뺐다.
public int checkRanking(ArrayList<Integer> myNum) throws Exception {
int grade = 0;
int cnt = 0;
// 5 7 9
for(int num : myNum) {
// 5 7 10
for(int prizeNum : winningNum) {
if (num == prizeNum) {
cnt++;
};
}
}
switch (cnt) {
case 3 : grade = 1; break;
case 2 : grade = 2; break;
case 1 : grade = 3; break;
default : throw new Exception("꽝");
}
return grade;
}
public double prizeMoney(int grade) {
double pMoney = 0.0;
switch(grade) {
case 1 : pMoney = prizeMoney * 0.7; break;
case 2 : pMoney = prizeMoney * 0.2; break;
case 3 : pMoney = prizeMoney * 0.1; break;
default : pMoney = 0.0;
}
return pMoney;
}
}
package lotto;
import java.util.ArrayList;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Lotto lotto = new Lotto();
int grade = 0;
while(true) {
System.out.println("Input cmd..(q.s.c.p)");
String cmd = sc.next();
if(cmd.equals("q")) {
break;
}else if(cmd.equals("s")) {
System.out.println("Make Number and Prize Money");
lotto.makeWinningNumberMoney();
}else if(cmd.equals("c")) {
System.out.println("Input 3 number :");
int num1 = Integer.parseInt(sc.next());
int num2 = Integer.parseInt(sc.next());
int num3 = Integer.parseInt(sc.next());
ArrayList<Integer> nums = new ArrayList<Integer>();
nums.add(num1);
nums.add(num2);
nums.add(num3);
try {
grade = lotto.checkRanking(nums);
} catch (Exception e) {
System.out.println(e.getMessage());
continue;//아래 코드를 다 무시하고 다시 while루프 처음으로 돌아감.
//continue로 while루프로 제어할 수 있다.
}
System.out.println(grade);
}else if(cmd.equals("p")) {
System.out.printf("총 당청금 %4.0f\n",lotto.getPrizeMoney());
System.out.printf("당신의 등수 %d\n",grade);
System.out.printf("당신의 당첨금 %4.0f\n",lotto.prizeMoney(grade));
}
}
sc.close();
}
}