섭섭한 개발일지

[멋쟁이사자처럼] 9일차 회고 본문

멋쟁이사자처럼/회고록

[멋쟁이사자처럼] 9일차 회고

Seop 2023. 10. 30. 21:51
7일차와 8일차 회고는 망가진 컴퓨터 의자로 인해 허리가 너무 안좋아 작성하지 못했다..
2일 뒤에 올 새로운 의자야.. 하루만 더 빨리와주라..

 

오늘 수업은 괄호가 들어가는 계산식을 계산하는 계산기를 재귀호출을 통해 만들어보기를 했다.

수업 진도에서는 간단하게 TDD를 진행하며 계산기를 만들고 있고 괄호가 있을 경우 계산하는 기능을 아직 구현하지는 않았다.

 

수업이 종료된 후에 호기심에 계속해서 프로그래밍을 하던 중 

여러가지 문제점이 나왔다.

 

재귀호출로 괄호를 찾아 계산을 하는 함수는 구현이 어렵지 않았다.

 

[ 괄호를 찾아 괄호부터 계산하는 구현부 ]

if (in.contains("(")) {
    int runResult = Calc.run(in.substring(in.indexOf("(") + 1, in.lastIndexOf(")")));
    in = in.replace(in.substring(in.indexOf("("), in.lastIndexOf(")") + 1), String.valueOf(runResult));
}

 

문제는 연산의 우선순위였다.

+ , - 보다 계산의 우선순위에 있는 *, / 가 먼저 연산이 되어야하는데 이게 되지 않았다.

 

얼핏보면 "그거 그냥 연산쓰면 되는데" 라고 할 수 있겠으나 이 프로그램에서 연산식은 String을 매개변수로 값을 받기에 문제가 있는 것이다.

 

 

[ Test Case 예시 ]

   @Test
    @DisplayName("우선연산이 앞에 있을때 정상 테스트")
    void t6() {
        int run = Calc.run("3 * 1 + (1 - (4 * 1 - (1 - 1)))");

        assertThat(run)
                .isEqualTo(0);
    }

 

위 테스트트케이스의 경우 우선연산이 앞에 있어 신경쓰지 않아도 되므로 정상통과가 된다.

 

 

[ Test Case 예시 2 ]

    @Test // 우선연산이 되지 않음..
    @DisplayName("우선연산이 뒤에 있을 경우")
    void t7() {
        int run = Calc.run("3 + 1 * 2 + (1 - 3 * 3 + (3 + 1 * 3))");

        assertThat(run)
                .isEqualTo(3);
    }

위 테스트 코드에서 문제가 발생한다.

 

이 문제를 해결하기 위해 고민을 많이했다.. (GPT는 사용하지 않고 머리로만 답을 도출하려고 했음)

 

현재 흐름은

연산기호 좌우에는 반드시 공백이 들어가므로

String replace = in.replace(" ", ",");
String[] strings = replace.split(",");

위 코드를 통해 얻은 값을 String 배열을 통해 하나씩 체크를하여 

숫자와 연산기호를 구분하고 결과를 계산하도록 만들고 있었다.

 

여기서 우선연산을 위해 처음에는

string 배열에 있는 데이터들을 char로 저장을 하여 

 

char1(1) + char2(+) + char3(2)...... 

쭉 이어나가려고 했었다.

하지만 연산기호 마저 아스키코드의 10진 값으로 값이 더해져 첫 고비가 왔고

 

이 고비는 조금의 하드 코딩을 통해서 문제를 해결할 수 있었다.

 

char operate = '+';

if ((input[i] == '+' || input[i] == '-' || input[i] == '*' || input[i] == '/')) {
	operate = input[i];
}

값이 연산기호일 경우 앞에 선언해둔 operate 변수에 값을 저장하는 형태로 하면 연산기호를 구하는 부분은 문제가 없었다.

 

 

그렇게 풀이를 해가던 중 

우선순위를 해결하기도 전에 문제가 발생했다.

 

문제는 음수였다.

char 타입의 변수가 -2로 초기화가 되면서 발생한 문제인데

이는 int 타입으로 cast를 하게되면 오버플로우가 발생하여 값이 65534가 된다는점

 

이 문제가 선뜻 다가오고나서 char를 통해 구현을 하려고한 내 방법이 고집이였다는 점을 깨달았고..

저녁시간이 훌쩍 넘어 9시가 다 되었기에 우선은 머리도 식힐겸 밥을 먹고 왔다..

 

이 문제는 컨디션을 위해 오늘은 휴식을 취하고 내일 수업종료 후에 다시 한번 생각해봐야겠다.

 

 

Comments