오류, 기능, 문제해결(JAVA)

계산기과제 레벨2

seungmin576 2025. 1. 9. 11:59

Calculator2

package com.example.calculator2;

import java.util.ArrayList;
import java.util.Scanner;

public class Calculator2 {
    private static ArrayList<Double> list = new ArrayList<>(); // 결과값 저장용 컬렉션필드
    static Scanner sc = new Scanner(System.in);
    static int[] twoNums = new int[2];  //양의 정수 2개 받는 배열

    public static void sum(int a, int b) {
        list.add((double)a + b);
        System.out.println(a + b);
    }

    public static void minus(int a, int b) {
        list.add((double)a - b);
        System.out.println(a - b);
    }

    public static void division(int a, int b) {if (b == 0) {
            System.out.println("나누기에서 분모가 0이 될 수 없음");
            return;
        }
        list.add ((double)a / b);
        System.out.println(a / (double)b);
    }

    public static void times(int a, int b) {
        list.add((double)a * b);
        System.out.println(a * b);
    }

    private static void nums(int a, int b) {    //양의 정수 판별 메소드
        if (a < 0 || b < 0) {
            System.out.println("양의 정수만 입력해주세요");
            inputNums();
        }
    }

    public static void inputNums() {
        System.out.println("양의 정수 2개를 입력해주세요");
        for (int i = 0; i < twoNums.length; i++) {
            twoNums[i] = sc.nextInt();
        }
        nums(twoNums[0], twoNums[1]);
        calculate();
    }

    private static void calculate(){
        System.out.println("기호를 입력 (+, -, /, *)");
        char ch = sc.next().charAt(0);

        switch (ch){
            case '+' :
                Calculator2.sum(twoNums[0], twoNums[1]);
                break;

            case '-' :
                Calculator2.minus(twoNums[0], twoNums[1]);
                break;

            case '/' :
                Calculator2.division(twoNums[0], twoNums[1]);
                break;

            case '*' :
                Calculator2.times(twoNums[0], twoNums[1]);
                break;

            default:
                System.out.println("잘못된 기호를 입력했습니다.");
                break;
        }

        System.out.println("정보를 수정하려면 아무키나 입력 (원하지 않을시 n 입력)");
        if(!sc.next().equals("n"))
            setList();

        System.out.println(getList());

        System.out.println("계속 하시려면 아무키나 입력 (종료를 원할 시 exit 입력)");
                if(!sc.next().equals("exit"))
                    inputNums();
    }

    private static ArrayList<Double> getList(){ // 연산 결과 출력 메서드
        System.out.print("연산했던 결과들 : ");
        return list;
    }

    private static void setList(){ //연산 결과 수정 메서드
        System.out.print("수정하실 숫자의 위치를 입력 (첫번째부터 1, 2...) : ");
        int inputNum = sc.nextInt();
        while(true) {
            if (inputNum > list.size()) {
                System.out.println("위치가 잘못됐습니다. 다시 입력하세요");
                inputNum = sc.nextInt();
            } else
                break;
        }
        System.out.print("변경되는 숫자를 입력 : ");
        int inputNum2 = sc.nextInt();
        list.set(inputNum - 1, (double) inputNum2);
    }

    public static ArrayList<Double> delete(){  //연산 결과 첫번째값 삭제 메소드
        System.out.print("첫번째 데이터 삭제 후 결과 : ");
        list.remove(0);
        return list;
    }
}

해결하기전 문제가 있던 코드입니다.

 

App

package com.example.calculator2;

import static com.example.calculator2.Calculator2.*;

public class App {

    public static void main(String[] args) {
            inputNums();    //프로그램시작
            System.out.println(delete());   //첫번째 데이터 삭제 후 결과 출력
        }
    }

실행 코드 입니다.

 

 

문제 내용

제가 작성한 코드에서 양의 정수를 입력하는 과정에서 엔터를 안치고 스페이스바를 사용하여 숫자를 3개 이상 작성하게 되면 숫자가 2개만 저장됩니다.

그리고 저장되지 못한 나머지 숫자가 기호 판별하는 메서드로 넘어가서 default의 결과를 출력하게 됍니다.

 

  1. 나머지 숫자가 기호판별 메서드로 넘어는 것을 막고
  2. 양의 정수를 2개 입력하는 메서드에서 숫자를 3개 이상 입력하면 다시 입력하게 하는 방법을 구현하고자 했습니다.

 

 

첫번째 방법

 

양의 정수를 저장하는 배열을 ArrayList로 바꿔서 해결해보려하기.

 

아래처럼 코드처럼 바꿔보고 나머지도 ArrayList에 맞는 문법으로 바꿨습니다.

 static ArrayList<Integer> twoNums = new ArrayList<>();  //양의 정수 2개 받는 배열
 .....
 ....
 .....
 .....
 
for (int i = 0; i < 2; i++) {
            int inputNums = sc.nextInt();
            twoNums.add(inputNums);
        }

        nums(twoNums.get(0), twoNums.get(1));
 private static void nums(int a, int b) {    //양의 정수 및 3개 이상 판별 메소드
        if (a < 0 || b < 0 || twoNums.size() > 2) {
            System.out.println("양의 정수가 아니던가 3개 이상입력하셨습니다.");
            inputNums();
        }
    }

그러나 이런식일 경우 문제가 전혀 해결되지 않습니다.

생각과 다르게 nums 메서드에서 size() > 2를 if문 조건에 넣더라도 안됩니다.

배열의 길이가 정수를 입력받는 메서드의 반복문에 의해 무조건 2에서 멈추고 나머지 남은 숫자는 기호판별 메서드로 들어가 버립니다.

 

 

 

두번째 방법

저는 숫자 3개 이상 입력시  남은 숫자가 표류하다가 다음 스캐너에 입력된다는 점에 중점을 두었습니다.

즉 기호판별 메서드의 char ch = sc.next().charAt(0) 코드에 남은 숫자가 들어간다는 뜻입니다.

그럼 양의 정수인지 판별하는 nums 메서드에서 스캐너를 활용하여 나머지 숫자들을 집어넣고 if문에서 판별하게 하면 어떨까라는 생각을 하게 됐습니다.

private static void nums(int a, int b) {    //양의 정수임과 숫자 2개인지 판별하는 메소드
        String str = sc.nextLine();
        if (a < 0 || b < 0 || str != null) {
            System.out.println("양의 정수가 아니거나 숫자를 3개 이상 입력하셨습니다.");
            inputNums();
        }
    }

nextLine()으로 숫자를 짱많이 사용자가 입력하여도 str 변수에 담길 거라 예상했습니다.

그리고 str 변수가 비어있지 않다면 다시 inputNums() 메서드를 호출하는 코드입니다.

즉 str이 비어있다면 숫자를 2개 입력한 것이고 비어있지 않다면 여러개 입력했다는 의미입니다.

 

 

결과 이미지

겨우 성공했습니다..

 

 

위 문제의 해결과정을 통해서 다음부터 스캐너 입력후 원하지 않게 남는 문자나 숫자의 처리를 어떻게 할지 알게 됐습니다.