✿∘˚˳°∘°
6일차 : Break, Continue, Random 본문
2022/12/05
[ 1. 반복문의 무한반복 ] =============================================================
- for문의 경우 초기,조건,증감을 모두비우고 for(;;)형식을 사용하면 무한반복 가능
- while문의 경우 조건식이 true이기만 하면 되므로 boolean형식의 변수를 넣어준다.
(무한반복의 경우에는 while문을, 횟수를 지정해야 하는경우에는 for문을 사용하는 편이 제어하기 쉬움)
1을 입력하면 무한반복이 종료되는 코드
//무한반복
public void loopTest1() {
Scanner sc = new Scanner(System.in);
//for문은 초기, 조건, 증감을 모두 비우면 무한반복
/* for(;;) {
System.out.println("Hi");
} */
boolean bool = true;
while(bool) {
System.out.print("무한반복을 멈추려면 1을 입력하세요 : ");
int num = sc.nextInt();
if(num == 1) {
bool = false;
System.out.println("종료");
}
}
}

[ 2. 분기문 ] =======================================================================
분기문사용법 1 - for문에서의 실행흐름을 제어
//분기문 : 반복문의 실행흐름을 제어
//1.break: 수행중 break를 만나면 곧장 반복문을 빠져나옴
//2. continue : continue를 만나는 경우 아래를 실행하지 않고 반복문 다시실행(for문의 경우 증감식으로간다)
//분기문(for)
public void loopTest2() {
Scanner sc = new Scanner(System.in);
for(int i=0; i<10; i++) {
System.out.println("i : "+i);
System.out.print("1/2/3 중 하나를 선택하세요 : ");
int num = sc.nextInt();
if(num==1) {
continue; //밑의 코드를 무시하고 다시 증감식으로 가서 반복문 실행
} else if(num==2) {
break; //즉시 for문종료(반복문마지막줄!출력이안된다)
}
System.out.println("반복문 마지막 줄!");
}
System.out.println("반복문 끝나면 출력");
}
분기문사용법 2 - while문에서의 실행흐름을 제어
//분기문(while)
public void loopTest3() {
Scanner sc = new Scanner(System.in);
while(true) {
System.out.print("1/2/3 중 하나를 입력하세요 : ");
int num = sc.nextInt();
if(num == 1) {
continue; //아래코드 실행x 바로 조건검사를 하러간다
} else if(num == 2) {
break;
}
System.out.println("반복문 마지막줄!");
}
System.out.println("반복문 끝나면 출력!");
}

결과창을 확인해보면
1을 눌러 continue와 만나면 더이상 코드를 수행하지않고 반복문으로 돌아가는 것(for의 증감식으로) 을 확인할 수 있다.
2를 눌러 break와 만나면 즉시 반복문을 빠져나와 반복문 이후의 출력이 실행된다.
분기문사용법 3 - 중첩 for문에서의 실행흐름을 제어
public void loopTest4() {
Scanner sc = new Scanner(System.in);
for(int i=0; i<10; i++) {
for(int j=0; j<10; j++) {
System.out.println("i : "+i);
System.out.println("j : "+j);
System.out.print("1/2/3 중 하나를 입력하세요 : ");
int num = sc.nextInt();
if(num == 1) {
continue;
} else if(num == 2) {
break;//변수범위랑 비슷하게 인식하면된다.
//나를감싸고 있는 for문 중에 가장 가까운것을 나간다(현재코드에선 내부for)
//모든 for문을 한번에 나가는것이 아님
}
System.out.println("내부 for문 마지막!");
}
System.out.println("외부 for문 마지막!");
}
}
1을 입력하여 continue를 만나면 i : 0 / j : 1이 되고 다시 반복문이 수행된다.(내부 for문의 증감식으로 이동하여 다시반복)
2를 입력하여 break를 만나면 가장 가까운 for문을 나가게되며 외부for문 이후의 코드가 출력된다. i : 1 / j : 0(초기화)
※ 무한루프를 사용할 경우 주의점( 만날 수 있는 에러 )
public void loopTest5() {
for(int i=0; i<5; i++) { //for문 쓰고 한번출력할거면 쓸의미가없잖아?라는 경고가 생긴다.
System.out.println("HI");
break;//만나는 즉시 for문을 나가기 때문에 아래코드에 unreachable code에러가 발생
//System.out.println("안녕"); unreachable code : 이코드에 도달할 수 없어
}
while(true) {
System.out.println("HI");
}
// System.out.println("코드");
//while에 break;가 없다면 위 while문을 나갈 수 없기 때문에
//아래코드는 unreachable code에러 발생(무한반복이면 아래코드에 도달할수없기때문에)
}
}

