자바스크립트/인프런강의-렛츠기릿 자바스크립트

계산기-고차함수,함수중복제거, 코드줄이기

샐님 2023. 7. 4. 12:52
728x90
반응형

1. 순서도 그리기

 

2. 함수의 중복제거

  let numOne = '';
        let operator = '';
        let numTwo = '';
        const $operator = document.querySelector('#operator');
        const $result = document.querySelector('#result');

        document.querySelector('#num-0').addEventListener('click', OnClickNumer2 ('1'));
 
   const OnClickNumer2 = (number) => {
            if (number) {

            } else {

            }

            //return undefined 가 생략되어 사실상   document.querySelector('#num-0').addEventListener('click', undefined); 와 동일
        }
 

1) return 값을 함수로 넣어줄수있다.


        const OnClickNumer2 = (number) => {
            //return 값을 함수로 넣어줄수있다.
            return () => {
                if (number) {

                } else {

                }
            }

2) 함수가 함수를 return 하는 것을 고차함수 라고 한다. (high order function)

  //화살표 함수는 () 중괄호와 return 이 만나면 생략가능하다.
        const OnClickNumer2 = (number) =>  () => {
            if (number) {

            } else {

            }
        }

3. if 문 중복제거

 1) 공통된 절차를 각 분기점 내부에 넣는다.

 2) 분기점에서 짧은 절차부터 실행하게 if문을 작성한다.

 3) 짧은 절차가 끝나면 return(함수 내부의 경우)이나 break(for 문 내부의 경우)로 중단한다.

 4) else를 제거한다(이때 중첨 하나가 제거된다)

 5) 다음 분기점이 나오면 1~4를 반복한다.

 

 

1)

  const onClickNumber01 = (event) => {
            if (operator) { // 비어있지않다.
                if (!numTwo) {
                    $result.value = '';
                }
                numTwo += event.target.textContent;
                $result.value += event.target.textContent; //공통된거 if문에 넣기
            } else {
                numOne += event.target.textContent;
                $result.value += event.target.textContent; //공통된거 if문에 넣기
            }

        };

2)

 // 짧은 분기절차를 위로 옮김
        const onClickNumber01 = (event) => {
            if (!operator) { // 비어있지않다.

                numOne += event.target.textContent;
                $result.value += event.target.textContent;
            } else { //비어있다
                if (!numTwo) {
                    $result.value = '';
                }
                numTwo += event.target.textContent;
                $result.value += event.target.textContent;
            }

        };

3)

     // return 을 사용하고 else 삭제
        const onClickNumber01 = (event) => {
            if (!operator) { // 비어있지않다.

                numOne += event.target.textContent;
                $result.value += event.target.textContent;
                return;
            }
            if (!numTwo) {
                $result.value = '';
            }
            numTwo += event.target.textContent;
            $result.value += event.target.textContent;

        };

4.전체 코드

<!DOCTYPE html>

<head>
    <meta charset="utf-8">
    <title>계산기</title>
    <style>
        * {
            box-sizing: border-box
        }
        
        #result {
            width: 180px;
            height: 50px;
            margin: 5px;
            text-align: right
        }
        
        #operator {
            width: 50px;
            height: 50px;
            margin: 5px;
            text-align: center
        }
        
        button {
            width: 50px;
            height: 50px;
            margin: 5px
        }
    </style>
</head>

<!-- 계산기 버튼 구현 -->

<body>
    <input readonly id="operator">
    <input readonly type="number" id="result">
    <div class="row">
        <button id="num-7">7</button>
        <button id="num-8">8</button>
        <button id="num-9">9</button>
        <button id="plus">+</button>
    </div>
    <div class="row">
        <button id="num-4">4</button>
        <button id="num-5">5</button>
        <button id="num-6">6</button>
        <button id="minus">-</button>
    </div>
    <div class="row">
        <button id="num-1">1</button>
        <button id="num-2">2</button>
        <button id="num-3">3</button>
        <button id="divide">/</button>
    </div>
    <div class="row">
        <button id="clear">C</button>
        <button id="num-0">0</button>
        <button id="calculate">=</button>
        <button id="multiply">x</button>
    </div>
    <script>
        let numOne = '';
        let operator = '';
        let numTwo = '';
        const $operator = document.querySelector('#operator');
        const $result = document.querySelector('#result');
        const onClickNumber = (event) => {
            console.log("!operator", !operator)
            if (!operator) { // 비어있다 operator = '' 이면 !operator 는 값이 있는지에대한 물음이니까 true
                numOne += event.target.textContent;
                $result.value += event.target.textContent;
                return;
            }
            // 비어있지 않다
            if (!numTwo) {
                $result.value = '';
            }
            numTwo += event.target.textContent;
            $result.value += event.target.textContent;
        };
        document.querySelector('#num-0').addEventListener('click', onClickNumber);
        document.querySelector('#num-1').addEventListener('click', onClickNumber);
        document.querySelector('#num-2').addEventListener('click', onClickNumber);
        document.querySelector('#num-3').addEventListener('click', onClickNumber);
        document.querySelector('#num-4').addEventListener('click', onClickNumber);
        document.querySelector('#num-5').addEventListener('click', onClickNumber);
        document.querySelector('#num-6').addEventListener('click', onClickNumber);
        document.querySelector('#num-7').addEventListener('click', onClickNumber);
        document.querySelector('#num-8').addEventListener('click', onClickNumber);
        document.querySelector('#num-9').addEventListener('click', onClickNumber);

        const onClickOperator = (op) => () => {
            if (numOne) {
                operator = op;
                $operator.value = op;
            } else {
                alert('숫자를 먼저 입력하세요.');
            }
        }



        document.querySelector('#plus').addEventListener('click', onClickOperator('+'));
        document.querySelector('#minus').addEventListener('click', onClickOperator('-'));
        document.querySelector('#divide').addEventListener('click', onClickOperator('/'));
        document.querySelector('#multiply').addEventListener('click', onClickOperator('*'));
        document.querySelector('#calculate').addEventListener('click', () => {
            if (numTwo) {
                switch (operator) {
                    case '+':
                        $result.value = parseInt(numOne) + parseInt(numTwo);
                        break;
                    case '-':
                        $result.value = numOne - numTwo;
                        break;
                    case '*':
                        $result.value = numOne * numTwo;
                        break;
                    case '/':
                        $result.value = numOne / numTwo;
                        break;
                    default:
                        break;
                }
            } else {
                alert('숫자를 먼저 입력하세요.');
            }
        });



        document.querySelector('#clear').addEventListener('click', () => {
            numOne = '';
            operator = '';
            numTwo = '';
            $operator.value = '';
            $result.value = '';
        });





        function test() {
            let result = '';
            if (!a) {
                result = 'a';
                result += 'b';
                return result;
            }
            if (!b) {
                result = 'c';
            }
            result += 'b';
            return result;

        }
    </script>
</body>
728x90
반응형