-
[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