문자열 계산기 TDD

75804 단어 OOPOOP

TDD로 바꿔서 진행해보기


1. "," 빈문자 , null , "/" Test (9/25)

  1. ","를 구별하는 테스트
  2. "/" , ","를 구별하는 테스트
  3. 빈 값을 구별하는 테스트
  4. null 값 구별하는 테스트

총 4가지 테스를 진행해봅니다.


class StringCal{

    private StringCalculator st;

    @BeforeEach
    void 초기() {
        st=new StringCalculator();
    }

    

    @Test
    void testWhenComma(){
        String res[]=st.split("1,2,3");
        assertArrayEquals(new String[] {"1","2","3"},res);
    }

    @Test
    void testWhenLine_and_Comma(){
        String []res=st.split("1/2,3");
        assertArrayEquals(new String[] {"1","2","3"},res);
    }


    @Test
    void testWhenEmpty(){
        String []res=st.split("");
        assertArrayEquals(new String []{""},res);
    }

    @Test
    void testWhenNull(){
        String []res=st.split(null);
        assertArrayEquals(new String[]{},res);
    }
    
}



public class StringCalculator {

    String []split(String text){
    
    	if(text == null){
        
        	return new String[]{};
        }
        return text.split(",|/");
   
   }
}


2.문자열 -> 정수형 배열 변환 , 빈 값 ,null 값 검사 (9/26)

  1. 문자열 -> 정수형 배열로 검사 테스트
  2. 빈 값 검사 테스트
  3. null값 검사 테스트

    @Test
    void tesetToInt(){
        //문자열 -> 정수형 검사
        String []res=st.split("1,2,3");

        int[] numbers =st.toInt(res);
        assertArrayEquals(new int[]{1,2,3} ,numbers);


        //빈 값 검사
        numbers=st.toInt(new String[]{});
        assertArrayEquals(new int[]{},numbers);


        //널 검사
        numbers=st.toInt(null);
        assertArrayEquals(new int[]{},numbers);

    }

public class Cal {
   int numbers[];
    int[] toInt(String []text) {


        if(text == null){
            return new int[]{};
        }

        numbers=new int[text.length];

       for(int i=0; i<text.length; i++){
           int num=Integer.parseInt(text[i]);
           numbers[i]=num;
       }
        return numbers;
    }
 }


3. 덧셈 , 음수값 검사 (10/05)

  1. 덧셈 테스트
  2. 음수값 테스트


class StringCal{

    private StringCalculator st;

    @BeforeEach
    void 초기() {
        st=new StringCalculator();
    }


    @Test
    void 덧셈() throws Exception {

        String []res=st.split("1,2,3");
        int []number=st.toInt(res);
        assertEquals(6,st.add(number));

    }


    @Test
    void 음수값() throws Exception {

        String []res=st.split("-1,2,3");

        RuntimeException exception=assertThrows(RuntimeException.class,()->{
            st.toInt(res);
        });

    }


}

public class Cal {


    //문자열 입력이 들어오면 ,로 분리해서 다시 반환



    int res=0;

    String []split(String text){

        if(text==null){
            return new String[]{};
        }
        return text.split(",|/");
    }


    int numbers[];

    int[] toInt(String []text) throws Exception {

        if(text == null){
            return new int[]{};
        }

        numbers=new int[text.length];

       for(int i=0; i<text.length; i++){
           int num=Integer.parseInt(text[i]);

           if(num <0){
               throw new RuntimeException();
           }
           numbers[i]=num;
       }
        return numbers;
    }

    int add(int []numbers){
        int sum=0;
        for(int i: numbers){
            sum+=i;
        }
        return sum;
    }

   
}

일단 TDD로 진행을 하고 있는데 기존 OOP 문자열 리팩토링과 다른 점을 모르겠다.
내 코드가 잘못된건가? 좀더 공부를 할 필요가 있을 것 같다.

4. 리펙토링 (toInt기능 -> 메서드 분리) (10/08)

  1. null 값 메서드
  2. 문자열 -> 정수형 변환 (들여쓰기 줄여보기) 메서드
  3. 배열 크기 정하는 메서드
public class Cal {
 
 
   public static int numbers[];


    String[] splite(String text){


        if(text==null){
            return new String[]{};
        }

        return text.split(",|/");

    }

