내가 풀었던 문제이지만, 나는 정말 1차원 적으로 풀었고, 선생님께서 조금 더 프로그래밍적으 문제를 푸셨고 ,무엇보다도 내가 아직 예외처리에 대해 감이 없어서 풀이해볼겸 코드를 분석한다.
그리고 언제나 그렇듯이 내가 누군가에게 설명한다는 가정하에 글을 쓴다
문제
원하는 주사위와 주사위 개수를 입력 받아 그 결과를 확인하는 프로그램을 구현하시오.
Scanner sc = new Scanner(System.in);
boolean flag = true;
while(flag) {
System.out.println("1.시작 \t2.종료");
String menu = sc.nextLine();
switch(menu) {
case "1":
int dice ; //주사위 변수
int cnt ; // 주사위 개수 변수
//주사위 종류입력
while(true) {
System.out.println("주사위 종류를 입력하세요.(숫자만 입력하세요.)");
try {//인트로 형변환
dice = Integer.parseInt(sc.nextLine());
break;
} catch (Exception e) { //숫자아니면 캐치 발동
e.printStackTrace();
}
}
값을 입력 받기위해 스캐너 함수를 불러왔고, flag 변수는 while문의 동작유무를 위해서 사용 되었다. 아마 끝날 쯤 밑에서 false 로 초기화 시킬 것이다. 변수는 주사위와 주사위 개수가 있다. 그리고 드디어 try catch 문이 나왔다.
dice를 초기화 시키기 위해 입력 값 받는 부분이 sc.nextLIne()으로 스트링으로 받기에 인트로 캐스팅을 통해 형변환 시켜주고있다. 그리고 조금 이해가 어려웠던 부분이 break;가 뜬금 없이 나와서 곰곰히 생각해본 결과 만약, break; 가 없다면 while문에서 멈출 수 있는 방법이 없다. 그래서 무한 반복을 하기 때문에 break;가 사용되었다.
catch 문 가로안에 있는 Exception 클래스가 예외 클래스 중 최상위 클래스라서 사용하면 굳이 다른 예외 클래스를 할 필요가 없다. printStackTrace(); 메소드는 현재 발생환 예외가 어떤 거 때문에 발생 했는 출력해 친절히 알려준다.
//주사위 개수 입력
while(true) {
System.out.println("주사위 개수를 입력하세요.(숫자만 입력하세요.)");
try {
cnt= Integer.parseInt(sc.nextLine());
break;
} catch (Exception e) {//숫자아니면 캐치
e.printStackTrace();
}
}
for(int i= 0; i < cnt; i++) {
//입력받은 cnt보다 작을 때 까지 실행
System.out.println((int)(Math.floor(Math.random()* dice))+1);
}
break;
case "2":
flag=false;
System.out.println("종료합니다.");
break;
default :
System.out.println("잘못입력했습니다.");
}
}
}
주사위 개수를 입력 받는 부분도 주사위를 입력 받는 부분과 크게 다르지 않다. 주사위 개수를 입력 받고 출력받는 for문의 조건식을 살펴보면 i < cnt 로 되어있다. 이 뜻은 i 가 cnt 보다 작을 때 까지 for 문이 실행된다는 이야기다. 그리고 case 2 를 보면 역시 내가 위에서 언급 했 듯이 flag = false 라고 종료를 위해서 초기화를 시켜준다.