ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java/Study] String Calculation(문자열 계산기)
    나는야 개발자/Java 2022. 4. 28. 16:27

    사내에 스터디 모임이 있어서 꼽사리(?)로 나도 한 번 만들어본 "문자열 계산기" !!

     

    코드 전문은 아래와 같다.

    import java.util.ArrayList;
    import java.util.List;
    
    public class StringCalculation {
    
        public static void main(String[] args) {
            String str = "33+4*21/0";
    
            Operator operator = new Operator();
    
            List<String> returnList = operator.strSplit(str);
            System.out.println("RETURN LIST :: " + returnList);
    
            String result = operator.calculate(returnList);
            System.out.println("RESULT :: " + result);
        }
    
        public static class Operator{
            public List<String> strSplit(String str){
                String[] inputArr = str.split("");
                List<String> strArr = new ArrayList<String>();
    
                String num = "";
                int i = 0;
                int exceptionCnt = 0;
    
                do{
                    try{
                        if(Integer.parseInt(inputArr[i]) >= 0){
                            num += inputArr[i];
                            exceptionCnt = 0; // 숫자가 정상적으로 들어갔다면 예외처리 횟수를 0으로 초기화
                        }
                    }catch(Exception e) { // 문자열은 Integer로 변환 불가능하므로 예외로 처리
                        strArr.add(num);
                        num = ""; // 이전까지의 숫자배열을 List에 추가 후 초기화
                        strArr.add(inputArr[i]);
                        exceptionCnt++; // 예외가 발생 할 때 마다 예외처리 횟수를 +1
                    }
    
                    // operator가 2번 이상 연속하는지 확인
                    if(exceptionCnt == 2){
                        strArr = new ArrayList<String>();
                        break;
                    }
    
                    i++;
                } while(i < inputArr.length);
    
                if(i == inputArr.length){
                    try {
                        if (Integer.parseInt(num) >= 0) {
                            strArr.add(num);
                        }
                    }catch(Exception e){
                        strArr = new ArrayList<String>();
                    }
                }
    
                return strArr;
            }
    
            public String calculate(List<String> strArr){
                String result = "";
                int num = 0;
    
                int i = 1;
                do {
                    try {
                        int num1 = Integer.parseInt(strArr.get(i-1)), num2 = Integer.parseInt(strArr.get(i+1));
                        String operator = strArr.get(i);
    
                        switch (operator) {
                            case "+":
                                num = Math.addExact(num1, num2);
                                break;
                            case "-":
                                num = Math.subtractExact(num1,num2);
                                break;
                            case "*":
                                num = Math.multiplyExact(num1,num2);
                                break;
                            case "/":
                                num = Math.floorDiv(num1, num2);
                                break;
                        }
    
                        result = String.valueOf(num);
                    } catch (Exception e) {
                        if(e instanceof ArithmeticException)
                            result = "0으로 나눌 수 없습니다.";
                        else
                            result = "ERROR";
    
                        break;
                    }
    
                    strArr.set(i-1, result);
                    strArr.remove(i); strArr.remove(i);
                }while(i < strArr.size());
    
                return result;
            }
        }
    }

    약 100줄 정도로 작성되었으며..

    보시다시피 많이 졸렬(?)한 코드임을 알 수 있다.

     

    위의 코드에 대해 나름의 분석?아닌 분석, 리뷰를 진행해 보았다.


    1. 실행 결과

     

    정상적인 실행 )

    계산기에서도 저 순서대로 계산을 진행하면 Result와 같은 결과가 나온다.

     

    예외 처리 1)

    분모가 0 이면 당연히 예외처리..

     

    예외 처리 2)

    예외 처리지만, 다른 에러를 띄우는 경우도 ??

    (instanceof를 사용하였따는 점 !)


    2. 문제점? 고찰?

     

    코드를 작성하면서 본인이 느낀 문제점은..

    1. 사칙연산의 우선순위가 적용되어있지 않다. *, / 진행 후 +, - 연산

    2. 시작 숫자가 음수인경우의 처리 Idea. 첫번째 숫자를 0으로 처리

    3. Array 처리 작업이 복잡하다는 점 !!

     

    우선 나의 예상과는 달리 코드의 길이가 생각보다 길어졌다는 점.

    또한, 정규식표현을 공부하였다면 숫자와 문자열 분리를 조금이나마 더 편리하게 할 수 있지 않았었을까 하는 생각..

    (물론, 안한다는건 아니구..ㅎ)

     

    추후에 돌아올 때는 더욱더 견고해진 코드로 찾아 뵙겠습니다!

     

     

    봐주셔서 감사합니다 ._. ❤️

    '나는야 개발자 > Java' 카테고리의 다른 글

    [Java] ChineseCalendar / KoreanLunarCalendar  (0) 2022.07.14

    댓글

Designed by Tistory.