    /**
     * 기능 분리
     * 1. null값 검사
     * 2. 문자열 -> 정수형 변환 검사 (들여쓰기 줄여보기)
     * 3. 배열 크기 정하는 메서드
     *
     */

    // 1. null 검사 메서드드
    public static int[] Arrnull(String []text){

        if(text==null){
            return new int[]{};
        }
        return new int[]{};
    }

    // 2. 문자열 -> 정수형 변환 검사 (들여쓰기 줄여보기)
    public static void changeNumber(String []text){

        for(int i=0; i<text.length; i++){
            int num=Integer.parseInt(text[i]);
            numbers[i]=num;
        }

    }

    // 3. 배열 크기 정하는 메서드
    public static void ArrSize(String []text){
        numbers=new int[text.length];
    }

    
    int[] toInt(String []text){

        // 3. 배열 크기 정하는 메서드
        ArrSize(text);
        // 1. null값 검사
        Arrnull(text);
        changeNumber(text);
        return numbers;

    }
    

}


5. 리펙토링 (사칙연산 기능) (10/09)

  1. 사칙연산하는 클래스 따로 분리
  2. 덧셈 , 뺄셈 , 나눗셈 , 곱셈
public class CalculatorGame {

    public static Cal cal=new Cal();

    int add(String []text){
	// 문자열 검사 진행
        int numbers[]=cal.toInt(text);

        int sum=0;
        for(int n: numbers){
            sum+=n;
        }

        return sum;

    }

}

 @Test
    void 덧셈(){
        String []res=cal.splite("1,2,3");

        int sum=calculatorGame.add(res);
        assertEquals(6,sum);
    }

뺄셈을 구현하는 메서드는 다음에 다시 해보자 인덱스값을 하나 하나 빼서 연산을 처리하면 될 것 같다

6. 사칙연산 메서드 (Token 사용) (10/09)

  1. 뺄셈 ,곱셈 메서드 구현

기존에 배열로 뺄셈을 구현할려니깐 생각이 나질않았다 덧셈 처럼 구현하기에는 계속 음수 값이나오고 분리를 해야하는데 계속 찾아보다 Token을 이용해서 분리하면 쉽게 연산을 처리 할 수 있을 것 같아서 도입을 했다.

import java.nio.channels.ScatteringByteChannel;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class CalculatorGame {

    public static Cal cal=new Cal();
    public static int res=1;
    public static int sum=0;
    public static int minus=0;
    public static String token;




    /**
     *
     * @param text
     * @return
     *
     * 1. 덧셈
     * 2. 곱셈
     * 3. 나눗셈
     * 4. 뺄셈
     */


    //1.덧셈
    public static int add(String []text){

        int numbers[]=cal.toInt(text);


        for(int n: numbers){
            sum+=n;
        }

        return sum;

    }


    //2.곱셈
    public static int multip(String []text){

        int numbers[]=cal.toInt(text);

        for(int n: numbers){
            res*=n;
        }

        return  res;
    }

    //3.나눗셈
    public static int divison(String []text){
        int numbers[]=cal.toInt(text);
        return 0;
    }

    //4.뺄셈
    public static int calMinus(/*String text*/String []text){

        //여기가 계속 오류가 나오고 있다
        //변환을 다시 해보자
        String str=text.toString();
        


        //토큰으로 변환
//       StringTokenizer st=new StringTokenizer(text,"-");

        StringTokenizer st=new StringTokenizer(str);
        while(st.hasMoreTokens()){
             minus=Integer.valueOf(st.nextToken())-Integer.valueOf(st.nextToken());

        }

        return minus;
    }


   @Test
    void 뺄셈(){

//       int res=calculatorGame.calMinus("3-2");

        String[] str=cal.splite("4,3");

        int res=calculatorGame.calMinus(str);
        assertEquals(1,res);

    }

NumberFormatException 에러가 계속 터지고 있다
확인을 해보니 String str=text.toString(); 코드에서 계속 주소값이 출력이 되고 있다. (수정)


    //4.뺄셈
    public static int calMinus(/*String text*/String []text){

        //여기가 계속 오류가 나오고 있다
        //변환을 다시 해보자
//        String str=text.toString();

        String str=String.join(",",text);
        
        //토큰으로 변환
//       StringTokenizer st=new StringTokenizer(text,"-");
        StringTokenizer st=new StringTokenizer(str,",");
        while(st.hasMoreTokens()){
             minus=Integer.valueOf(st.nextToken())-Integer.valueOf(st.nextToken());
        }

        return minus;
    }

}

