과제리뷰

[CH2개인과제] 계산기

hahahabbb 2024. 10. 16. 22:59

이슈 사항들

1)

발단 : 연산자 입력부 구현

전개 : 코드 실행 시에 연산자를 입력하고 연산이 수행되었습니다.

위기 : 연산자 입력 받고 나서 연산 수행되고 종료 여부 묻는 부분이 넘어갔습니다.

절정 : 마지막에 연산자 입력 받고 나서 의 엔터를 처리했습니다. => 입력 받고 sc.nextLine();을 추가

결말 : 해당 오류가 해소되었습니다.

 

2)

발단: while 문으로 무한 반복 코드 구현 

전개 : 코드 수행 후 종료하려면 exit을 입력받도록 했습니다.

위기 : 계속하려면 엔터를 입력하는 게 뭔가 개선하고 싶은 부분이었습니다.

절정 : exit 입력받을 시에 종료하고 아닐 시에 뭘 할지 고민하다가 다음과 같이 작성했습니다.

결말 : 직관적이게 적어서 입력이 명확해진 것 같습니다.

System.out.println("종료하시겠습니까?(yes/no)");
if (sc.nextLine().equals("yes")) break;

 

3)

발단 : 결과값에 연산 결과 저장

전개 : res에 연산결과를 저장하도록 아래와 같이 구현했습니다.

위기 : res가 redundant 라고 경고문구를 만났습니다.

절정 : swith 기존 표기법으로 변경하였습니다.

결말 : res에 과잉없이 연산을 수행할 수 있었습니다.

int res = switch (op) {
            case '+' -> firstNumber + secondNumber;
            case '-' -> firstNumber - secondNumber;
            case '*' -> firstNumber * secondNumber;
            case '/' -> firstNumber / secondNumber;
            case '%' -> firstNumber % secondNumber;
            default -> 0;
        };

 

4)

발단 : 컬렉션 선정

전개 : 연산 결과를 저장할 컬렉션을 설정해야 했습니다.

위기, 절정 : 컬렉션을 뭘로 할 지 고민하다가 순서 고려, 처음 들어온 데이터 순으로 삭제를 고려했을 때 Queue가 제일 적합하다고 생각하여 Queue로 진행하였다. 그리고 딱히 연산결과 리스트를 탐색할 일은 없을 것 같기도 해서..

결말 : 처음 들어온 순서로 삭제되기에 삭제도 쉬웠고, 딱히 탐색을 수행할 일도 없어서 적절했던 것 같습니다.

 

5)

발단 : enum 타입 추가

전개 : enum 타입을 추가하면서 연산 시에 enum 타입의 연산자로 수행하도록 하였습니다.

위기 :  '+' 이 부분에 원래 ADD 이걸 넣었는데 오류가 났습니다.

절정 :  char 타입의 op가 어찌됐든 ADD랑 동일한 게 아니다 보니 그런 것 같다는 생각이 들어 아래와 같이 변경했습니다.

결말 : 정상적으로 작동하는 것을 확인할 수 있었습니다.

        switch (op) {
            case '+':
                res = OperatorType.ADD.operate(firstReal, secondReal);
                break;
            case '-':
                res = OperatorType.SUBTRACT.operate(firstReal, secondReal);
                break;
            case '*':
                res = OperatorType.MULTIPLY.operate(firstReal, secondReal);
                break;
            case '/':
                res = OperatorType.DIVIDE.operate(firstReal, secondReal);
                break;
            case '%':
                res = OperatorType.REMAIN.operate(firstReal, secondReal);
                break;
        };

 

6)

발단 : 연산자 입력

전개 : 연산자 입력받을 때 연산자 외의 타입이 입력되는 경우가 있었습니다.

위기 : 그 때 그냥 넘어가고 연산 결과가 0으로 출력되었습니다.

절정 : 그래서 연산자가 아닐 경우 잘못된 연산자로 출력되게 구현했습니다.

private static final String OPERATION_REG = "[+\\-*/]";

if (!Pattern.matches(OPERATION_REG, Character.toString(op))) {
        System.out.println("잘못된 연산자입니다. 처음부터 다시 입력하세요.");
        continue;
}

 

7)

발단 : 제네릭 구현

전개 : 제네릭을 구현하기 위해 Int형 타입에 제네릭을 부여했습니다.

위기 : enum 타입이 컴파일되면서 정의되고, 제네릭은 코드 실행 중에 타입이 정해지다보니 두 개를 어떻게 적절히 사용할 지 어려움이 생겼습니다.

절정 : 그래서 제네릭 구현은 못 하고 double로 진행하였습니다..