# Coding/Java

자바 응용 계산기 프로그램

hxodoo.cookie 2023. 11. 21. 23:11

 

Java는 객체 지향 프로그래밍 언어로, 다양한 플랫폼에서 실행될 수 있는 강력한 애플리케이션을 개발하는 데 널리 사용됩니다. 이번 프로젝트에서는 Java언어와 간단한 GUI 요소를 사용하여 간단하지만 기능적인 계산기 프로그램을 만드는 과정을 살펴보겠습니다.

 

 

 

계산기 프로그램

 

 

 

개발 과정

 

1. 환경 설정

 

먼저, 자바 개발 환경을 설정합니다.

- Java 개발 키트(JDK) 설치
- 통합 개발 환경(IDE) 선택 → (ex) Eclipse, IntelliJ IDEA

 

 

새로운 프로젝트를 생성하고, 필요한 패키지와 클래스를 추가합니다.

 

 

package calculator;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

 

 

 


2. 기본 구조 설계

 

Swing 라이브러리를 사용하여 계산기의 기본적인 GUI(그래픽 사용자 인터페이스)를 디자인합니다. 각 버튼은 ActionListener를 통해 클릭 이벤트를 처리할 것입니다.

 

 

public class CalculatorGUI extends JFrame {
    private JTextField display;

    public CalculatorGUI() {
        // 프레임 설정
        setTitle("간단한 계산기");
        setSize(300, 400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        // 디스플레이 설정
        display = new JTextField();
        display.setEditable(false);
        add(display, BorderLayout.NORTH);

        // 버튼 패널 추가
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new GridLayout(4, 4));
        addButtons(buttonPanel);
        add(buttonPanel, BorderLayout.CENTER);

        // 프레임 표시
        setVisible(true);
    }

    private void addButtons(JPanel panel) {
        String[] buttonLabels = {
                "7", "8", "9", "/",
                "4", "5", "6", "*",
                "1", "2", "3", "-",
                "0", ".", "=", "+"
        };

        for (String label : buttonLabels) {
            JButton button = new JButton(label);
            button.addActionListener(new ButtonClickListener());
            panel.add(button);
        }
    }

    private class ButtonClickListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            // 각 버튼 클릭에 대한 로직 구현
            // TODO: 계산 로직 추가
        }
    }

    public static void main(String[] args) {
        new CalculatorGUI();
    }
}

 

 

 


3. 계산 로직 구현

 

이제 각 버튼 클릭에 대한 산술 연산 로직(더하기, 빼기, 곱하기, 나누기)을 구현합니다. 스택을 활용하여 간단한 계산을 수행하고 결과를 디스플레이에 표시합니다.

 

 

private class ButtonClickListener implements ActionListener {
    private StringBuilder input = new StringBuilder();
    private Calculator calculator = new Calculator();

    public void actionPerformed(ActionEvent e) {
        String actionCommand = e.getActionCommand();

        if (actionCommand.equals("=")) {
            try {
                double result = calculator.evaluate(input.toString());
                display.setText(String.valueOf(result));
                input.setLength(0); // 입력 초기화
            } catch (ArithmeticException ex) {
                display.setText("Error");
                input.setLength(0);
            }
        } else {
            input.append(actionCommand);
            display.setText(input.toString());
        }
    }
}

public class Calculator {
    public double evaluate(String expression) {
        String[] tokens = expression.split(" ");
        Stack<Double> stack = new Stack<>();

        for (String token : tokens) {
            if (isNumeric(token)) {
                stack.push(Double.parseDouble(token));
            } else {
                double operand2 = stack.pop();
                double operand1 = stack.pop();
                double result = performOperation(operand1, operand2, token);
                stack.push(result);
            }
        }

        return stack.pop();
    }

