트러블슈팅: Calculator Console 애플리케이션의 오류 및 디버깅
개요
스파르타코딩클럽의 자바강의 중 생긴 자바 과제에서 non-Class-File인(정정, Class가 하나인) Java 기반의 Calculator Console 애플리케이션을 개발하는 과정에서 발생한 여러 문제와 그 해결 과정을 다룹니다.
트러블슈팅 과정
배경:
이 프로젝트는 기본적인 산술 연산을 수행하는 콘솔 기반 Calculator Console 애플리케이션을 만드는 것이 목표였습니다. 사용자가 입력한 숫자와 연산자를 바탕으로 덧셈, 뺄셈, 곱셈, 나눗셈을 수행하는 기능을 구현했습니다. 그러나 개발 과정에서 여러 가지 문제를 맞닥뜨렸고, 이를 해결하며 애플리케이션을 개선했습니다.
발단
초기 CalculatorConsole.java 파일을 실행하면서 발생한 주요 문제는 다음과 같습니다:
- 유효하지 않은 입력: 숫자 대신 문자열을 입력하면
NumberFormatException
이 발생. - 0으로 나누기: 나눗셈 연산에서 분모가 0일 때
ArithmeticException
이 발생하여 프로그램이 중단. - 연산자 오류 처리: 유효하지 않은 연산자를 입력했을 때, 이를 처리하는 로직이 없었습니다.
조사 및 진단
- 입력 유효성 검사 실패:
- 오류: 사용자로부터 숫자를 입력받는 과정에서, 비숫자 입력 시
NumberFormatException
이 발생. - 진단: 사용자가 입력한 값이 숫자가 아닐 때 예외 처리가 없었기 때문에 발생한 문제였습니다.
- 해결: 문자열 입력을 받아 숫자로 변환하는 과정에서
try-catch
구문을 추가하여 비숫자 입력을 처리했습니다. try { Double num = Double.parseDouble(input); } catch (NumberFormatException e) { System.out.println("유효하지 않은 숫자입니다. 다시 입력하세요."); }
- 오류: 사용자로부터 숫자를 입력받는 과정에서, 비숫자 입력 시
- 0으로 나누기 처리:
- 오류: 나눗셈 연산에서 분모가 0일 경우
ArithmeticException
이 발생하여 프로그램이 중단. - 진단: 분모가 0인 경우를 고려하지 않았기 때문에 발생한 문제.
- 해결: 분모가 0일 경우 예외 처리를 추가하여 적절한 메시지를 출력하도록 수정.
if (b == 0) throw new ArithmeticException("0으로 나눌 수 없습니다.");
- 오류: 나눗셈 연산에서 분모가 0일 경우
- 유효하지 않은 연산자 처리:
- 오류: 잘못된 연산자 입력 시 이를 처리하는 로직이 없어 예상치 못한 동작이 발생.
- 진단: 연산자를
enum
으로 정의하여 유효한 연산자만 허용하고, 잘못된 연산자는null
로 처리하여 오류 메시지를 출력. - 해결: 잘못된 연산자가 입력될 경우, 오류 메시지를 출력하고 다시 입력을 받도록 수정.
if (operation == null) { System.out.println("오류: 유효하지 않은 연산자입니다."); continue; }
새로운 문제
기본적인 오류를 해결한 후에도 새로운 문제들이 발생했습니다:
- 연산자 우선순위 미처리: 곱셈과 덧셈이 함께 사용될 때 연산 우선순위가 적용되지 않음.
- 계산 종료 반복 로직: 종료 조건을 사용자가 명확하게 인지하지 못함.
해결 접근법
- 연산자 우선순위:
곱셈과 나눗셈이 덧셈과 뺄셈보다 먼저 계산되도록 수정할 수 있습니다. 현재 코드에서는 이를 고려하지 않았지만, 추가적으로 수식을 파싱하여 우선순위를 처리하는 로직을 적용하는 것이 향후 개선사항입니다. - 계산 반복 여부:
사용자가 계산을 계속할지 종료할지를 명확하게 알 수 있도록exit
를 입력받아 프로그램을 종료할 수 있게 했습니다. System.out.println("계산을 계속하려면 'y'를 입력하고, 종료하려면 'exit'를 입력하세요.");
결론
수정된 Calculator Console 애플리케이션은 예상대로 작동하며, 덧셈, 뺄셈, 곱셈, 나눗셈이 제대로 수행됩니다. 주요 오류를 해결한 후에도 테스트를 통해 코드의 완성도를 높였습니다.
교훈
- 입력 유효성 검사는 필수: 비유효한 입력을 처리하는 로직이 필요합니다.
- 예외 처리는 안정성에 필수:
ArithmeticException
과 같은 경계 사례에 대한 대비가 필수적입니다. - 코드 가독성 및 모듈화: 기능을 모듈화하여 유지보수성을 높입니다.
'TIL > 스파르타 자바공부기간' 카테고리의 다른 글
[내일배움캠프] Spring 1차 숙제 (0) | 2024.09.30 |
---|---|
[내일배움캠프] 두번째 과제, ERD 다이어그램: BaseballGameCLI (0) | 2024.09.23 |
[내일배움캠프] 두번째 과제, ERD 다이어그램: BaseballGameGUI (0) | 2024.09.21 |
[내일배움캠프] 두번째 과제, 트러블슈팅: BaseballGameGUI (0) | 2024.09.13 |
[내일배움캠프] 첫번째 과제, 트러블슈팅: Calculator GUI (0) | 2024.09.07 |