/java-calculator

자바 계산기 구현 미션 Repository입니다.

Primary LanguageJava

java_calculator

자바 계산기 구현 미션 Repository입니다.

이곳은 공개 Repo입니다.

  1. 여러분의 포트폴리오로 사용하셔도 됩니다.
  2. 때문에 이 repo를 fork한 뒤
  3. 여러분의 개인 Repo에 작업하며
  4. 이 Repo에 PR을 보내어 멘토의 코드 리뷰와 피드백을 받으세요.

Branch 명명 규칙 + 팀의 PR규칙 정하기

  1. 여러분 repo는 알아서 해주시고 😀(본인 레포니 main으로 하셔두 되져)
  2. prgrms-be-devcourse/spring-board 레포로 PR시 branch는 gituser_id을 적어주세요 :)
    • base repo : 여기repo base : username ← head repo : 여러분repo compare : main또는 github_id
  3. 실제 진행할 PR규칙은 멘토+팀원들과 정하여 진행해주세요 :)
    • ← head repo :여러분repocompare :main로 할지
    • 또는 ← head repo :여러분repocompare :github_id로 할지

과제를 통해 기대하는 역량

  • 깃허브를 통한 코드리뷰를 경험해보자
  • 기본적인 테스트 코드 작성 및 활용하는 능력해보자
  • 스스로 OOP를 생각하고 코드로 옮길 수 있는 능력해보자

요구사항

  • 콘솔로 구현입니다.(스윙으로 구현하시는 분들 계실까봐)
  • 객체지향적인 코드로 계산기 구현하기
    • 더하기
    • 빼기
    • 곱하기
    • 나누기
    • 우선순위(사칙연산)
  • 테스트 코드 구현하기
  • 계산 이력을 맵으로 데이터 저장기능 만들기
    • 애플리케이션이 동작하는 동안 데이터베이스 외에 데이터를 저장할 수 있는 방법을 고안해보세요.
  • (선택) 정규식 사용

실행결과(콘솔)

1. 조회
2. 계산

선택 : 2

1 + 2
3

1. 조회
2. 계산

선택 : 2

1 + 2 * 3
7

1. 조회
2. 계산

선택 : 1

1 + 2 = 3
1 + 2 * 3 = 7

선택 : 2

3 - 2 * 2
-1

구현내용

중위표기식을 후위표기식으로 바꾸기 위해 자료구조로 스택을 사용했습니다. 따라서 모든 사칙연산에 대해 우선순위 연산으로 작동합니다.

계산 이력을 맵을 사용하여 만들었습니다. 링크드 해시맵을 사용하여 구현했으며 연산기록이 겹칠 수 있기 때문에 각 연산에 관해 고유한 id값을 부여해 저장했습니다.

객체지향적인 프로그래밍을 위해 객체를 분리했습니다. 객체에 관한 설명은 아래와 같습니다.

자바 계산기 구현미션-6

View : 사용자로부터의 입력과 사용자에게 보여줄 출력에 관한 역할을 담당하는 클래스입니다.

  • 사용자에게 기능 목록을 보여줍니다.
  • 사용자가 사용하려는 기능을 입력 받습니다.
    • 계산 기능을 사용할 경우 식을 입력 받습니다.
  • 사용자로부터 잘못된 입력이 주어지면 오류 메시지를 출력하고 다시 입력을 받습니다.
  • 기능 수행 후 결과를 출력합니다.

Command : 사용자 입력에 해당하는 명령어를 전달합니다. 프로세서는 이를 통해 요청을 구분하고 처리합니다.

Processor : 계산기가 실행된 후 화면, 계산기, 저장소 사이에 주고 받는 정보들을 올바른 대상에게 전달합니다.
또한 화면, 계산기, 저장소로부터 발생한 오류 메시지를 모두 모아 화면에게 정보를 전달합니다.

  • 사용자가 입력한 기능을 수행하도록 합니다.
    • 계산기능을 요청한 경우
      • 화면에게 계산식 입력 요청을 합니다.
      • 받은 식을 계산기에게 전달합니다.
      • 계산 결과를 저장소에 전달합니다.
      • 계산기의 계산 결과를 화면에게 전달합니다.
    • 계산 이력을 요청할 경우
      • 저장소에게 계산 이력을 요청합니다.
      • 받은 이력을 화면에게 전달합니다.
  • 발생한 오류 메시지를 모아 화면에게 전달합니다.

Calculator : 식이 들어오면 연산자와 피연산자를 가지고 계산을 수행합니다.
계산 과정 중에 오류가 발생하면 오류를 발생시키고 계산을 멈춥니다.
연산자 우선순위를 판별하여 계산을 수행합니다.

  • 연산자인지 피연산자인지 구분한 후 피연산자라면 값을 저장해 놓고 연산자라면 Operator 객체에게 연산을 요청합니다.
    • 이때 연산 요청은 연산자의 우선순위를 고려하여 요청합니다.

Operator : 연산자와 관련된 상태를 관리하고 사칙연산을 합니다.
연산자의 종류를 관리하고 유효한 연산자인지 판단합니다.
또한 연산자의 우선순위를 저장하고 관리합니다
우선 순위를 통해 계산기는 연산자 객체에게 연산을 수행하도록 합니다.

HistoryStorage : 입력 받은 계산식과 연산 결과를 저장합니다. 또한 연산 결과를 모두 출력합니다.