✿∘˚˳°∘°

6일차 : Break, Continue, Random 본문

국비수업/JAVA

6일차 : Break, Continue, Random

_HYE_ 2022. 12. 6. 00:33

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보다 크기때문에.

< UP&DOWN 게임 결과창 >

[ 후기 ] ---------------------------------------------------------------------------------------------------------------------------------------------

 

오늘부터 중간중간 헷갈리는 부분이 생기기시작했다.  

위치차이 하나로 완전 다른코드가 되어버리니 계속 신경써줘야하는데 코드가 너무 산만해서 확인하기가 너무 힘들다ㅎ

좀 더 깨끗하고 가독성좋게 짤 수 있도록 공부해야겠다. 

 

오늘 실수한부분

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
Comments