오답 노트-자바(Java)

24.11.13(수) "변수 전용 작명소는 없나요?" (1단계 계산기)

writingforever162 2024. 11. 24. 18:05

[문제]

import java.util.Scanner;

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

        while (true) {
            System.out.print("0 이상인 첫 번째 정수를 한 개 입력해 주세요: ");
            int numOne = sc.nextInt();
            System.out.print("0 이상인 두 번째 정수를 한 개 입력해 주세요: ");
            int numTwo = sc.nextInt();
            sc.nextLine();
            System.out.print("+, -, *, / 기호 중 하나를 골라서 입력해 주세요: ");
            String calculationByFourTypes = sc.nextLine();
            // [문제] 이 변수명은 왜 좋지 않다고 할까?

            if (calculationByFourTypes.equals("+")) {
                System.out.println(numOne + " 더하기 " + numTwo + " 결과는 " + (numOne + numTwo) + "입니다.");
            } else if (calculationByFourTypes.equals("-")) {
                System.out.println(numOne + " 빼기 " + numTwo + " 결과는 " + (numOne - numTwo) + "입니다.");
            } else if (calculationByFourTypes.equals("*")) {
                System.out.println(numOne + " 곱하기 " + numTwo + " 결과는 " + (numOne * numTwo) + "입니다.");
            } else if (calculationByFourTypes.equals("/")) {
                if (numTwo == 0) {
                    System.out.println("나눗셈 연산에서 분모(두 번째 정수)에 0은 올 수 없습니다.");
                } else {
                    System.out.println(numOne + " 나누기 " + numTwo + " 결과는 " + ((double) numOne / numTwo) + "입니다.");
                }
            } else {
                System.out.println("부호를 잘못 입력하였습니다.");
                System.out.println("확인 후 다시 입력해 주세요.");
                System.out.println("프로그램을 종료합니다.");
                System.exit(0);
            }
            System.out.print("프로그램을 종료하시겠습니까? 종료를 원하시면 exit을 입력해 주세요: ");
            String question = sc.next();
            if (question.equals("exit")) {
                System.out.println("네, 알겠습니다. 프로그램을 종료합니다.");
                break;
            }
        }
    }
}

트러블슈팅(Troubleshooting)까진 아니지만, 앞으로 수많은 변수를 명명해야 하는 만큼 복습 차원에서 적어두기로 했다. 처음에는 사칙연산에 해당하는 부분이라 잘 지은 줄 알았는데, 팀원분의 의견을 듣고 나니 왜 좋지 않은 이름인지 바로 깨달을 수 있었다.

 

[원인]

좋지 않다는 평을 받은 이유는 'ByFourTypes'라고 지은 데에 있었다. 확장성과 유지 보수를 고려하지 않은 변수명이나 마찬가지였다. 지금은 몫을 구하는 연산자(/)만 있으나, 만약 나머지를 구하는 연산자(%)를 추가한다면? 그러면 Four 대신 Five라고 적어야 했다. 연산자 개수가 바뀔 때마다 변수명을 고쳐야 한다니. 보통 번거로운 일이 아니었다.

 

[해결]

import java.util.Scanner;

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

        while (true) {
            System.out.print("0 이상인 첫 번째 정수를 한 개 입력해 주세요: ");
            int numOne = sc.nextInt();
            System.out.print("0 이상인 두 번째 정수를 한 개 입력해 주세요: ");
            int numTwo = sc.nextInt();
            sc.nextLine();
            System.out.print("+, -, *, / 기호 중 하나를 골라서 입력해 주세요: ");
            String operator = sc.nextLine();
            // [수정 전] calculationByFourTypes
            // [수정 후] operator

            if (operator.equals("+")) {
            // [수정 전] calculationByFourTypes
            // [수정 후] operator
                System.out.println(numOne + " 더하기 " + numTwo + " 결과는 " + (numOne + numTwo) + "입니다.");
            } else if (operator.equals("-")) {
            // [수정 전] calculationByFourTypes 
            // [수정 후] operator
                System.out.println(numOne + " 빼기 " + numTwo + " 결과는 " + (numOne - numTwo) + "입니다.");
            } else if (operator.equals("*")) {
            // [수정 전] calculationByFourTypes
            // [수정 후] operator
                System.out.println(numOne + " 곱하기 " + numTwo + " 결과는 " + (numOne * numTwo) + "입니다.");
            } else if (operator.equals("/")) {
            // [수정 전] calculationByFourTypes
            // [수정 후] operator
                if (numTwo == 0) {
                    System.out.println("나눗셈 연산에서 분모(두 번째 정수)에 0은 올 수 없습니다.");
                } else {
                    System.out.println(numOne + " 나누기 " + numTwo + " 결과는 " + ((double) numOne / numTwo) + "입니다.");
                }
            } else {
                System.out.println("부호를 잘못 입력하였습니다.");
                System.out.println("확인 후 다시 입력해 주세요.");
                System.out.println("프로그램을 종료합니다.");
                System.exit(0);
            }
            System.out.print("프로그램을 종료하시겠습니까? 종료를 원하시면 exit을 입력해 주세요: ");
            String question = sc.next();
            if (question.equals("exit")) {
                System.out.println("네, 알겠습니다. 프로그램을 종료합니다.");
                break;
            }
        }
    }
}

변수명은 '연산자'를 의미하는 'operator'로 바꾸었다. 영어 공부도 어떻게든, 조금씩이라도 병행해야겠다고 마음먹었다. 역시 뭔가에 이름을 붙여주기는 쉽지 않다.