[트러블슈팅] 2. 조건이 있는 while문이 무한 반복일 때

최재원's avatar
Mar 24, 2025
[트러블슈팅] 2. 조건이 있는 while문이 무한 반복일 때
문제 풀이 중 while을 사용할 때 무한 반복이 되는 상황이 발생했다.
결론, 조건값이 진행 중에 어떻게 변하는지 꼭 확인하자.
package algo; import java.util.Random; public class Lotto05 { public static void main(String[] args) { // 준비 int num = 0; int[] arr = new int[6]; Random rand = new Random(); boolean isSameNum = false; // 1회 추첨 // [10] num = rand.nextInt(45) + 1; arr[0] = num; //------------------------------------------- int r = 1; // 현재 배열 인덱스 위치 // 2회 추첨 // [10, 10] | [10, 13] // 3회 추첨 // [10, 13, 10] | [10, 13, 14] // 4회 추첨 // [10, 13 ,14, 13] | [10, 13, 14, 24] // 5회 추첨 // [10, 13 ,14, 24, 10] | [10, 13, 14, 24, 35] // 6회 추첨 // [10, 13 ,14, 24, 35, 24] | [10, 13, 14, 24, 35, 40] for (int j = 0; j < 5; j++) { while (true) { num = rand.nextInt(45) + 1; for (int i = 0; i < r; i++) { if (arr[i] == num) { isSameNum = true; break; // 중복 찾으면 다음 위치 확인 x } } if (!isSameNum) { arr[r] = num; break; } } r++; } for (int i = 0; i < 6; i++) { System.out.print(arr[i] + ", "); } } }
notion image
notion image
notion image
이렇게 잘 동작하다가
notion image
이렇게 아무런 결과도 나오지 않고 멈춰버린다 그래서 내부 결과를 보기 위해 로그 출력을 해보았다.
for (int j = 0; j < 5; j++) { while (true) { System.out.println(j + "회 추첨"); num = rand.nextInt(45) + 1; System.out.println(num + "번 추첨"); for (int i = 0; i < r; i++) { System.out.println(arr[i] + "와 비교"); if (arr[i] == num) { isSameNum = true; System.out.println("중복 찾음"); break; // 중복 찾으면 다음 위치 확인 x } } if (!isSameNum) { System.out.println("번호 저장"); arr[r] = num; break; } } r++; }
notion image
4회 추첨상태에서 중단 되지 않고 무한반복하고 있다. 발생한 이유를 생각해보자.
  1. 4회 추첨이다
  1. 번호를 추첨했다.
  1. 이전에 나왔던 번호랑 비교를 한다.
  1. 같은 번호가 있다.
  1. isSameNum = true 한다.
  1. isSameNum이 true라서 저장하지 않는다.
  1. while문의 처음으로 돌아간다.
  1. 4회 추첨이다.
  1. 번호를 추첨했다.
  1. 이전에 나왔던 번호랑 비교한다.
  1. 같은 번호가 없다.
  1. isSameNum 가 true다
  1. 이 번호를 저장하지 않고
  1. 다시 while문 처음으로 돌아간다.
 
1번이라도 중복값이 나와 isSameNum이 true가 되면 값을 저장하지 않고 계속 번호를 추첨하고, 확인하고, 추첨하고, 확인하고를 반복한다.
따라서, while이 시작할때 isSameNum을 false로 초기화 해주자!
for (int j = 0; j < 5; j++) { while (true) { isSameNum = false; System.out.println(j + "회 추첨"); num = rand.nextInt(45) + 1; System.out.println(num + "번 추첨"); for (int i = 0; i < r; i++) { System.out.println(arr[i] + "와 비교"); if (arr[i] == num) { isSameNum = true; System.out.println("중복 찾음"); break; // 중복 찾으면 다음 위치 확인 x } } if (!isSameNum) { System.out.println("번호 저장"); arr[r] = num; break; } } r++; }
Share article

jjack1