안녕하세요. 인터레스트입니다.

이번 포스팅은 학교나 학원등에서 자바 프로그래밍을 배우다 보면 한번쯤 과제로 나오게 되는 계산기입니다. awt, swing를 이용한 계산기입니다.

거창한 기능이 있는 공학용 계산기가 아닌 단순한 기능이 있는 계산기 인데, 단순하다고 해도 사칙연산만 있는것은 아니고, root값을 구하는 sqrt, 분수, 백분율구하는 기능도 있습니다. ^^

 

기본 계산기는 사실 별다른게 없는게 이미 자바에서 관련 함수를 제공하기 때문입니다.

바로 java.lang.Math에서 제공하는데, 이 계산기역시 math 함수에서 제공하는 함수인 sqrt와 분수는 단순히 나누기를 통해 구현이 가능하고 백분율 구하는 기능역시 나누기입니다. ^^

그러므로 사칙연사외에 추가기능은 sqrt만이라고 할수도 있습니다.

 

계산기를 만드는 방법에 대해서 간략히 정리하자면

1. 계산기 결과 숫자창 생성

2. 계산기 숫자 버튼, 기능(+, -, /, *, = 등)버튼 생성

3. 각 버튼에 actionPerFormed 이벤트 연결

4. 숫자를 누르면 하나씩 저장하는 이벤트 처리

5. 기능버튼을 누르면 기존 숫자 최종값 저장 및 기능 저장, 혹은 결과 숫자창에 계산 결과 출력

 

이때 주의사항은 0으로 나누는 경우라던지, 음수값에 대한 sqrt 처리라던지 하는등의 Exception 처리를 어떤방식으로 할것인가 하는 부분입니다.

 

이클립스 프로젝트로 구성된 전체 소스는 다음의 첨부파일을 받으시면 됩니다.

 

Calculator.zip

 

 



그러면 간략히 계산기 소스를 한번 보겠습니다.

 

	
	// Perform action 이벤트 처리 부분
	public void actionPerformed(ActionEvent e){
		double result = 0;
	   
		// 각 키별로 이벤트 처리함, 숫자는 기본적으로 화면에 세팅함, 각 기능키는 각각의 기능 처리함
		for (int i = 0 ; i < jbnButtons.length; i++)
		{
			if(e.getSource() == jbnButtons[i])
			{
				switch(i)
				{
					case 0 :
					case 1:
					case 2:
					case 3:
					case 4:
					case 5:
					case 6:
					case 7:
					case 8:
					case 9:
						addDigitToDisplay(i);
						break;

					case 10:	// +/-
						processSignChange();
						break;

					case 11:	// 소숫점
						addDecimalPoint();
						break;

					case 12:	// =
						processEquals();
						break;

					case 13:	// 나누기
						processOperator("/");
						break;

					case 14:	// 곱하기
						processOperator("*");
						break;

					case 15:	// 빼기
						processOperator("-");
						break;

					case 16:	// 더하기
						processOperator("+");
						break;

					case 17:	// sqrt
						if (displayMode != ERROR_MODE)
						{
							try
							{
								if (getDisplayString().indexOf("-") == 0)
									displayError("SQRT에 유효한 값이 아닙니다!"); //root에 -값은 허수이므로 처리안됨

								result = Math.sqrt(getNumberInDisplay());
								displayResult(result);
							}

							catch(Exception ex)
							{
								displayError("SQRT에 유효한 값이 아닙니다!");
								displayMode = ERROR_MODE;
							}
						}
						break;

					case 18:	// 1/x
						if (displayMode != ERROR_MODE){
							try
							{
								if (getNumberInDisplay() == 0)
									displayError("0으로 나눌수 없습니다!");
	
								result = 1 / getNumberInDisplay();
								displayResult(result);
							}
							
							catch(Exception ex)	{
								displayError("0으로 나눌수 없습니다!");
								displayMode = ERROR_MODE;
							}
						}
						break;

					case 19:	// %
						if (displayMode != ERROR_MODE){
							try	{
								result = getNumberInDisplay() / 100;
								displayResult(result);
							}
	
							catch(Exception ex)	{
								displayError("유효한 값이 아닙니다!");
								displayMode = ERROR_MODE;
							}
						}
						break;

					case 20:	// backspace
						if (displayMode != ERROR_MODE){
							setDisplayString(getDisplayString().substring(0,
										getDisplayString().length() - 1));
							
							if (getDisplayString().length() < 1)
								setDisplayString("0");
						}
						break;

					case 21:	// CE
						clearExisting();
						break;

					case 22:	// C
						clearAll();
						break;
				}
			}
		}
	}

 



위의 소스는 각 버튼들의 이벤트 처리하는 부분으로 계산기에 어떤 기능들이 있는지 알게하기 위한것입니다.

전체 소스의 내용을 여기에 적기에는 불필요할것 같고 어차피 전체 소스를 보실려면 위에 있는 첨부파일을 받아서 보시면 됩니다.

소스에 나름 주석도 달려있기 때문에 조그마한 참고가 될거라 생각합니다.

 


Posted by 인터레스트
,