-
Notifications
You must be signed in to change notification settings - Fork 151
[4기 - 김재웅] 1~2주차 과제 : 계산기 구현 미션 제출합니다. #147
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: kju2405
Are you sure you want to change the base?
Changes from 3 commits
1c5c20b
31d64fe
d42a6d9
b36e927
c0c1a07
14789d6
ef5eeca
1bd816a
2b75683
8e7fc67
2324418
71917d0
15ffeda
50b581d
d31597e
057119f
8e49f93
1429b49
0f7a612
c22e1c6
4f44f1b
f8ef218
63e778c
8f97f36
eee0518
cb39427
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,6 @@ | ||
| package org.example; | ||
|
|
||
| public interface CalOrder { | ||
| public abstract void calPriorityFirst(); | ||
| public abstract void calPrioritySecond(); | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,66 @@ | ||
| package org.example; | ||
|
|
||
| import java.util.Stack; | ||
|
|
||
| public class Calculate implements CalOrder{ | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 계산기의 기능을 다시 고민해보면 좋을 것 같네요
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 주말인데 불구하고 리뷰 남겨주셔서 감사합니다!😄 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 기본적으로 계산기는 사칙연산을 연산 규칙에 맞춰서 제공해주는 기계라고 봐야해요. 그렇게 하려면 수식입력, 계산 두 기능만 외부 오픈을 하고 그 외의 모든 내용은 내부적으로 감춰줘야해요.
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 아하 자세하게 설명해주셔서 감사합니다! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 조금 더 추상화가 필요하다고 할 수 있겠네요 ㅎㅎ! |
||
| private String expression; | ||
| Stack<String> expressionStack = new Stack<>(); | ||
| ExpressionRepository repository = new ExpressionRepository(); | ||
| int result = 0; | ||
|
|
||
| public Calculate(String expression) { | ||
| this.expression = expression; | ||
| String[] expressionArr = expression.split(" "); | ||
| for (String inputVal : expressionArr) { | ||
| expressionStack.add(inputVal); | ||
| } | ||
| } | ||
|
|
||
| public void calculate(){ | ||
| calPriorityFirst(); | ||
| calPrioritySecond(); | ||
| } | ||
|
|
||
| @Override | ||
| public void calPriorityFirst() { | ||
| for (int i = 1; i < expressionStack.size(); i+=2) { | ||
| if (expressionStack.get(i).equals("*")) { | ||
| multiply(i); | ||
| i -= 2; | ||
| } else if (expressionStack.get(i).equals("/")) { | ||
| divide(i); | ||
| i -= 2; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| @Override | ||
| public void calPrioritySecond() { | ||
| result = Integer.parseInt(expressionStack.get(0)); | ||
| for (int i = 1; i < expressionStack.size(); i += 2) { | ||
| if (expressionStack.get(i).equals("+")) { | ||
| result += Integer.parseInt(expressionStack.get(i + 1)); | ||
| } else { | ||
| result -= Integer.parseInt(expressionStack.get(i + 1)); | ||
| } | ||
| } | ||
| System.out.println(result); | ||
| repository.save(expression,result); | ||
| } | ||
|
|
||
| public void multiply(int idx){ | ||
| result = Integer.parseInt(expressionStack.get(idx - 1)) * Integer.parseInt(expressionStack.get(idx + 1)); | ||
| expressionStack.add(idx - 1, String.valueOf(result)); | ||
| expressionStack.remove(idx); | ||
| expressionStack.remove(idx); | ||
| expressionStack.remove(idx); | ||
| } | ||
|
|
||
| public void divide(int idx) { | ||
| result = Integer.parseInt(expressionStack.get(idx - 1)) / Integer.parseInt(expressionStack.get(idx + 1)); | ||
| expressionStack.add(idx - 1, String.valueOf(result)); | ||
| expressionStack.remove(idx); | ||
| expressionStack.remove(idx); | ||
| expressionStack.remove(idx); | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| package org.example; | ||
|
|
||
| import java.util.ArrayList; | ||
| import java.util.List; | ||
|
|
||
| public class ExpressionRepository implements Repository { | ||
| private static List<String> store = new ArrayList<>(); | ||
|
|
||
| @Override | ||
| public void save(String expression, int result) { | ||
| store.add(expression + " = " + result); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 요구사항 그대로 값을 저장하는 것도 좋지만, |
||
| } | ||
|
|
||
| @Override | ||
| public List<String> getRecord() { | ||
| return store; | ||
| } | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 복수형을 반환하면 getRecords()가 좀 더 좋아보이네요 |
||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| package org.example; | ||
|
|
||
| import java.util.List; | ||
| import java.util.Scanner; | ||
|
|
||
| public class Main { | ||
| public static void main(String[] args) { | ||
|
|
||
| int choice = 0; | ||
|
|
||
| while (true) { | ||
| choice = getChoice(); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 변수의 불변성을 보장해주세요 |
||
| System.out.println(); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이것도 출력을 담당하는 객체에서 수행하면 좋을 것 같아요!
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 멘토님, 리뷰 감사드립니다! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. System.out.println();으로 하드코딩 되어 있는 부분입니다 :)
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 아하 감사합니다🙇♂️ |
||
| if (choice == 1) { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. choice 1이 어떤 동작인지 어떻게 알 수 있을까요? |
||
| new UserInterfaceImpl().showRecord(); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 인터페이스가 아니라 구현체를 직접 사용하는게 적절한지 생각해보세요 |
||
| } else { | ||
| String expression = typeExpression(); | ||
| new Calculate(expression).calculate(); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 계산 한 번 할 때마다 계산기를 계속 생성해야할까요? |
||
| } | ||
| System.out.println(); | ||
| } | ||
| } | ||
|
|
||
| public static int getChoice() { | ||
| Scanner scanner = new Scanner(System.in); | ||
|
|
||
| System.out.println("1. 조회\n2. 계산\n"); | ||
| System.out.print("선택 : "); | ||
| return scanner.nextInt(); | ||
| } | ||
|
|
||
| public static String typeExpression() { | ||
| Scanner scanner = new Scanner(System.in); | ||
| return scanner.nextLine(); | ||
| } | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 비슷한 기능을 하는 메소드들을 다른 객체로 추출하는 건 어떨까요? |
||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| package org.example; | ||
|
|
||
| import java.util.List; | ||
|
|
||
| public interface Repository { | ||
| void save(String expression, int result); | ||
| List<String> getRecord(); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| package org.example; | ||
|
|
||
| public interface UserInterface { | ||
| public abstract void showRecord(); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| package org.example; | ||
|
|
||
| import java.util.List; | ||
|
|
||
| public class UserInterfaceImpl implements UserInterface{ | ||
|
|
||
| ExpressionRepository repository = new ExpressionRepository(); | ||
| @Override | ||
| public void showRecord() { | ||
| List<String> record = repository.getRecord(); | ||
| record.forEach(System.out::println); | ||
| } | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 값을 가져오는 것과, 값을 출력하는 기능은 여러 기능을 한 번에 수행하는 것 처럼 보여요. |
||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
interface의 메서드는 기본적으로 추상 메서드이기 때문에 abstract가 없어도 됩니다.