본문 바로가기
Java

[Java] Swing을 사용하여 간단한 계산기 만들기

by teamnova 2025. 3. 24.
728x90

Swing이란?
Swing은 자바에서 GUI(그래픽 사용자 인터페이스)를 만들 수 있도록 제공하는 JFC(Java Foundation Classes) 라이브러리 중 하나입니다.
다양한 버튼, 텍스트 필드, 패널, 메뉴 등의 컴포넌트를 제공하며, 크로스 플랫폼에서 동일한 UI를 구현할 수 있습니다.

 

Swing은 언제 사용할까요?

1. 간단한 데스크탑 애플리케이션 (예: 계산기, 메모장, 파일 탐색기 등)

2. 내부 관리 시스템, 데이터 시각화 툴

 

그럼 왜 사용할까요?

자바 표준 라이브러리로 포함하여 사용하여 편리합니다.

Windows, macOS, Linux에서 동일한 코드로 실행 가능.

 

 

예제코드

// Swing 패키지 및 이벤트 처리를 위한 패키지 임포트
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Calculator extends JFrame implements ActionListener { // JFrame을 상속받아 GUI 창을 생성하고, ActionListener를 구현하여 버튼 클릭 이벤트 처리
    private JTextField display; // 계산 결과를 표시할 텍스트 필드
    private String operator; // 현재 선택된 연산자 저장
    private double result; // 연산 결과 저장
    private boolean startNewNumber; // 새로운 숫자 입력 여부 확인

    public Calculator() { // 생성자: 계산기 UI를 초기화하는 역할
        super("Calculator"); // JFrame의 제목 설정

        // 🟢 텍스트 필드 설정 (결과 표시 영역)
        display = new JTextField("0"); // 초기값을 "0"으로 설정
        display.setEditable(false); // 사용자가 직접 입력하지 못하도록 설정
        display.setHorizontalAlignment(JTextField.RIGHT); // 텍스트를 오른쪽 정렬
        display.setFont(new Font("Arial", Font.BOLD, 20)); // 폰트 스타일과 크기 지정

        // 🟢 버튼 패널 생성 (4x4 배열의 버튼 배치)
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(4, 4, 5, 5)); // 4x4 그리드 레이아웃 사용 (5px 간격)

        // 버튼 배열: 숫자 버튼(0~9)과 연산자(+,-,*,/,=,C) 포함
        String[] buttons = {
                "7", "8", "9", "/",
                "4", "5", "6", "*",
                "1", "2", "3", "-",
                "0", "C", "=", "+"
        };

        // 🟢 버튼 생성 및 이벤트 리스너 등록
        for (String text : buttons) {
            JButton button = new JButton(text); // 버튼 객체 생성
            button.setFont(new Font("Arial", Font.BOLD, 20)); // 버튼 글꼴 지정
            button.addActionListener(this); // 버튼 클릭 이벤트 리스너 등록
            panel.add(button); // 패널에 버튼 추가
        }

        // 🟢 레이아웃 설정
        setLayout(new BorderLayout(5, 5)); // 창의 레이아웃을 BorderLayout으로 설정
        add(display, BorderLayout.NORTH); // 텍스트 필드를 창 상단(NORTH)에 배치
        add(panel, BorderLayout.CENTER); // 버튼 패널을 중앙(CENTER)에 배치

        // 🟢 기본 창 설정
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 창 닫기 버튼 클릭 시 프로그램 종료
        setSize(300, 400); // 창 크기 설정
        setLocationRelativeTo(null); // 창을 화면 정중앙에 배치
        setVisible(true); // 창을 화면에 표시

        // 초기값 설정
        operator = ""; // 연산자 초기화
        result = 0; // 연산 결과 초기화
        startNewNumber = true; // 새 숫자 입력 시작 여부 초기화
    }

    @Override
    public void actionPerformed(ActionEvent e) { // 버튼 클릭 시 호출되는 메서드
        String command = e.getActionCommand(); // 클릭된 버튼의 텍스트 가져오기

        // 🟢 숫자 버튼 클릭 처리
        if ("0123456789".contains(command)) {
            if (startNewNumber) { // 새로운 숫자 입력 시작이면
                display.setText(command); // 현재 숫자로 설정
                startNewNumber = false;
            } else {
                display.setText(display.getText() + command); // 기존 숫자에 이어 붙이기
            }
        }

        // 🟢 "C" 버튼 클릭: 초기화
        else if (command.equals("C")) {
            display.setText("0"); // 화면을 "0"으로 리셋
            operator = ""; // 연산자 초기화
            result = 0; // 결과 초기화
            startNewNumber = true;
        }

        // 🟢 "=" 버튼 클릭: 연산 실행
        else if (command.equals("=")) {
            calculate(Double.parseDouble(display.getText())); // 현재 숫자로 연산 수행
            operator = ""; // 연산자 초기화
            display.setText("" + result); // 결과 표시
            startNewNumber = true;
        }

        // 🟢 연산자 버튼 클릭 (+, -, *, /)
        else {
            if (!operator.isEmpty() && !startNewNumber) { // 이전 연산이 있다면 먼저 계산 수행
                calculate(Double.parseDouble(display.getText()));
                display.setText("" + result); // 결과 표시
            } else {
                result = Double.parseDouble(display.getText()); // 현재 숫자를 결과 변수에 저장
            }
            operator = command; // 현재 선택한 연산자 저장
            startNewNumber = true; // 새 숫자 입력 시작
        }
    }

    // 🟢 연산 수행 메서드
    private void calculate(double n) {
        switch (operator) {
            case "+": result += n; break; // 덧셈 수행
            case "-": result -= n; break; // 뺄셈 수행
            case "*": result *= n; break; // 곱셈 수행
            case "/":
                if (n != 0) {
                    result /= n; // 나눗셈 수행
                } else {
                    JOptionPane.showMessageDialog(this, "0으로 나눌 수 없습니다."); // 0으로 나누면 경고 메시지 표시
                    result = 0;
                }
                break;
            default:
                result = n;
        }
    }

    // 🟢 프로그램 실행 메인 메서드
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new Calculator()); // GUI 실행을 Event Dispatch Thread에서 실행
    }
}

 

시연영상