7. 사칙연산 메서드 (Token 사용) (10/14)

  1. 나눗셈 메서드 구현
  2. 뺄셈 메서드 이름 수정 (callMinus)
  3. 클래스 변수 지역변수로 변경 (minus)


public class CalculatorGame {

    public static Cal cal=new Cal();
    public static int res=1;
    public static int sum=0;
    public static String token;




    /**
     *
     * @param text
     * @return
     *
     * 1. 덧셈
     * 2. 곱셈
     * 3. 나눗셈
     * 4. 뺄셈
     */


    //1.덧셈
    public static int add(String []text){

        int numbers[]=cal.toInt(text);


        for(int n: numbers){
            sum+=n;
        }

        return sum;

    }


    //2.곱셈
    public static int multip(String []text){

        int numbers[]=cal.toInt(text);

        for(int n: numbers){
            res*=n;
        }

        return  res;
    }

    //3.나눗셈
    public static int divison(String []text){
        int numbers[]=cal.toInt(text);
        return 0;
    }

    //4.뺄셈
    public static int callMinus(/*String text*/String []text){

        //여기가 계속 오류가 나오고 있다
        //변환을 다시 해보자
//        String str=text.toString();

        int minus=0;
        String str=String.join(",",text);

        //토큰으로 변환
//       StringTokenizer st=new StringTokenizer(text,"-");
        StringTokenizer st=new StringTokenizer(str,",");
        while(st.hasMoreTokens()){
             minus=Integer.valueOf(st.nextToken())-Integer.valueOf(st.nextToken());
        }

        return minus;
    }

    
    //나눗셈
    public static int callDivison(String []text){
        int division=0;
        String str=String.join(",",text);


        StringTokenizer st=new StringTokenizer(str,",");

        while(st.hasMoreTokens()){
            division=Integer.parseInt(st.nextToken()) / Integer.parseInt(st.nextToken());
        }
        return division;

    }

}

전체적으로 리펙토링을 해야 할 것 같다 사칙연산을 모두 토큰으로 받는 방식으로 바꾸고
토큰 부분은 메서드를 분리해서 구현을 해보자

8. 리펙토링 (사칙연산 기능) (10/14)

  1. Cal final 추가
  2. 문자열 배열 -> 문자열 변환 메서드로 분리
  3. 스테틱 변수로 변경 (StringTokenizer)

public class CalculatorGame {

   public static final Cal cal=new Cal();
   public static String token;
   public static StringTokenizer  st;



   /**
    *
    * @param text
    * @return
    *
    * 1. 덧셈
    * 2. 곱셈
    * 3. 나눗셈
    * 4. 뺄셈
    */


   //문자 배열 ->문자열로 변경
   public static String str(String []text){

       return String.join(",",text);
   }


   //토큰 분리


   //1.덧셈
   public static int callAdd(String []text){

       int sum=0;
       String s=str(text);

      st=new StringTokenizer(s,",");
       while(st.hasMoreTokens()) {
           sum = Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken());
       }

       return sum;

       }


   //2.곱셈
   public static int callMultip(String []text){


       int mul=0;
       String s=str(text);
       st=new StringTokenizer(s,",");

       while (st.hasMoreTokens()){
           mul=Integer.parseInt(st.nextToken()) * Integer.parseInt(st.nextToken());
       }
       return  mul;
   }



   //4.뺄셈
   public static int callMinus(/*String text*/String []text){


       int minus=0;
       String s=str(text);
        st=new StringTokenizer(s,",");
       while(st.hasMoreTokens()){
            minus=Integer.valueOf(st.nextToken())-Integer.valueOf(st.nextToken());
       }

       return minus;
   }


   //3. 나눗셈
   public static int callDivison(String []text){
       int division=0;
       String s=str(text);


       st=new StringTokenizer(s,",");

       while(st.hasMoreTokens()){
           division=Integer.parseInt(st.nextToken()) / Integer.parseInt(st.nextToken());
       }
       return division;

   }

}

좋은 웹페이지 즐겨찾기