Troubleshooting: 무엇이 문제였는가?/본캠프 2주 차: 계산기 만들기

2단계: sc.nextLine(); vs sc.next();

writingforever162 2024. 11. 19. 16:53

[문제]

package com.project.personal.calculator;

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("첫 번째 숫자를 입력해 주세요: ");
        int numFirst = sc.nextInt();

        System.out.print("사칙연산 기호(+, -, *, /) 중 하나를 입력해 주세요: ");
        String operator = sc.nextLine();
        // [원인 추측] print 대신 println이라고 해야 했나? 

        System.out.print("두 번째 숫자를 입력해 주세요: ");
        int numSecond = sc.nextInt();

        Calculator test = new Calculator();

        String outcome = Integer.toString(test.calculate(numFirst, operator, numSecond));
        System.out.println("연산한 결과는 "+outcome+"입니다.");
    }
}

이제는 Scanner 클래스를 자연스럽게 쓴다고 속으로 흥얼거리기도 잠시, 사칙 연산을 입력해야 할 곳 옆에 두 번째 숫자를 입력해 달라는 문장이 출력되었다. 처음에는 print() 메서드 때문인 줄 알고 println() 메서드로 수정한 다음 다시 프로그램을 실행했다. 

 

[추측]

package com.project.personal.calculator;

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("첫 번째 숫자를 입력해 주세요: ");
        int numFirst = sc.nextInt();
 
        System.out.println("사칙연산 기호(+, -, *, /) 중 하나를 입력해 주세요: ");
        String operator = sc.nextLine();
        // [수정 전] print
        // [수정 후] println
        // [수정 결과] 문제가 해결되지 않음

        System.out.print("두 번째 숫자를 입력해 주세요: ");
        int numSecond = sc.nextInt();

        Calculator test = new Calculator();

        String outcome = Integer.toString(test.calculate(numFirst, operator, numSecond));
        System.out.println("연산한 결과는 "+outcome+"입니다.");
    }
}

추측은 보기 좋게 틀렸다. 3434를 입력하니 '사칙연산 기호(+. -, *, /) 중 하나를 입력해 주세요: ' 문장과 '두 번째 숫자를 입력해 주세요: ' 문장이 동시에 출력되었다. 두 문장이 한 줄에 나오느냐 아니냐 외에는 문제가 해결되지 않았다. 튜터님을 또 다시 찾아간 뒤에야 진짜 원인을 찾을 수 있었다.

 

[원인]

package com.project.personal.calculator;

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("첫 번째 숫자를 입력해 주세요: ");
        int numFirst = sc.nextInt();

        System.out.print("사칙연산 기호(+, -, *, /) 중 하나를 입력해 주세요: ");
        String operator = sc.next();
        // [오답] sc.nextLine();
        // [정답] sc.next();

        System.out.print("두 번째 숫자를 입력해 주세요: ");
        int numSecond = sc.nextInt();

        Calculator test = new Calculator();

        String outcome = Integer.toString(test.calculate(numFirst, operator, numSecond));
        System.out.println("연산한 결과는 "+outcome+"입니다.");
    }
}

원인은 nextLine()과 next()를 정확히 모르는 데 있었다. nextLine()은 '별도로 값을 받지 않고 다음 줄을 받겠다'를 의미했다. 계산기에서는 사칙연산 기호라는 문자열을 받아야 했으므로, next()를 써야 했다. 

만약 무엇을 써야 하는지 헷갈린다면 next를 입력할 시 정말 메서드가 나오므로 상황에 맞게 골라 쓰면 되었다.

 

[해결]

package com.project.personal.calculator;

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("첫 번째 숫자를 입력해 주세요: ");
        int numFirst = sc.nextInt();

        System.out.print("사칙연산 기호(+, -, *, /) 중 하나를 입력해 주세요: ");
        String operator = sc.next();
        // 입력받으려는 값이 문자열(String)이므로 next()메서드를 썼다.

        System.out.print("두 번째 숫자를 입력해 주세요: ");
        int numSecond = sc.nextInt();

        Calculator test = new Calculator();

        String outcome = Integer.toString(test.calculate(numFirst, operator, numSecond));
        System.out.println("연산한 결과는 "+outcome+"입니다.");
    }
}

다행히 Calculator 클래스로 생성한 test 객체는 잘 작동했다. 겸사겸사 어제 사과를 여러 개 만들면서 사용한 Integer.toString() 메서드도 함께 사용했다.