[Java / 자바] 계산기 프로그램

개발 노트/Java  2015.06.07 23:14

안녕하세요. 명월입니다.
이번 포스트는 계산기 프로그램에 대해 알아보도록 하겠습니다.


계산기 프로그램을 작성할 때는 가장 난해하다고 생각되는 부분이 중위 표기법에서 후위표기법으로 변환할 때라고 생각합니다.
중위 표기법은 무엇이냐고 하면, 우리가 일상생활에서 사용하는 숫자 식1 + 5 * 2 = 이런 것을 중위 표현 식이라고 하고 후위 표기 식은 컴퓨터가 인식하기 쉽게 변형한 152*+ = 이런 식으로 변환한 것이 후위 표기식이라고 합니다.


중위 표기법에서 후위 표기법으로 변환하는 이유는 사람은 사직 연산할 때 당연히 * / 먼저 처리하고 + - 을 처리하는 순서를 알고 있습니다. 즉 1 + 5 * 2를 계산하면 자연스럽게 11이라는 값이 나옵니다..


그러면 컴퓨터도 사람처럼 *, /를 먼저 계산하고 +,-를 계산하게 해야 하는데 중위 표기법은 이 처리가 상당히 까다롭습니다. 컴퓨터는 순차 형식으로 위에서 아래, 왼쪽에서 오른쪽으로 계산하기 때문에 사칙 연산의 순번으로 계산하기 힘듭니다. 그래서 후위 표기식으로 변환을 해서 계산합니다.
152*+식으로 변환하게 되면 연산기호가 나올 때까지 skip, skip을 하다가 연산기호가 나오면 앞의 두 수와의 계산하고 또 연산자가 나오면 앞의 수와 계산하는 방법으로 변환하는 것입니다.
쉽게 이야기하면 먼저 스택에는 1, 5, 2순으로 값을 입력하고 *가 나오면 앞의 두수 5와 2를 곱하고 스택에 입력합니다.
다시 +가 나오면 1과 10을 더하는 식으로 해서 11이라는 값이 나오게 하는 것입니다.


여기까지가 일반적은 계산기 알고리즘입니다. 여기에 저는 문자열 계산 식도 추가하여 계산합니다.
pow라는 함수식을 사용할 때는 예를 들면 pow(2, 2)는 4의 값이 나옵니다. 여기서 사용된 ,(콤마)를 연산기호로 이용해서 )(괄호)가 나올 때까지 값을 계산해서 제곱하는 식으로 변환하겠습니다.


소스를 보면서 공부하겠습니다.



소스가 꽤 깁니다. 소스의 전체적인 설명을 하겠습니다.
먼저 초기화는 싱글 톤으로 선언하였습니다. 외부에서 호출될 수 있는 함수는 Calculate함수로 계산식을 넣으면 결과값이 반환되는 식으로 사용되겠습니다.
calc 함수 안에는 토큰 분할, 후위 표기식 변환, 후위 표기식으로 계산 식으로 나뉘어서 결과값이 나옵니다.
makeTokens(토큰 분할)함수의 역할은 계산 식을 각각의 단어로 구분하여 단어 단위로 나누는 작업입니다. 예를 들면, 15 + 2 * 3 이라는 글자가 들어오면 [15,+,2,*,3]식으로 오브젝트를 만드는 것입니다. 여기서 키 포인트는 숫자의 경우는 한 자릿수, 두 자릿수 구분있기에 15를 1, 5로 나누어지지 않도록 확인해야겠네요.
그렇게 오브젝트를 나누어서 convertPostOrder(후위 표기식)함수에서 후위 표기식으로 변환합니다. 여기서 중요한 점은 ()(괄호)안의 계산 순서, 사칙연산의 순서입니다.
중위 표기식에서 후위 표기식으로 변경할 때는 Stack을 이용해서 순서를 만듭니다.
중위 표기식이 완성이 되면 스택을 이용해서 초반에 이야기 했던 방식으로 계산을 하면 결과값이 나옵니다.


계산기 결과값


계산기 결과값


위 결과 값을 확인하니 5 + 2 * 3은 11이 나오고 (5+2)*3은 21이 나오네요..



소스 보기 - github 바로가기


댓글 1개가 달렸습니다.
댓글쓰기
  1. skipio
    2016.08.12 10:56 신고 |  수정/삭제  댓글쓰기

    소스에 버그가 있네요. 빼기, 나누기 등의 숫자의 앞뒤순서에 영향을 받는 연산의 경우 잘못된 값이 나오게 되네요.