루프를 사용하면 만날 수 있는 에러
1. for문 내부에 break를 넣을 경우 아래코드는 실행되지않고 나가게되므로, 아래코드와는 영영 만날일이 없어진다
2. while(true)내부에 break가 없다면 평생 while의 반복을 나오지 못하므로 그 이후의 코드에 도달 할 수 없다.
>>unreachable code error 발생
(에러는 아니지만,
for문에 break를 넣으면 1번실행 시 for문을 나오기 때문에 for문에 대한 의미가 없어짐 - 이에대한 경고가 발생한다)
[ 3. random ] ======================================================================
Random 기본설명
public void test1() {
// 무작위수 생성을 위한 객체 생성
Random r = new Random();
int num1 = r.nextInt(); // int범위 중 무작위 수 1개생성
System.out.println(num1);
int num2 = r.nextInt(10); // 0~9사이의 숫자 중 랜덤숫자 1개 생성
System.out.println(num2);
// 0~5 사이의 숫자중 랜덤숫자 1개 생성
int num3 = r.nextInt(6); // 0~6사이의 숫자 중 랜덤숫자 1개 생성, 5가아님! 6개이기때문에
System.out.println(num3);
// 1~10사이의 숫자중 랜덤숫자 1개생성
int num4 = r.nextInt(10) + 1; // random으로 나온숫자에 +1을 해주면 1~10사이가 되니까
System.out.println(num4);
// 20~35사이의 숫자중 랜덤숫자 1개생성
// 특정 범위를 구할 때 :r.nextInt(후보군갯수)+시작숫자
int num5 = r.nextInt(16) + 20;
System.out.println(num5);
}
Random은 무작위 수를 생성하기 위한 java.util에 있는 객체
사용법 : Random 별명 = new Random();
별명.nextInt( 후보군갯수 )+시작숫자; (ex) r.nextInt(10)+1 : 1~10사이의 숫자 중 랜덤숫자 1개 생성
3 - 1 ) 동전 앞/뒤맞추기 게임
// 컴퓨터랑 동전 앞/뒤 맞추기
public void coin() {
// 컴퓨터가 앞/뒤 중 한개의 값을 갖고있는 상태
// random을 이용해서 1이면 앞/ 2면 뒤
// 사용자가 앞/뒤 입력하면 결과 처리
Scanner sc = new Scanner(System.in);
Random r = new Random();
// 1~2사이의 랜덤수
while (true) {
int coin = r.nextInt(2) + 1;
System.out.println("==== 동전 앞/뒤 맞추기 ====");
System.out.print("앞/뒤를 선택하세요(1.앞면/2.뒷면) : ");
int userSelect = sc.nextInt();
if (coin == userSelect) {
System.out.println("정답!");
} else {
System.out.println("땡!");
break;// 한번이라도 틀리는 순간 break를 만나서 무한반복끝
}
}
}
int coin = r.nextInt(2)+1 을 통해 1~2사이의 숫자를 컴퓨터가 랜덤으로 생성하고
사용자가 입력한값과 동일하면 게임반복 동일하지 않으면 break를 통해 반복코드를 빠져나가 종료된다.
3 - 2 ) 가위바위보 게임
// 가위바위보게임
public void test2() {
// 가위 바위 보 중 하나를 선택 승패를 경정하는 게임
// 승패를 결정하는 if문은 중첩if문 금지.
Scanner sc = new Scanner(System.in);
Random r = new Random();
boolean bool = true; // 게임 전체 진행용 변수
int win = 0; // while문 안으로 들어가면 반복문이 실행될때마다 초기화되므로 밖에서 선언해주어야한다.
int lose = 0;
int draw = 0;
while (bool) {
System.out.println("=== 가위 바위 보 게임 ===");
System.out.println("1. 가위바위보 게임 시작");
System.out.println("2. 전적확인");
System.out.println("3. 게임종료");
System.out.print("선택 > ");
int sel = sc.nextInt();
switch (sel) {
case 1:
int comNum = r.nextInt(3) + 1;
int userNum = 0;
String userStr = "";
String comStr = "";
while (true) {
System.out.print("숫자를 선택하세요(1.가위/2.바위/3.보) : ");
userNum = sc.nextInt();
// user 지는경우(컴-나) : 1-3/2-1/3-2 || 이기는경우 : 3-1/1-2/2-3
if (userNum == 1) {
userStr = "가위";
} else if (userNum == 2) {
userStr = "바위";
} else if (userNum == 3) {
userStr = "보";
} else {
System.out.println("잘못입력하셨습니다.");
continue;// continue를 빼고 위if문마다 break를 넣어줘도 된다
}
break;// continue를 빼게되면 얘도 빼야함
}
if (comNum == 1) {
comStr = "가위";
} else if (comNum == 2) {
comStr = "바위";
} else if (comNum == 3) {
comStr = "보";
}
System.out.println("======== 결과 ========");
System.out.println("당신은 " + userStr + "를 냈습니다.");
System.out.println("컴퓨터는 " + comStr + "를 냈습니다.");
System.out.println("=====================");
// 둘이서 가위바위보 하는경우 경우의 수 총 9개
// 사용자가 이기는경우 : 가위(1)-보(3) / 바위(2)-가위(1) / 보(3)-바위(2)
// 사용자가 지는경우 : 가위(1)-바위(2) / 바위(2)-보(3) / 보(3)-가위(2)
// 비기는 경우 : 가위(1)-가위(1) / 바위(2)-바위(2) / 보(3)-보(3)
if (comNum == userNum) {
System.out.println("무승부");
draw++;
} else if ((comNum == 3 && userNum == 1) || (comNum == 1 && userNum == 2)
|| (comNum == 2 && userNum == 3)) {
System.out.println("당신이 이겼습니다.");
win++;
} else {
System.out.println("당신이 졌습니다.");
lose++;
}
break;
case 2:
System.out.println("승리 : " + win);
System.out.println("패배 : " + lose);
System.out.println("무승부 : " + draw);
break;
case 3:
System.out.println("잘가요!");
bool = false;// 전체메뉴 무한반복을 종료하기 위한 조건
break;
default:
System.out.println("잘못입력하셨습니다.");
break;
}
}
}
3 - 3 ) UP & DOWN 게임
// up&down
public void upDown() {
// 컴퓨터가 1~99사이의 랜덤수 중 1개의 숫자를 정답숫자로 선정
// GAME SCORE는 정답을 맞춘 회차중 가장 작은회차를 기록(게임을 한번도 하지않은경우 기록없음 출력)
Scanner sc = new Scanner(System.in);
Random r = new Random();
boolean bool = true;
int rank = 0; //기록저장용
while (bool) {
System.out.println("==== Up & Down Game ====");
System.out.println("1. Game Start");
System.out.println("2. Game Score");
System.out.println("3. End Game");
System.out.print("선택 > ");
int sel = sc.nextInt(); // 메뉴선택변수
int comNum = r.nextInt(99) + 1;//컴퓨터의 랜덤번호(반복될때마다 숫자가바뀌므로 반복문 밖에)
System.out.println(" << Game Start >> ");
int num = 1; // 회차번호
switch (sel) {
case 1:
while (true) {
System.out.print(num + "회차 번호 입력 : ");
int userNum = sc.nextInt();// 게임입력숫자
if (userNum == comNum) {
System.out.println("<<정답>>");
if(rank == 0 || num < rank) {
rank = num;
}
break;
} else if (userNum > comNum) {
System.out.println("<< DOWN >>");
} else {
System.out.println("<< UP >>");
}
num++;
}
break;
case 2:
if (rank == 0) {
System.out.println("아직 기록이 없습니다.");
;
} else {
System.out.println("현재 최고 기록은 " + rank + "회 입니다.");
}
break;
case 3:
System.out.println("잘가요!");
bool = false;
break;
default:
System.out.println("잘못입력하셨습니다.");
break;
}
}
}
최고기록 횟수출력을 위한 변수 int rank를 만들어서 rank가 0일경우 + num(회차)가 rank보다 작을 경우
rank에 값을 대입하여 최고기록 저장
< Point > 1. 변수의 위치를 잘 확인해야한다.(반복문안에 들어가야하는 변수가 있고 나와야하는 변수가 있음)
위의 경우 랜덤값을 넣어주는 int comNum = r.nextInt(99)+1; 코드가 반복문 내부에 있을경우 수행할 때마다
변경되어 게임 불가능.
2. 최고기록 값 저장을 어떻게 할 지 생각하기.
rank == 0일 경우를 넣어주지않으면 값저장X, 초기값은 항상 num보다 크기때문에.

[ 후기 ] ---------------------------------------------------------------------------------------------------------------------------------------------
오늘부터 중간중간 헷갈리는 부분이 생기기시작했다.
위치차이 하나로 완전 다른코드가 되어버리니 계속 신경써줘야하는데 코드가 너무 산만해서 확인하기가 너무 힘들다ㅎ
좀 더 깨끗하고 가독성좋게 짤 수 있도록 공부해야겠다.
오늘 실수한부분
1. rank에 최소값 대입하기
2. 반복문 빠져나오는 위치(break작성해야하는부분) 확인
'국비수업 > JAVA' 카테고리의 다른 글
8일차 : 배열 (0) | 2022.12.07 |
---|---|
7일차 : Random, 배열 (0) | 2022.12.07 |
5일차 : 제어문 (0) | 2022.12.06 |
4일차 : Operator (0) | 2022.12.06 |
3일차 : Scanner, 연산자 (0) | 2022.12.06 |