내일배움캠프 9일차 TIL - 실습회고(nextDouble 엔터키소비)

iy·2023년 12월 29일

TIL

목록 보기
8/37

실습 : 0.0~10.0 사이에 원하는 점수 입력 입력한 점수 소수점 뺀 자연수만큼 원하는 문장 입력
입력 끝난 후 입력한 점수, 소수점 뺀 자연수, 입력한 문장들 출력

  • 수정 전 코드
		Scanner scan = new Scanner(System.in);

        System.out.println("0.0~10.0까지 점수를 입력하세요");
        double score;
        while(true) {
            score = scan.nextDouble();
            if(score < 0.0 || score > 10.0){
                System.out.println("점수는 0.0~10.0까지만 입력 가능합니다. 다시 입력해주세요~");
                continue;
            }
            break;
        }
        
        int newScore = (int)score;
        System.out.println(score + " 미만의 자연수는 " + newScore+" 입니다.");
        System.out.println(newScore+ " 번 원하는 문장을 입력해보세요.");
        String[] arr = new String[newScore];
        for (int i = 0 ; i < newScore ; i++){
            arr[i] = i+1 + ". " +scan.nextLine();
        }

        scan.close();

        System.out.println("\n*******************************\n");
        System.out.println("입력한 점수 : " + score);
        System.out.println("입력한 문장들");
        for (String i : arr)
            System.out.println(i);

🐛 문제 발생
: 의도한 수 보다 한번 적게 문장을 입력할 수 있었다.

출력도 첫번째 문장이 출력되어야 할 곳에 빈 문자열만 출력되었디.

💡 원인
: nextDouble()은 엔터키를 소비하지 않고 버퍼에 저장해둔다. 따라서 소비되지 않은 엔터키가 다음 번 문장 입력시 nextLine()에서 한번 소비가 되었다.

⛏ 해결 방법
nextLine()으로 엔터키를 먼저 소비해주고 문장을 입력 받는다.

  • 수정된 코드
		Scanner scan = new Scanner(System.in);

        System.out.println("0.0~10.0까지 점수를 입력하세요");
        double score;
        while(true) {
            score = scan.nextDouble();
            if(score < 0.0 || score > 10.0){
                System.out.println("점수는 0.0~10.0까지만 입력 가능합니다. 다시 입력해주세요~");
                continue;
            }
            break;
        }
        
        // 엔터키 소비
        scan.nextLine();
        
        int newScore = (int)score;
        System.out.println(score + " 미만의 자연수는 " + newScore+" 입니다.");
        System.out.println(newScore+ " 번 원하는 문장을 입력해보세요.");
        String[] arr = new String[newScore];
        for (int i = 0 ; i < newScore ; i++){
            arr[i] = i+1 + ". " +scan.nextLine();
        }

        scan.close();

        System.out.println("\n*******************************\n");
        System.out.println("입력한 점수 : " + score);
        System.out.println("입력한 문장들");
        for (String i : arr)
            System.out.println(i);

👀
간단한 문제임에도 굳이 남겨놓는 이유는 예전에 같은 실수를 한 적이 있었다. 그때 확실히 알았다고 생각했었는데 같은 실수를 하니까 아쉬운 마음도 크고 반성하게 됐다.
앞으로는 아무리 간단한 문제라도 복습하는 마음으로 남겨놓아야겠다.

0개의 댓글