드디어 C# 공부를 시작했다.
강의를 보며 계산기를 만들어봤다.
using System;
using System.Windows.Forms;
namespace Calculator
{
public partial class Form1 : Form
{
enum Operators
{
None,
Add,
Subtract,
Multiply,
Divide,
Result
}
// 초기값 설정
Operators currentOperator = Operators.None;
Boolean operatorChangeFlag = false;
int firstOperand = 0;
int secondOperand = 0;
public Form1()
{
InitializeComponent();
}
private void ButtonResult_Click(object sender, EventArgs e)
{
secondOperand = Int32.Parse(display.Text);
if (currentOperator == Operators.Add)
{
firstOperand += secondOperand;
display.Text = firstOperand.ToString();
}
else if (currentOperator == Operators.Subtract)
{
firstOperand -= secondOperand;
display.Text = firstOperand.ToString();
}
else if (currentOperator == Operators.Multiply)
{
firstOperand *= secondOperand;
display.Text = firstOperand.ToString();
}
else if (currentOperator == Operators.Divide)
{
if (secondOperand == 0)
{
display.Text = "Error";
}
else
{
firstOperand /= secondOperand;
display.Text = firstOperand.ToString();
}
}
}
private void ButtonAdd_Click(object sender, EventArgs e)
{
firstOperand = Int32.Parse(display.Text);
currentOperator = Operators.Add;
operatorChangeFlag = true;
}
private void ButtonSubtract_Click(object sender, EventArgs e)
{
firstOperand = Int32.Parse(display.Text);
currentOperator = Operators.Subtract;
operatorChangeFlag = true;
}
private void ButtonMultiply_Click(object sender, EventArgs e)
{
firstOperand = Int32.Parse(display.Text);
currentOperator = Operators.Multiply;
operatorChangeFlag = true;
}
private void ButtonDivide_Click(object sender, EventArgs e)
{
firstOperand = Int32.Parse(display.Text);
currentOperator = Operators.Divide;
operatorChangeFlag = true;
}
private void ButtonZero_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += "0";
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonOne_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += "1";
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonTwo_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += "2";
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonThree_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += "3";
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonFour_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += "4";
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonFive_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += "5";
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonSix_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += "6";
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonSeven_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += "7";
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonEight_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += "8";
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonNine_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += "9";
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonAllClear_Click(object sender, EventArgs e)
{
firstOperand = 0;
secondOperand = 0;
currentOperator = Operators.None;
display.Text = "0";
}
private void ButtonDot_Click(object sender, EventArgs e)
{
}
}
}
위는 강의 들으며 완성된 코드.
강의가 끝나고 나서
마음에 들지 않는 부분이 있었다.
바로
바로 ButtonOne, ButtonTwo, ButtonThree.. 와 같은 무한 중복 !!
그리고 소수점 계산이 안되는 점
소수점 계산을
강의에서 알려주지 않는다..
그래서 해결해보기로 한다.
아래 부분부터는 공부하며 혼자 해본 것(오늘부터 1일❤️) 이기에
BEST라고 말할 수 없으며 참고 사항으로 봐주셨으면 한다.
일단 ButtonNine_Click에서 인자로 받아오는
(object sender, EventArgs e)가 뭐지?? 하면서 출력해봤다.
ButtonNine_Click()을 눌렀을 때
sender에서
버튼이 가진 숫자(Text: 9)를 가져오고 있었다.
그래서 이 Text: 9를 사용하면 되겠다 싶었다.
sender 값을 가져오는 방법을 찾아보니
((Button)sender).Text로 가져올 수 있다고 한다.
ButtonNumber_Click()을 위와 같이 만들어주고
모든 숫자 버튼의 속성을 바꿔줬다.
display.Text += "숫자" <----- 각 숫자 버튼들은 이 부분만 다르기 때문에 "숫자" 부분만 수정해주면 된다.
ButtonNumber_Click()을 만들어서
ButtonOne_Click() ~ ButtonNine_Click()을 모두 지울 수 있었다.
using System;
using System.Windows.Forms;
namespace Calculator
{
public partial class Form1 : Form
{
enum Operators
{
None,
Add,
Subtract,
Multiply,
Divide,
Result
}
// 초기값 설정
Operators currentOperator = Operators.None;
Boolean operatorChangeFlag = false;
int firstOperand = 0;
int secondOperand = 0;
public Form1()
{
InitializeComponent();
}
private void ButtonResult_Click(object sender, EventArgs e)
{
secondOperand = Int32.Parse(display.Text);
if (currentOperator == Operators.Add)
{
firstOperand += secondOperand;
display.Text = firstOperand.ToString();
}
else if (currentOperator == Operators.Subtract)
{
firstOperand -= secondOperand;
display.Text = firstOperand.ToString();
}
else if (currentOperator == Operators.Multiply)
{
firstOperand *= secondOperand;
display.Text = firstOperand.ToString();
}
else if (currentOperator == Operators.Divide)
{
if (secondOperand == 0)
{
display.Text = "Error";
}
else
{
firstOperand /= secondOperand;
display.Text = firstOperand.ToString();
}
}
}
private void ButtonAdd_Click(object sender, EventArgs e)
{
firstOperand = Int32.Parse(display.Text);
currentOperator = Operators.Add;
operatorChangeFlag = true;
}
private void ButtonSubtract_Click(object sender, EventArgs e)
{
firstOperand = Int32.Parse(display.Text);
currentOperator = Operators.Subtract;
operatorChangeFlag = true;
}
private void ButtonMultiply_Click(object sender, EventArgs e)
{
firstOperand = Int32.Parse(display.Text);
currentOperator = Operators.Multiply;
operatorChangeFlag = true;
}
private void ButtonDivide_Click(object sender, EventArgs e)
{
firstOperand = Int32.Parse(display.Text);
currentOperator = Operators.Divide;
operatorChangeFlag = true;
}
private void ButtonNumber_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += ((Button)sender).Text;
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonAllClear_Click(object sender, EventArgs e)
{
firstOperand = 0;
secondOperand = 0;
currentOperator = Operators.None;
display.Text = "0";
}
private void ButtonDot_Click(object sender, EventArgs e)
{
if (!display.Text.Contains("."))
{
display.Text += ".";
}
}
}
}
아주 깔끔해졌다.
그러고 보니 연산자도 이런 방식으로 가능할 것 같다.
연산자 부분도 리팩토링 시작.
((Button)sender).Name으로 Button의 Name을 가져올 수 있었다.
enum Operators와 값을 맞춰 주기 위해서
ButtonAdd -> Add
ButtonSubtract -> Subtract
..
로 click 속성명을 바꿔주었다.
ButtonOperator_Click()을 위와 같이 만들어주고
모든 연산자 버튼의 속성을 ButtonOperator_Click으로 변경해준다.
이렇게 switch문을 사용한 이유는
enum Operators를 지정해놨기 때문에
Operators.(((Button)sender).Name)과 같은 방식으로는 할 수 없었다.
using System;
using System.Windows.Forms;
namespace Calculator
{
public partial class Form1 : Form
{
enum Operators
{
None,
Add,
Subtract,
Multiply,
Divide,
Result,
}
// 초기값 설정
Operators currentOperator = Operators.None;
Boolean operatorChangeFlag = false;
string or;
int firstOperand = 0;
int secondOperand = 0;
public Form1()
{
InitializeComponent();
}
private void ButtonResult_Click(object sender, EventArgs e)
{
secondOperand = Int32.Parse(display.Text);
if (currentOperator == Operators.Add)
{
firstOperand += secondOperand;
display.Text = firstOperand.ToString();
}
else if (currentOperator == Operators.Subtract)
{
firstOperand -= secondOperand;
display.Text = firstOperand.ToString();
}
else if (currentOperator == Operators.Multiply)
{
firstOperand *= secondOperand;
display.Text = firstOperand.ToString();
}
else if (currentOperator == Operators.Divide)
{
if (secondOperand == 0)
{
display.Text = "Error";
}
else
{
firstOperand /= secondOperand;
display.Text = firstOperand.ToString();
}
}
}
private void ButtonOperator_Click(object sender, EventArgs e)
{
firstOperand = Int32.Parse(display.Text);
switch (((Button)sender).Name)
{
case "Add":
currentOperator = Operators.Add;
break;
case "Subtract":
currentOperator = Operators.Subtract;
break;
case "Multiply":
currentOperator = Operators.Multiply;
break;
case "Divide":
currentOperator = Operators.Divide;
break;
}
operatorChangeFlag = true;
}
private void ButtonNumber_Click(object sender, EventArgs e)
{
if (operatorChangeFlag == true)
{
display.Text = "";
operatorChangeFlag = false;
}
string strNumber = display.Text += ((Button)sender).Text;
int intNumber = Int32.Parse(strNumber);
display.Text = intNumber.ToString();
}
private void ButtonAllClear_Click(object sender, EventArgs e)
{
firstOperand = 0;
secondOperand = 0;
currentOperator = Operators.None;
display.Text = "0";
}
private void ButtonDot_Click(object sender, EventArgs e)
{
if (!display.Text.Contains("."))
{
display.Text += ".";
}
}
}
}
이렇게 숫자, 연산자 부분 리팩토링을 완성했다.
글이 너무 길어져서
소수점은 2탄에서 해볼게요..!
'Skills > C#' 카테고리의 다른 글
[C#] 계산기 만들기 2탄 (소수점) (1) | 2024.02.26 |
---|---|
C# 시작하기 (0) | 2024.02.22 |
C# 코딩규칙 (C# Coding Standards and Best Practices) (0) | 2024.01.17 |