트러블슈팅: Calculator Controller 및 GUI 애플리케이션의 문제 해결
개요
이번 문서에서는 CalculatorControllerApp
과 CalculatorGUI.java
를 개발하는 과정에서 발생한 문제들과 그 해결 과정을 설명합니다. 이 파일들은 연산 로직과 결과 관리, 그리고 GUI를 통한 사용자 상호작용을 담당하는 Java 애플리케이션의 핵심 구성 요소입니다.
트러블슈팅 과정
배경
이 프로젝트는 CalculatorControllerApp
에서 사칙연산을 처리하고, 그 결과를 GUI로 시각화하는 계산기 애플리케이션을 개발하는 것이 목표였습니다. 개발 도중 여러 문제가 발생하였고, 이를 해결하기 위한 디버깅 과정이 필요했습니다.
발단 및 문제 분석
1. CalculatorControllerApp
에서의 큐(Queue) 관리 문제
오류: 큐가 가득 찬 상태에서 더 이상 결과를 추가할 수 없었으며, 프로그램이 중단되었습니다.
진단: 큐가 가득 찼을 때 오래된 결과를 제거하는 로직이 적절히 처리되지 않았습니다.
poll()
메서드가 잘못된 위치에서 호출되어, 새로운 결과가 저장되지 않는 문제를 발견했습니다.해결: 큐가 가득 찼을 때 오래된 결과를 제거한 후, 새로운 결과를 추가하는 로직으로 수정하였습니다.
if (results.size() >= MAX_RESULTS) { results.poll(); // 큐가 가득 찼을 때 가장 오래된 결과 삭제 } results.add(result); // 새로운 결과 추가
2. CalculatorGUI
의 입력 오류 문제
오류: 사용자가 잘못된 형식으로 입력했을 때
NaN
이 결과창에 표시되거나, 프로그램이 멈추는 문제가 발생했습니다.진단: 잘못된 사용자 입력값이
CalculatorControllerApp
으로 전달되면서NumberFormatException
예외가 발생한 것을 확인했습니다.해결: 사용자가 입력한 값을 유효성 검사하여 숫자가 아닌 값이 전달되지 않도록 예외 처리를 추가하였습니다.
try { double num1 = Double.parseDouble(textField1.getText()); double num2 = Double.parseDouble(textField2.getText()); } catch (NumberFormatException e) { resultLabel.setText("유효하지 않은 입력입니다. 숫자를 입력하세요."); }
3. NaN
문제: 0으로 나누기
오류: 나눗셈 연산 중 분모가 0일 때
NaN
값이 발생하여 결과가 제대로 처리되지 않았습니다.진단: 나눗셈 연산에서 0으로 나눌 때
Double.NaN
이 반환된다는 것을 확인했습니다.해결: 나눗셈 연산에서 0으로 나누는 경우 오류 메시지를 표시하도록 수정했습니다.
double result = controller.calculate(num1, num2, operator); if (Double.isNaN(result)) { resultLabel.setText("오류: 0으로 나눌 수 없습니다."); } else { resultLabel.setText(String.valueOf(result)); }
추가 문제 및 해결
1. 메모리 관리 문제
오류: 큐가 가득 찬 상태에서 오래된 데이터를 삭제하지 않아 메모리 누수가 발생할 수 있었습니다.
해결: 큐의 크기를 초과할 때 가장 오래된 데이터를 삭제하도록 처리하여 메모리 누수를 방지했습니다.
if (results.size() >= MAX_RESULTS) { results.poll(); // 가장 오래된 결과 삭제 } results.add(result); // 새로운 결과 추가
2. GUI 연산자 처리 문제
오류: 연산자 선택이 제대로 작동하지 않아 모든 연산이 기본 값으로 처리되는 문제가 발생했습니다.
진단: GUI에서 버튼 클릭 시 연산자가 제대로 설정되지 않아
switch
문에서 기본 케이스로 처리되고 있었습니다.해결: 각 버튼 클릭 시 올바른 연산자를 할당하도록 수정하였습니다.
buttonAdd.addActionListener(e -> operator = "+"); buttonSubtract.addActionListener(e -> operator = "-"); buttonMultiply.addActionListener(e -> operator = "*"); buttonDivide.addActionListener(e -> operator = "/");
개선 사항
1. 입력 검증 및 예외 처리 강화
- 잘못된 입력, 예를 들어 여러 개의 소수점이나 빈 입력 등 유효하지 않은 입력을 방지하기 위해 입력값에 대한 검증 로직을 추가했습니다. 예외 처리를 강화하여 0으로 나누는 연산 등에서 오류가 발생하지 않도록 했습니다.
2. GUI 레이아웃 개선
- 버튼과 텍스트 필드를 중앙에 정렬하여 UI의 가독성을 높였습니다. 버튼 간 간격과 텍스트 필드의 배치가 좀 더 일관성 있게 배치되도록 조정하여 사용자 경험을 향상시켰습니다.
3. 코드 구조 개선
- 메서드를 작은 단위로 분리하여 유지보수와 가독성을 높였습니다. 변수명을 좀 더 직관적으로 변경하여 코드 이해도를 높였습니다.
결론
이와 같은 문제를 해결한 후, CalculatorControllerApp
과 CalculatorGUI
는 예상대로 작동하였습니다. 연산 결과는 큐에 정확하게 저장되고, GUI에서는 올바른 결과가 화면에 출력되었습니다. 이 트러블슈팅 과정을 통해 프로젝트 개발 중 발생할 수 있는 문제를 디버깅하는 데 필요한 유효성 검사, 예외 처리, 메모리 관리의 중요성을 다시 한 번 확인할 수 있었습니다.
- 도전과제 완료
- 따라서 영상 다시찍어야하지만
- 영상 필수도 아니고 windows 계산기도 갖고 있던 문제를 해결했다 수준의 영상이라
- 그대로 둡니다
- 방금(다음날인 월요일) 튜터님께 갔다왔는데
- 저 윈도우 계산기가 등차수열, 계속 더하는데 도움되긴한다고 하셔서 역시 설계의 차이인거 같습니다
- 문제점은 아니라고 볼 수 있겠네요 정정하겠습니다
'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 Console (0) | 2024.09.06 |