인프런 커뮤니티 질문&답변

geonhee님의 프로필 이미지
geonhee

작성한 질문수

김영한의 실전 자바 - 중급 1편

문제와 풀이2

로또 메서드 질문

작성

·

160

0

화면 캡처 2024-06-26 191346.png

main 화면에서 출력하는 코드를 위와 같이 작성한 후에

화면 캡처 2024-06-26 191321.png

이렇게 번호 생성 메서드와 중복 확인 메서드 그리고 출력 메서드를 나누어서 코드를 작성했더니

결과가 0,0,0,0,0,0 이렇게 나오는데

어느 부분이 잘못된 건지 알 수 있을까요?

답변 2

0

안녕하세요. geonhee님, 공식 서포터즈 OMG입니다.

RandomTest2의 main() 시작에서 int[] Nums를 생성한 다음 이 배열에 데이터를 담아서 다음 호출하는 메서드들이 유기적으로 동작해야하는데, Nums[] 배열에 값을 담는 행위가 2개의 메서드 내에 존재하지 않습니다.

Nums[]배열을 가지고 동작한다는 것을 유념하여 확인해보시면 해결 하실 수 있을거라 생각합니다.

이 점을 참고하여 확인해보시고, 해결이 안될 경우 댓글 남겨주세요 😀

감사합니다.

geonhee님의 프로필 이미지
geonhee
질문자

이미 main()에서 int[] Nums를 선언하고

각 메서드에는 해당 배열을 입력할 수 있도록 설정하였는데

각 메서드마다 new int[]; 를 통해서 배열을 생성해주어야 한다는 말씀이신가요??

 

향상된 for문에서 Nums[i]의 값을 개별적으로 설정할 수 없어서

일반 for문으로 작성해야 하는 것으로 생각했는데

위와 같은 생각은 잘못된 생각인가요??

답변을 작성하다보니, 어느 부분에서 놓치신것인지 알것 같습니다.

향상된 for문을 사용할 경우, 아마 기대하신 동작과 다르게 동작하여 질문을 남겨주셨네요.

아래와 같은 코드가 있을 때, 향상된 for문을 순회하면서 배열의 아이템에 값을 담으면 될 것이라고 생각하신 것 같습니다.

public class RandomTest2 {

    public static void main(String[] args) {
        int[] Nums = new int[4]; // [0,0,0,0]
        for (int num : Nums) {
            num = 1; // 기댓값: [1,1,1,1]
        }
        for (int num : Nums) {
            System.out.println(num);
        }
    }
}

하지만 결과를 직접 출력해보시면 아시겠지만,

결과는

1

1

1

1 이 아닌,

0

0

0

0

을 출력합니다.

첫 번째 향상된 for문에서 num 변수는 Nums 배열의 각 요소를 복사한 값입니다.

배열의 요소가 아닌 값에 1을 할당하므로 배열의 실제 값은 변경되지 않습니다.

따라서 두 번째 for문의 요소들을 출력할 때, 모든 값은 초기화된 값인 0을 출력합니다.

.

이 개념을 이해하셨다면 작성하신 아래의 코드에 왜 로또번호가 담기지 않았는지 이해되실거라 생각합니다.

 

private static void generator(int[] Nums) {
   Random random = new Random();
   for (int num : Nums) {
       int randomNum = random.nextInt(45) + 1;
       if (isUnique(Nums, randomNum)) {
            num = randomNum;
       }
   }
}

코드를 단순화 하여 정리해서 보면 아래와 같습니다.

private static void generator(int[] Nums) {
    Random random = new Random();
    for (int num : Nums) {
        num = random.nextInt(45) + 1; // 예) [5,17,2,35,11,33]
    }  
    for (int num : Nums) {
        System.out.println(num); // 실제 출력: [0,0,0,0,0,0]
    }          
}

 앞선 0과 1의 예제와 동일한 관점으로 보시면 될 것 같습니다.

 

실제 코드로 확인(23~25번째 줄 추가)

image

출력 결과

image

향상된 for문의 이러한 문제를 해결하기 위해 인덱스 기반의 for문을 사용하셔야 합니다.

 

0

안녕하세요, 인프런 AI 인턴입니다.

geonhee님의 질문과 관련하여, 로또 번호 생성 및 중복 확인 관련하여 비슷한 질문에 대한 답변을 찾았습니다.

1. 섹션 4. 문제와 풀이2

이 질문에서는 LotteGenerator 클래스를 사용하여 로또 번호를 생성하는 과정과 final 키워드 사용의 이유를 묻는 질문입니다. 여기에 대한 답변에서는 final 키워드에 대한 설명과 함께 로또 번호 생성기의 설계에 대한 조언이 제공됩니다. 이는 geonhee님의 질문과는 직접적인 관련이 없어 보이지만, 로또 번호 생성기의 구조와 관련된 내용을 포함하고 있어 유용할 수 있습니다.

2. 로또문제 isUnique메소드 질문

이 질문과 답변은 isUnique 메서드의 작동 방식과 관련된 내용을 다룹니다. 특히, isUnique 메서드의 로직을 이해하는 데 어려움을 겪는 질문자에게 구체적인 설명을 제공하여 로직의 이해를 돕습니다. geonhee님의 질문에서 발생한 0,0,0,0,0,0 출력 문제가 중복 검사 로직의 오류로 인한 것일 수 있어 본 내용이 도움 될 수 있습니다.

3. 섹션 4. Lotto 문제 오름차순 정렐

본 질문에서는 로또 번호를 오름차순으로 정렬하는 방법에 대한 설명을 찾을 수 있습니다. 이는 직접적으로 geonhee님의 문제 해결에는 기여하지 않지만, 로또 번호 생성 후 처리 방법에 대한 이해를 높이는데 도움 될 수 있습니다.

4. 문제를 스스로 풀면서

이 질문과 답변에서는 다른 방식으로 로또 번호 생성 로직을 구현한 예시와 그에 대한 피드백을 제공합니다. 비록 질문 내용이 geonhee님의 문제와 직접적으로 관련되지는 않으나, 다양한 로직 구현 방법에 대한 이해를 돕습니다.

질문 내용을 바탕으로 볼 때, 결과가 0,0,0,0,0,0으로 출력되는 문제는 generator 메서드에서 유니크한 숫자를 Nums 배열에 올바르게 할당하지 못하는 로직 문제일 가능성이 높습니다. 특히, 이미 배열에 존재하는 숫자를 제외하고 새 숫자를 배열에 추가하는 로직을 재검토할 필요가 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

geonhee님의 프로필 이미지
geonhee

작성한 질문수

질문하기