[Unity] UI와 Button 이벤트 복습을 위한 계산기 만들기 ( 2 )

송제백
∙∙조회 10

이번에는 버튼 이벤트를 활용한 입력뿐만 아니라 문자열로 입력된 수식을 분석하고 연산자 우선순위에 따라 계산하는 기능까지 추가했다. 사진처럼 소수점에 문제가 있는 듯하다... 다른 간단한 수식 계산은 잘 반환해주는데 예외처리하거나 이상한 부분들이 많은 것 같다.

1. 구현한 기능

버튼 입력 및 이벤트 처리

GetComponentsInChildren<Button>()을 통해 버튼을 가져오고, 각 버튼의 TMP_Text에서 입력값을 읽도록 구현했다.

AddListener()로 클릭 이벤트를 등록하고, OnKey()의 switch문을 통해 숫자, 연산자, 특수 버튼의 기능을 분리했다.

  • OnNumber() : 숫자 및 소수점 입력
  • OnOperator() : 연산자 입력 및 연속 입력 처리
  • OnClear() : 전체 초기화
  • OnDelete() : 마지막 문자 삭제
  • OnAccept() : 수식 계산 및 결과 출력

수식 분석 및 계산

입력된 문자열을 ParseExpression()에서 숫자와 연산자로 분리하도록 구현했다.

숫자는 List<double>, 연산자는 List<string>에 저장하고, Calculate()에서 연산자 우선순위에 따라 계산한다.

text
입력 : 2+3*4

Numbers   = [2, 3, 4]
Operators = ["+", "*"]

곱셈 : 3 * 4 = 12
덧셈 : 2 + 12 = 14

결과 : 14

연산자 우선순위는 ^ → * / % → + - 순서로 적용했다.

계산한 두 숫자는 MergeNumbers()를 통해 하나의 결과로 합치고, 사용한 연산자는 리스트에서 제거하는 방식이다.

최종 결과는 다시 inputText에 저장하여 계산기 화면에 표시하도록 했다.

2. 추가로 구현한 기능

  • 소수점 중복 입력 방지
  • 연산자 연속 입력 시 기존 연산자 교체
  • 0으로 나누는 경우 Error 출력
  • 계산 결과를 이용한 연속 계산
  • 최대 입력 문자 수 제한

3. 추후 개선할 기능

기본적인 계산 기능은 구현했지만, 일부 예외 상황과 수식 처리 방식은 개선할 필요가 있다.

  • 지수 표기 처리 : 1E-06처럼 표시되는 결과를 연속 계산에 사용할 수 있도록 개선
  • 음수 입력 지원 : 첫 입력에서 -음수 숫자를 넣을 수 있도록 처리
  • 음수와 거듭제곱 우선순위 : -2^2처럼 음수 부호와 거듭제곱이 함께 있는 수식 처리
  • 예외 처리 강화 : 계산 중 발생하는 NaN, Infinity 검사
  • 오류 표시 개선 : 잘못된 수식에 대한 사용자 피드백 추가
  • 코드 구조 개선 : 필요하다면 UI 처리와 계산 로직을 별도 클래스로 분리

4. 마무리

처음에는 Button 이벤트와 UI를 복습하기 위한 간단한 실습이었지만 직접 수식을 분석하고 연산자 우선순위를 구현하면서 생각보다 다양한 부분을 공부할 수 있었다. List를 활용해 숫자와 연산자를 관리하고 계산이 끝난 요소들을 하나씩 합치는 방식이 어색했지만 계속 써봐야할 것 같다. 우선 기본 계산기 구현은 여기서 마무리하고 추후 예외 처리와 수식 분석 기능을 개선해 볼 생각이다.