자바 메소드 실습문제에 대한 복습 중 NonStaticSample의 printLottoNumbers 메서드의 로또 번호 생성기의 버그를 발견하여, 리뷰하며 개선점을 찾아보고 싶었다.
기존 코드
public void printLottoNumbers() {
Random rand = new Random();
int[] lotto = new int[6];
boolean isDuplicate = false;
for (int i = 0; i < lotto.length; i++) {
int num = rand.nextInt(45) + 1;
for (int j = 0; j < i; j++) {
if (num == lotto[j]) {
isDuplicate = true;
break;
}
}
if (!isDuplicate) {
lotto[i] = num;
}
}
System.out.println(Arrays.toString(lotto));
}
Run_Nonstatic 클래스를 여러번 실행 시킨 결과, 6개의 숫자가 채워지지 않고 [23, 15, 40, 0, 0, 0]처럼 출력되는 이상한 결과를 자주 보게 되었다.
왜 이런 버그가 발생하는지, isDuplicate 플래그 변수의 동작을 따라가며, 원인을 찾아보았다.
i = 2일 때, rand.nextInt(45) + 1이 우연히 33이라는 중복된 숫자를 뽑았다고 가정하자.
안쪽 for문(j 루프)이 돌면서 lotto[0]의 값 33과 비교한다.
if (num == lotto[j]) 조건이 true가 된다.
isDuplicate는 true로 바뀌고, break를 만나 안쪽 for문이 종료된다.
그다음 if (!isDuplicate) 조건은 false가 되므로, lotto[i] = num; 코드는 실행되지 않는다.
문제를 해결하려면, "중복이 발생했을 때, 이번 회차를 무효로 하고 다시 뽑게 만들자"는 전략이 필요하다. for문의 i 값을 인위적으로 되돌리는 것이 가장 간단한 해결 방안이 될 것이다.
<<수정된 코드>>

수정된 로직 설명:
이제, 수정한 코드로 Run_NonStatic을 다시 여러 번 실행해보니 절대 0이 나오지 않고, 항상 6개의 중복 없는 숫자가 출력되었다.
이번 디버깅으로 다음 개념들을 확실히 정리하고, 다음 스텝으로 나아가게 되었다.
논리적 오류 (버그): 문법은 맞지만, 의도와 다르게 동작하는 코드.
디버깅: 코드의 실행 흐름을 한 줄씩 따라가며 변수의 값 변화를 추적하여 문제의 원인을 찾는 과정.
루프 제어: break는 루프를 탈출하고, i--와 같은 인위적인 값 변경으로 루프의 흐름을 제어할 수 있다.