Programming

C# WinForm으로 계산기 만들어보기

khj1999 2025. 2. 17. 18:57

요즘 MES관련 직무에 관심이 생겨서 Spring을 공부하면서 C#도 한번 해보려고한다 왜냐하면 MES/ERP에서
레거시 시스템이나 대부분이 C#으로 진행되어 있고 스프링으로 진행 하는 곳들도 있어서 일단 둘다 배워놓으면
쓸모는 있겠다 싶어서 한번 간단하게 공부를 해보고 계산기 프로그램을 만들어봤다.

코드

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Calculator
{
    public partial class Form1 : Form
    {
        private string operand1 = ""; // 첫 번째 피연산자
        private string operand2 = ""; // 두 번째 피연산자
        private char operation = '\0'; // 연산자
        private bool isOperatorPressed = false; // 연산자 입력 여부

        public Form1()
        {
            InitializeComponent();
        }

        private void Number_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;

            if (isOperatorPressed)
            {
                // 두 번째 피연산자 입력 중
                operand2 += btn.Text;
                display.Text = operand2;
            }
            else
            {
                // 첫 번째 피연산자 입력 중
                operand1 += btn.Text;
                display.Text = operand1;
            }
        }

        private void Operator_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;

            if (!string.IsNullOrEmpty(operand1))
            {
                operation = btn.Text[0]; // 연산자 저장
                isOperatorPressed = true; // 연산자 입력됨
            }
        }

        private void Result_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(operand1) && !string.IsNullOrEmpty(operand2))
            {
                double num1 = double.Parse(operand1);
                double num2 = double.Parse(operand2);
                double result = 0;

                switch (operation)
                {
                    case '+': result = num1 + num2; break;
                    case '-': result = num1 - num2; break;
                    case '*': result = num1 * num2; break;
                    case '/':
                        if (num2 != 0)
                            result = num1 / num2;
                        else
                        {
                            MessageBox.Show("0으로 나눌 수 없습니다.");
                            return;
                        }
                        break;
                }

                // 결과 표시 및 첫 번째 피연산자로 저장하여 연속 연산 가능
                display.Text = result.ToString();
                operand1 = result.ToString();
                operand2 = "";
                isOperatorPressed = false; // 다시 숫자 입력 모드
            }
        }

        private void Point_Click(object sender, EventArgs e)
        {
            if (isOperatorPressed)
            {
                // 두 번째 피연산자에 소수점 추가
                if (!operand2.Contains("."))
                {
                    if (operand2 == "")
                        operand2 = "0.";
                    else
                        operand2 += ".";

                    display.Text = operand2;
                }
            }
            else
            {
                // 첫 번째 피연산자에 소수점 추가
                if (!operand1.Contains("."))
                {
                    if (operand1 == "")
                        operand1 = "0.";
                    else
                        operand1 += ".";

                    display.Text = operand1;
                }
            }
        }

        private void Clear_Click(object sender, EventArgs e)
        {
            display.Text = "0";
            operand1 = operand2 = "";
            operation = '\0';
            isOperatorPressed = false;
        }

        private void NUM_1_Click(object sender, EventArgs e) => Number_Click(sender, e);
        private void NUM_2_Click(object sender, EventArgs e) => Number_Click(sender, e);
        private void NUM_3_Click(object sender, EventArgs e) => Number_Click(sender, e);
        private void NUM_4_Click(object sender, EventArgs e) => Number_Click(sender, e);
        private void NUM_5_Click(object sender, EventArgs e) => Number_Click(sender, e);
        private void NUM_6_Click(object sender, EventArgs e) => Number_Click(sender, e);
        private void NUM_7_Click(object sender, EventArgs e) => Number_Click(sender, e);
        private void NUM_8_Click(object sender, EventArgs e) => Number_Click(sender, e);
        private void NUM_9_Click(object sender, EventArgs e) => Number_Click(sender, e);
        private void NUM_0_Click(object sender, EventArgs e) => Number_Click(sender, e);

        private void Dot_Click(object sender, EventArgs e) => Point_Click(sender, e);

        private void AC_Click(object sender, EventArgs e) => Clear_Click(sender, e);
        private void Plus_Click(object sender, EventArgs e) => Operator_Click(sender, e);
        private void Minus_Click(object sender, EventArgs e) => Operator_Click(sender, e);
        private void Multi_Click(object sender, EventArgs e) => Operator_Click(sender, e);
        private void div_Click(object sender, EventArgs e) => Operator_Click(sender, e);
    }
}


사실 완벽하지는 않다 아이폰 계산기는 3 + 3 + 3 = 을 입력했을때 2번째 + 를 입력할때 6이 출력되고 + 3을 입력한 뒤 = 를 입력하면 9가 출력되는데 지금은 3 + 3까진 입력이 잘되는데 +3을 하면 33이 되어 버리는 문제가 있다.
완벽하게 하려면 할 수는 있겠지만, 한도 끝도 없다고 생각이들어서 학습 중이니 일단 여기까지만 진행하고 넘어 가야겠다.

결과

계산기