Skip to content

chlwlgns524/java-calculator

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 

Repository files navigation

🧨요구사항

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

💡실행결과(콘솔)

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

✨ Class diagram

image

📟입력 조건

  • 입력받는 값은 문자열로 된 수식이며 수식의 앞과 뒤에는 하나 이상의 whitespace가 존재할 수 있다.
  • 수식은 일반적으로 통용되는 중위식으로 이루어져야 한다.
  • 수식의 연산자와 피연산자 사이에는 하나 이상의 whitespace가 존재할 수 있다.

📟출력 조건

  • 계산기의 출력은 정수이다.
  • 입력받은 값에 많은 whitespace가 존재하더라도 식이 성립한다면 올바른 계산 결과가 출력되며, 해당 입력값은 포맷팅되어 저장된다.

🔆Operator

요구 명세서에 나온 사칙 연산자 및 사칙 연산자와 연관된 메소드를 구현한 Enum 클래스로서 계산기 프로그램의 핵심적인 기능을 담당한다.

🔆InfixToPostfixConverter

입력값으로 들어온 중위식을 후위식으로 변환하는 기능을 수행하며, 변환을 하기 전에 입력값이 성립하는 값인지 유효성을 검증한다. Operator의 기능에 의존한다.

🔆PostfixCalculator

InfixToPostfixConverter에 의해 후위식으로 변환된 식을 계산하여 결과값을 반환한다. Operator의 기능에 의존한다.

🔆Expression

계산 이력 각각을 담을 수 있는 model 객체로서 기능하며, 성립하는 수식과 결과값만을 담는다.

🔆LocalRepository

입력값을 Expression 객체에 담아 저장하는 저장소이다. HashMap을 이용하여 로컬 저장소의 기능을 수행한다.

🔆PostfixCalculatorService

프로그램의 각 기능을 통합하여 수행하는 역할 및 기본 입출력 기능을 담당한다.


🌠PR 포인트 & 궁금한 점

1. 객체 지향 프로그래밍

처음부터 끝까지 객체 지향적인 관점에서 개발을 진행한 경험이 한 번도 없습니다. 그래서 처음 이 프로젝트를 시작할 때 어디서부터 어떻게 시작해야할 지 막막했는데요. 직관적으로 가장 먼저 구현해야 겠다고 생각한 기능은 연산자와 계산 기능이었습니다. 고심한 끝에 Operator 클래스를 enum으로 만들고 이 클래스로부터 출발해서 전체 프로그램을 완성하였습니다. 그러다 보니 프로그램의 전체 구조가 깔끔하지 못한 것 같습니다. 개인적으로 이번 미션을 진행하면서 객체 지향적인 관점으로 이 정도 규모의 프로그램이라도 계속 생각해 보고 만들어서 경험을 쌓아야겠다는 생각을 했는데요, 이 점에 관한 조언을 부탁드립니다!

2. 세분화된 클래스 생성

클래스를 수정해야 하는 이유는 하나 이상이어서는 안 된다라는 SRP(Single Responsibility Principle)를 유념하며 프로그램을 작성하였지만, 가지고 있는 기능에 비해 너무 많은 클래스를 구현하는 것이 아닌가에 대한 의문이 많이 들었습니다. 사용자의 입력을 받고 계산 이력을 조회(출력)하는 기능을 각각 ConsoleInput 클래스와 ConsoleOutput 클래스로 따로 만들까도 생각해 보았으나 지나치게 클래스가 많아지는 것 같아서 저는 PostfixCalculatorService 안에 메소드로 구현하였습니다. 기능에 비해 클래스가 많아져서 전체 구조가 복잡해 지더라도 클래스를 따로 만드는 것이 좋았을까요?

3. 테스트 코드

테스트 코드를 처음 작성해 봐서 검색을 통해 대략적인 느낌을 가지고 단위 테스트를 수행하였습니다. 일단 테스팅은 주로 assertThat만을 이용하였고 예외 케이스를 테스팅 하기 위해 부분적으로 assertThatThrownBy를 활용하였습니다. 제가 수행한 단위 테스팅이 적절하게 수행된 것인지 관한 멘토님의 피드백을 받고 싶습니다!

4. 프로그램의 확장성은 어디까지 고려해야 하는가?

객체 지향을 활용한 개발 경험이 전무한 저에게 있어, 이 프로젝트를 수행하며 가장 어렵게 다가왔던 부분은 기능 구현이 아닌 프로그램의 전체 구조를 잡는 일이었습니다. 전체 구조를 적절히 잡기 위해서는 유지 및 보수나 확장성을 고려해야 하는데, 이 프로젝트에서 가장 막막했던 점은 어디까지 확장성을 생각하며 프로그램을 만들어야 하는가 였습니다. 따라서 계산 기능을 담당하는 Operator 클래스를 만들고 나서는 이후 무엇을 어떻게 만들어야 할지 고민이 되어 한동안 앞으로 나가지를 못했습니다. 제딴에는 Calculator, Converter 그리고 Repository 이 세개의 인터페이스를 만들어서 책임을 위임한 것이 확장성을 고려한 전부였는데요. 이 부분에 관한 멘토님의 조언을 듣고 싶습니다!

About

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

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 100.0%