Java Method 실습 코드 리뷰 및 개선

kyw·2025년 10월 10일

Java

목록 보기
8/13


자바 메소드 실습문제에 대한 복습 중 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));

 }

1. 버그 재현 및 원인 분석

Run_Nonstatic 클래스를 여러번 실행 시킨 결과, 6개의 숫자가 채워지지 않고 [23, 15, 40, 0, 0, 0]처럼 출력되는 이상한 결과를 자주 보게 되었다.

왜 이런 버그가 발생하는지, isDuplicate 플래그 변수의 동작을 따라가며, 원인을 찾아보았다.

  1. for문이 i = 0, i = 1일 때는 정상적으로 lotto[0], lotto[1]에 숫자가 들어간다. isDuplicate는 false다.
  • lotto 배열: [33, 12, 0, 0, 0, 0]

  1. i = 2일 때, rand.nextInt(45) + 1이 우연히 33이라는 중복된 숫자를 뽑았다고 가정하자.

  2. 안쪽 for문(j 루프)이 돌면서 lotto[0]의 값 33과 비교한다.

  3. if (num == lotto[j]) 조건이 true가 된다.

  4. isDuplicate는 true로 바뀌고, break를 만나 안쪽 for문이 종료된다.

  5. 그다음 if (!isDuplicate) 조건은 false가 되므로, lotto[i] = num; 코드는 실행되지 않는다.

  • lotto 배열: [33, 12, 0, 0, 0, 0] (2번 인덱스가 여전히 0이다)

  1. 가장 결정적인 문제: i는 3으로 증가해서 바깥쪽 for문이 계속된다. 하지만 isDuplicate 변수는 true인 상태로 초기화되지 않고 남아있다.

  2. 따라서 i가 3, 4, 5일 때도 if (!isDuplicate)는 계속 false이므로, lotto 배열의 나머지 칸은 영원히 채워지지 않는다.

2. 해결 방안 모색 및 코드 수정

문제를 해결하려면, "중복이 발생했을 때, 이번 회차를 무효로 하고 다시 뽑게 만들자"는 전략이 필요하다. for문의 i 값을 인위적으로 되돌리는 것이 가장 간단한 해결 방안이 될 것이다.

<<수정된 코드>>

수정된 로직 설명:

  • isDuplicate가 true가 되면, i-- 코드가 실행된다.
  • for문은 현재 반복을 끝내고 다음 반복으로 넘어갈 때 자동으로 i++을 실행한다.
  • 결과적으로 i--와 i++가 만나 i 값은 변하지 않은 채로 현재 회차를 다시 실행하는 효과가 나타난다.

이제, 수정한 코드로 Run_NonStatic을 다시 여러 번 실행해보니 절대 0이 나오지 않고, 항상 6개의 중복 없는 숫자가 출력되었다.

이번 디버깅으로 다음 개념들을 확실히 정리하고, 다음 스텝으로 나아가게 되었다.

  • 논리적 오류 (버그): 문법은 맞지만, 의도와 다르게 동작하는 코드.

  • 디버깅: 코드의 실행 흐름을 한 줄씩 따라가며 변수의 값 변화를 추적하여 문제의 원인을 찾는 과정.

  • 루프 제어: break는 루프를 탈출하고, i--와 같은 인위적인 값 변경으로 루프의 흐름을 제어할 수 있다.

profile
作心百日

0개의 댓글