java
자바 - 계산기 과제 Lv3. 트러블슈팅(수정중)
에그마요샌드위츼
2025. 3. 6. 02:39
개요 - 요구사항 정의 및 설계
1.1 기능 요구사항 정의
- 기본 연산 기능 제공 (덧셈, 뺄셈, 곱셈, 나눗셈)
- 숫자 입력 기능 (정수 및 소수점), 키보드 입력 지원은 선택(못함)
- 연산자 입력 기능 (+, -, ×, ÷)
- 계산 결과 출력 기능
- 초기화 (C) 기능
- 연산 수행 후에도 추가 입력을 받아 연속 계산 가능
- 예외 처리 (잘못된 입력, 0으로 나누기 등)
1.2 비기능 요구사항
- GUI 구성 - Java Swing 사용
- 직관적인 UI 구성 ( 못함 )
- 화면 크기에 맞게 자동 조정되는 UI ( 못함 )
2. 사용자 인터페이스 설계
2.1 화면 구성
- `JFrame` 을 상속받아 메인 윈도우 구성
- `JPanel`을 사용해 버튼&디스플레이 구성
- `JTextField` 로 결과 출력 영역 구현
- `JButton`으로 숫자 버튼 및 연산 버튼 배치
public class CalculatorGUI extends JFrame implements ActionListener{
private JTextField display; // 연산 결과를 띄우는 창
public CalculatorGUI(){
...
//결과창
display = new JTextField();
//버튼 패널
JPanel buttonPannel = new JPanel();
...
//숫자 및 연산자 버튼
String[] buttons = { 1~9, 연산자 등 버튼에 표시될 텍스트 }
...
// 새로운 객체에 반복문으로 배열에 저장된 문자열을 text에 추가
for(String text : buttons) {
JButton button = new JButton(text);
button.addActionListener(this); //button에 리스너 추가,
buttonPannel.add(button);
}
}
}
2.2 클래스 설계
클래스명 | 역할 |
App | 프로그램 실행 |
CalculatorGUI | 메인 프레임 생성 및 UI 구성 |
ArithmeticCalculator | 계산 기능 로직 |
OperatorType | 열거형 |
CalculatorGUI.java
GUI 구성 후 버튼 클릭에 대한 이벤트 메서드를 작성
트러블슈팅(1) - enum 타입의 사용
1. enum 값 비교에 ==을 사용했던 문제
1. 문제? 발생
- enum 타입에 이해가 제대로 되지 않은 상태에서 사용을 해볼려고 했다. 실제 실행에서 큰 오류가 발생하지 않았지만 다음과 같이 떴기에 이부분에 대해서 더 좋은 방법을 찾아보고 수정을 했다.
- Enum은 열거형(Enumeration)의 줄임말로, 일련의 관련된 상수들을 정의하고 사용하는 자료형이고 Enum의 상수는 객체로 취급된다.
- `==`는 값은 객체의 참조를 비교하는데, String은 객체이므로 `equals( )` 사용이 안전하다.
- if문은 직관적이지 않다.
2. 접근 방법, 그리고 해결
- switch문 사용하여 operator 변수의 값에 따라 각각의 경우(case)에 해당하는 코드 블록이 실행되게 함.
public enum OperatorType {
ADD,SUBTRACT, MULTIPLY, DIVIDE, PERCENT;
// 연산자 이름을 문자열로 반환하는 메소드
public static OperatorType fromString(String operator) {
return switch (operator) {
case "+" -> ADD;
case "-" -> SUBTRACT;
case "×" -> MULTIPLY;
case "÷" -> DIVIDE;
case "%" -> PERCENT;
default -> throw new IllegalArgumentException("알 수 없는 연산자: " + operator);
};
}
}
2. enum 값을 잘못 변환하기
1. 문제
- 계산기에 `=`를 누르면 다음과 같은 오류가 떴다.
- ` IllegalArgumentException: 알 수 없는 연산자`예외는 ` ArithmeticCalculator` 처리할 때 발생하는 문제
- ` OperatorType`을 처리하는 과정에서 이 enum 타입에 정의되지 않은 연산자가 입력되었을 때 예외 발생
2. 접근 방법
- 코드를 다시 짚어보기,
- GUI 로 입력받은 command가 OperatorType으로 변환되지 않은 것을 확인
- 예를 들어 `"+"` 가 들어오면 `OperatorType.ADD` 를 반환해야 하는데 타입변환을 안해주어 다른 값이 들어오게 된 거다.
else if(command.matches("[/*\\-+]")){
num1 = Double.parseDouble(display.getText()); //현재 display에 표시된 값을 num1에 저장후
operator = operator.command;
isNewInput = true;
}
3. 해결
operator = OperatorType.fromString(command);
- 다음 부분을 수정하면 계산 결과가 나온다
트러블슈팅(2) - 제네릭 활용이 안되는 문제
문제.
- 클래스 자체가 `T extends Number`로 선언되었지만, 실제 메서드에서는 `double` 타입만 사용하고 있다.
- ㄹㅇ
수정중..............................
더보기
가벼운 이슈
문제. + , - 는 되는데 * 가 안됨
2. 접근 방법
- 곱셈을 눌러도 결과가 출력되지 않는 문제는 `operatorToString( )` 메소드에서 반환값이 잘못 설정되어 있을 가능성이 크다. 그래서 확인한 결과 진짜였다. wow~
- 연산자가 눌렸는데 계산이 진행되지 않는거라면 현재 정규식에서 `"*"`을 올바르게 인식하지 못하는 듯
- `else if (command.matches("[/*\\-+]"))` 대신 `"÷×-+".contains(command)` 사용하니 정상 작동!
- matches( )
- contains( )
- ÷, × 등의 기호 인식의 문제였던 거 같다.
못 만든 부분 - 람다 & 스트림 활용 부분은 진행하지 못함
사유 : 아직 생소한 개념이라 어렵다. 더 개념을 공부해봐야겠다.
그리고 마감일이 내일인 줄 알았다 ㅎㅎ

어려웠던점
1. 계산기를 GUI로 만들어보고 싶어서 도전했다가 JFrame부터 처음 듣는 거라 어려움을 느꼈다. 계산기 화면을 구현하는 거 부터 막막해서 검색을 많이 했다.
2. 추가 기능을 더 넣고 싶지만 개념에 대한 이해가 부족했다. 놓칠뻔한 제네릭 활용, 제대로 쓴 건지 모르는 Enum 활용