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 활용