[문제]
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'로 바꾸었다. 영어 공부도 어떻게든, 조금씩이라도 병행해야겠다고 마음먹었다. 역시 뭔가에 이름을 붙여주기는 쉽지 않다.
'오답 노트-자바(Java)' 카테고리의 다른 글
24.11.22(금) "1111 말고 1234 출력하기 by static" (2단계 키오스크) (0) | 2024.11.24 |
---|---|
24.11.22(금) "1111 말고 1234 부탁드려요. 제발요!" (2단계 키오스크) (0) | 2024.11.24 |
24.11.06(수) "뭐야, 내 3만 원 돌려줘요." (0) | 2024.11.07 |
24.11.03(일) "i냐 g냐, 그것이 문제로다." (0) | 2024.11.03 |
24.11.03(일) "int indexN < nations.length;" (0) | 2024.11.03 |