자바 응용 계산기 프로그램
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의 유연성과 강력한 기능을 경험할 수 있습니다.