본문 바로가기
개인 공부용/sparta-calculator

트러블슈팅: 왜 저장이 두번 되니? <7>

by pon9 2024. 11. 15.

저장 기능을 만들고 테스트 하던 중에 치명적인 버그를 발견했다.

로그를 찍어보니 저장 횟수가 연속계산 횟수에 비례한다는 걸 알 수 있었다.

 

ㅋㅋ

 

반복할 때 마다 늘어나는 값이 있다는건데.. 제일 수상한 건 역시 calculate 메서드니까 콘솔을 군데군데 찍어보자.

//Calculator App 의 number List 를 calculationFormula 로 명명
    public double calculate(List<String> calculationFormula) {

        //numbers List 에 있는 짝수번째 값 -> 숫자
        List<Double> numbers = IntStream.range(0, calculationFormula.size())
                .filter(i -> i % 2 == 0)
                .mapToObj(i -> Double.parseDouble(calculationFormula.get(i)))
                .toList();

        //numbers List 에 있는 홀수번째 값 -> 연산자
        List<String> operators = IntStream.range(0, calculationFormula.size())
                .filter(i -> i % 2 != 0)
                .mapToObj(calculationFormula::get)
                .toList();
        System.out.println(calculationFormula);

        //Atomic 변수로 연속 계산을 위한 이전 계산 결과 저장
        //첫 a의 값은 List 의 첫번째 값이어야 하므로 초기값에 numbers.get(0)
        AtomicReference<Double> result = new AtomicReference<>(numbers.get(0));
        System.out.println(result.get() + "아톰!");

        IntStream.range(0, operators.size()).forEach(i -> {
            System.out.println("forEach 문 뱅글뱅글");
            //a의 값은 항상 Atomic 변수로부터 받아옴
            double firstNumber = result.get();
            double secondNumber = numbers.get(i + 1);
            String operator = operators.get(i);
            //enum 으로 숫자와 연산자를 각각 보내서 계산
            Operation operation = Operation.fromSymbol(operator);
            //get 으로 Atomic 변수에 결과값 할당
            result.set(operation.apply(firstNumber, secondNumber));
            //history 저장
            history.saveHistory(firstNumber, secondNumber, operator, result.get());
            System.out.println("히스토리 저장!");
        });
        //현재 저장된 값 반환
        return result.get();
    }

찾았다 요녀석;;

forEach문을 돌리는 횟수 range가 operator의 갯수만큼으로 되어있어서 저장 횟수도 그렇게 늘어났다하하핳ㅎ;; 연속계산을 위한 게 History엔 독이 되었다.

역시 sout 콘솔로그는 신이다 ^_^

그럼 이 코드를 어떻게 고칠 수 있을까?

간단하게 마지막 반복에서만 savehistory가 실행되게끔 고쳤다.

알고리즘을 열심히 푼 게 도움이 된 걸까?

바로 실행시켜보자.

굳~~~!~!~!~!!!!!

이제 history에서 출력한 값으로 무엇을 할지 좀 고민을 해봐야겠다.

 

근데 내용이 이렇게 짧은데 트러블슈팅이라 볼 수 있을까?..

'개인 공부용 > sparta-calculator' 카테고리의 다른 글

<finish> 가 아니라 리팩토링..  (0) 2024.11.17
Interface? or Method? <6>  (1) 2024.11.15
Generic을 도대체 왜 쓸까? <5>  (1) 2024.11.15