TDD를 활용한 계산기 만들기

Yullc·2025년 3월 18일
post-thumbnail

1. 10+10

문자열로 만들어진 10 + 10을 계산 하려면 어떻게 해야할까?
int로 받으면 그냥 편하게 계산 할 수 있지만 String 타입인 상황에선 조금 달라져. 문자끼리는 못 더하니까! 그래서 어떻게 하냐? 내가 저번에 알려준 split()함수 있었지? 그거를 활용할거야.

테스트 클래스에는 요렇게 작성해주고

 @Test
    @DisplayName("1 + 1 == 2")
    public void test1() {
        assertThat(Calc.run("1 + 1")).isEqualTo(2);
    }

public class Calc {
     public static int run(String exp) {
         String[] bits = exp.split(" \\+ "); 
         int a = Integer.parseInt(bits[0]);
         int b = Integer.parseInt(bits[1]);
 
         return a + b;
     } 
 }

split()를 이용해 +를 기준으로 문자열을 나눌거야! 그리고 bits라는 배열에 저장할 생각이야. 다음이 중요한데 Integer.paseInt()라고 들어봤니? 바로 문자로 되어진 값을 int형으로 변환 시키는거지 그래서 정수타입인 a에 1이라는 정수가 들어갈 수 있어 그래서 return을 해주면 11 은 20!! 이 나오게 돼

2. 2-1

이번엔 문자열로 만들어진 2-1을 해볼거야 그럼 또 생각나는게 split()함수를 이용해서 문제를 풀어야하잖아? 그렇지만 문가 있어. 앞에서 했던 1+1 테스트 케이스도 누적되어서 같이 실행이 되야해. 그러기 위해서는 나는 조건문을 활용할 생각이야.

  • 먼저 문자열 중에 + 가 있으면 +로 문자열을 나눠서 더하는 연산을 해주고
  • 문자열 중에 - 가 있으면 -로 문자열을 나눠서 빼주는 연산을 해줄거야.
  • 그리고 그거를 판별하기위해 bool값을 선언해서 + 연산인지 - 연산인지 구분할거야. 이것들을 종합해보면
public class Calc {
    public static int run(String exp) {
    
        boolean needToPlus = exp.contains("+");
        boolean needToMinus = exp.contains("-");

        String[] bits = null;

        if (needToPlus) {
            bits = exp.split(" \\+ ");
        } else if (needToMinus) {
            bits = exp.split(" - ");
        }

        int a = Integer.parseInt(bits[0]);
        int b = Integer.parseInt(bits[1]);

        if (needToPlus) {
            return a + b;
        } else if (needToMinus) {
            return a - b;
        }
    }
}

이렇게 작성이 가능하다~~

3. 10 + 20 + 30

이번에는 값을 3개 더해볼거야! 그럼 먼저 나의 생각은

  • 일단 값이 3개니까 변수를 3개 만들고 3개짜리 배열을 만들어서 그 안에다
    값을 순서대로 넣을거야.
  • 그런데 문제가 있어.. 내가 a,b,c에 값을 bits[0], bits[1], bits[2]이렇게 차려대로 넣었더니 위에서 했던 값 2개 비교하던 애들이 안되는거야! 왜냐하면 값은 2개를 넣었는데 c에다가 bits[2]번째 있는 값을 넣으라잖아? 값은 없는데..
  • 그래서 다시 생각한게 a,b는 배열의 공간을 주고 c는 경우에 따라서 주는거지 만약 bits의 길이가 3이상일때 c = Integer.parseInt(bits[2]); 이런식으로
  • 그러면 이제 return할 때를 생각해주면 되는데 이건 뭐 a + b + c를 더한 값만 return해주면 끝!
public static int run(String exp) {

        boolean needToPlus = exp.contains("+");
        boolean needToMinus = exp.contains("-");

        String[] bits = null;

        if (needToPlus) {
            bits = exp.split(" \\+ ");
        } else if (needToMinus) {
            bits = exp.split(" - ");
        }

        int a = Integer.parseInt(bits[0]);
        int b = Integer.parseInt(bits[1]);
        int c = 0;
        
        if (bits.length > 2) {
            c = Integer.parseInt(bits[2]);
        }
        if (needToPlus) {
            return a + b + c;
        } else if (needToMinus) {
            return a - b;
        }
    }

뭔말인지 알겠지??

4. 10 - 20 + 30

아 참.. 여기서 부터 머리가 좀 아팠어..
이건 3개의 숫자를 -와 +를 사용해서 계산하는거야.. 그러면 먼저 생각해야할게

  • -을 어떻게 사용할까를 먼저 생각했지..
    그래서 나는 contain함수에 값을 2개 못담나..? 찾아봤는데 안나오네..
  • 그래서 다른 방법으로 replace를 생각 해보았어 어떻게 활용하냐면 만약 1 - 2 + 1 이 있으면 -를 + -로 대체하는거야! 더 정확하게 말하면 -(공백)을 + -로 대체하는 방법이야
  • 그러면 1 + -2 + 1 이렇게 값이 나오잖아? 그러면 -연산자를 사용할 수 있다!
  • 그리고 그러면 사실 이제 bool값을 안줘도 어쩌피 +로 계산하는거니까 필요없잖아? 그럼 지워버리자! 그러면 이제 조건문도 필요가 없게 되겠지
public class Calc {

    public static int run(String exp) {

        System.out.println("exp1 : " + exp);

        exp = exp.replace("- ", "+ -");

        System.out.println("exp2 : " + exp);

        String[] bits = exp.split(" \\+ ");

        int a = Integer.parseInt(bits[0]);
        int b = Integer.parseInt(bits[1]);
        int c = 0;

        if (bits.length > 2) {
            c = Integer.parseInt(bits[2]);
        }

        return a + b + c;

        // throw new RuntimeException("해석 불가 : 올바른 계산식이 아닙니다");
    }

예전에 한번 말한적이 있었는데 중간중간 과정을 보고싶으면 나는 print문을 이용해서 값을 한번씩 찍어보는것도 중요하다고 생각해!!

5. 10 - 10 - 10 - 10 + 10 + 10 - 10

이 문제는 갯수가 너무 많지? 그러면 반복적으로 수행할 필요가 없고 반복을 돌면서 계산을 해보자

  • sum이라는 변수를 만들고 for문을 돌면서 bits의 길이만큼 반복을 수행하는거야 ! 어쩌피 이제 + 연산자 밖에 안남았으니까 +로 split하면 배열의 길이가 나오겠지?
  • 그럼 그 값들을 더해주면 된다!
public class Calc {

    public static int run(String exp) {

        System.out.println("exp1 : " + exp);

        exp = exp.replace("- ", "+ -");

        System.out.println("exp2 : " + exp);

        String[] bits = exp.split(" \\+ ");

        int sum = 0;

        for (int i = 0; i < bits.length; i++) {
            sum += Integer.parseInt(bits[i]);
        }

        return sum;
    }

}
profile
아자아자자

0개의 댓글