    private boolean isNumeric(String str) {
        try {
            Double.parseDouble(str);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    private double performOperation(double operand1, double operand2, String operator) {
        switch (operator) {
            case "+":
                return operand1 + operand2;
            case "-":
                return operand1 - operand2;
            case "*":
                return operand1 * operand2;
            case "/":
                if (operand2 == 0) {
                    throw new ArithmeticException("Cannot divide by zero");
                }
                return operand1 / operand2;
            default:
                throw new IllegalArgumentException("Invalid operator: " + operator);
        }
    }
}

 

 

 

 

5. 테스트 및 디버깅

 

테스트를 위한 JUnit 라이브러리를 추가합니다.

 

 

package calculator;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

 

 


JUnit을 사용하여 간단한 테스트 케이스를 작성합니다. 계산기의 핵심 기능인 evaluate 메서드에 대한 테스트를 수행합니다.

 

 

public class CalculatorTest {

    @Test
    void testEvaluate() {
        Calculator calculator = new Calculator();

        // 기본 덧셈 테스트
        assertEquals(5, calculator.evaluate("2 + 3"));

        // 기본 뺄셈 테스트
        assertEquals(1, calculator.evaluate("4 - 3"));

        // 기본 곱셈 테스트
        assertEquals(6, calculator.evaluate("2 * 3"));

        // 기본 나눗셈 테스트
        assertEquals(2, calculator.evaluate("6 / 3"));

        // 소수점 계산 테스트
        assertEquals(7.5, calculator.evaluate("2.5 * 3"));

        // 연속 계산 테스트
        assertEquals(10, calculator.evaluate("2 + 3 * 2"));
    }
}

 

 

 

:: JUnit을 사용하여 작성한 테스트를 실행하여 각 테스트 케이스가 예상대로 통과하는지 확인합니다.

 

:: 테스트가 모두 통과되면 완성된 계산기 프로그램을 실행하여 사용자 인터페이스의 기능도 테스트합니다. 모든 버튼과 연산자에 대해 예상대로 동작하는지 확인합니다.

 

 

 

 

디버깅

- 코드에서 예상치 못한 버그를 찾고 수정하기 위해 디버깅을 수행합니다. Eclipse 또는 IntelliJ와 같은 IDE에서 디버깅 모드를 사용하여 각 줄의 실행 흐름을 확인하고 변수의 값을 살펴보세요.

- 디버깅을 통해 발견된 버그를 수정하면서 코드의 품질을 향상시킵니다. 이때 주의할 점은 작은 부분부터 수정하고 테스트를 반복하는 것입니다.

 

 

 

:: 이제 테스트와 디버깅을 통해 안정적이고 신뢰성 있는 계산기 프로그램을 완성했습니다. 향후 변경사항이나 새로운 기능 추가 시에도 테스트를 활용하여 안정성을 유지하는 것이 중요합니다.

 

 

 

 


예시 코드: 하나의 클래스로 구현한 계산기 예제 코드 

 

 

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Calculator extends JFrame {
    private JTextField textField;
    private double temp, result;
    private String operator;

    public Calculator() {
        createUI();
    }

    private void createUI() {
        setTitle("Java Calculator");
        setSize(300, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(null);

        textField = new JTextField();
        textField.setBounds(50, 25, 200, 30);
        add(textField);

        JButton addButton = new JButton("+");
        addButton.setBounds(50, 70, 50, 50);
        addButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                temp = Double.parseDouble(textField.getText());
                operator = "+";
                textField.setText("");
            }
        });
        add(addButton);

        // Similar buttons for -, *, / here

        JButton equalsButton = new JButton("=");
        equalsButton.setBounds(200, 70, 50, 50);
        equalsButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                switch (operator) {
                    case "+":
                        result = temp + Double.parseDouble(textField.getText());
                        break;
                    case "-":
                        // Subtract logic
                        break;
                    case "*":
                        // Multiply logic
                        break;
                    case "/":
                        // Divide logic
                        break;
                }
                textField.setText(String.valueOf(result));
            }
        });
        add(equalsButton);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Calculator().setVisible(true);
            }
        });
    }
}

 

 

 

:: 이 코드는 다음과 같은 기능을 수행합니다

(1) GUI를 생성하여 계산기 인터페이스를 사용자에게 제공합니다.
(2) 사칙연산을 위한 버튼과 텍스트 필드를 추가합니다.
(3) 각 버튼에 대한 이벤트 리스너를 구현하여 사용자의 입력에 반응합니다.
(4) 사용자가 연산자 버튼과 "=" 버튼을 누를 때 적절한 계산을 수행하고 결과를 표시합니다.
(5) 이 코드는 기본적인 프레임워크를 제공하며, 필요에 따라 더 많은 기능과 복잡성을 추가할 수 있습니다. 예를 들어, 예외 처리를 추가하여 잘못된 입력에 대한 처리를 개선하거나, 더 많은 연산 기능을 추가할 수 있습니다.

 

 

 

 




Java로 계산기 프로그램을 만드는 과정은 초보 개발자에게 객체 지향 프로그래밍과 GUI 개발의 기본을 이해하는 데 도움이 됩니다. 이 프로젝트를 통해 Java의 유연성과 강력한 기능을 경험할 수 있습니다.