본문 바로가기
Programming/HTML & CSS & JavaScript

js 3일차 - 객체(3) 함수(1)

by yoon9i 2024. 5. 7.

###########################################################
6. 함수 ( function )(*)

1> 개요
- 용도: 기능처리 담당 (자바의 메서드 역할)

2> 종류1
- 일반함수: 일반적으로 사용되는 함수 의미.
- generator 함수: Generator 객체를 반환하는 함수.
- 비동기 함수: Promise 를 객체를 반환하는 함수.

3> 함수 작성방법 2가지
가. 함수 선언식 (이름있는 함수)

  function 함수명([파라미터, ..]) {
    문장;
    [return 값;]
  }

나. 함수 표현식 (이름없는 함수,익명함수)

  function ([파라미터, ..]) {
    문장;
    [return 값;]
  }

  변수가 함수명으로 사용됨.

<!DOCTYPE html>
<html lang="en">

<head>
    <title>js09_함수1_생성방법2가지</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // 함수 생성 방법 2가지
        // 1. 함수 선언식 (이름있는 함수)

        function fun() {
            console.log("fun");
        }

        // 2. 함수 표현식 (익명함수)(*)

        var fun2 = function () {
            console.log("fun2");
        };

        // 호출
        fun(); // 함수 선언식 호출
        fun2(); // 함수 표현식 호출


    </script>
</head>

<body>

</body>

</html>

 

<!DOCTYPE html>
<html lang="en">

<head>
    <title>js09_함수2_인자값갯수달라도가능</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // 함수 생성 방법 2가지
        // 1. 함수 선언식 (이름있는 함수)

        function fun() {
            console.log("fun");
        }
        function fun3(n, n2, n3) {
            console.log("fun", n, n2, n3);
        }

        // 2. 함수 표현식 (익명함수)(*)

        var fun2 = function () {
            console.log("fun2");
        };

        // 호출
        fun(); // 함수 선언식 호출
        fun(10);
        fun(20, 30);

        fun2(); // 함수 표현식 호출
        fun2("aaa");
        fun2(10, "aaa");

        fun3();
        fun3(10);
        fun3(20, 30);
        fun3(20, 30, 40);
        fun3(20, 30, 40, 50);
    </script>
</head>

<body>

</body>

</html>


4> 함수특징
- 반드시 호출해야 된다. (함수명을 이용)
- 호출후 반드시 호출한 곳으로 돌아온다.
- 호출할 때 인자값을 설정할 수 있고
  돌아올때 리턴값이 존재할 수 있다.

- JS 함수는 함수호출시 인자값의 갯수가 달라도 된다. (*)

- 파라미터에 갯수 > 인자값 갯수 경우에 인자값이 저장되고 남은
  파라미터에는 undefined 가 저장되는데 undefined 대신에 임의의 초기값을 설정할 수 있다.
  ==> 함수의 default 파라미터라고 부른다.
  ==> function fun(n=초기값, n2=초기값) {}

<!DOCTYPE html>
<html lang="en">

<head>
    <title>js09_함수3_default파라미터</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // default 파라미터
        function fun(n = 10, n2 = "홍길동", n3 = 10) {
            console.log("fun", n, n2, n3);
        }

        // 호출
        fun();
        fun(10);
        fun(20, 30);
        fun(20, 30, 40);
    </script>
</head>

<body>

</body>

</html>



- 파라미터 갯수 < 인자값 갯수 경우에 파라미터에 저장되고 남은 
  인자값은 소실된다. 이 경우에 소실되는 인자값을 배열로 가져올 수 있다.
  ==> 함수의 rest 파라미터라고 부른다. 
      주의할 점은 파라미터 가장 마지막에만 사용된다.

  ==> function fun(n,...n2){}
      function fun(n,n2,...n3){} 
      fun(10,20,30);

<!DOCTYPE html>
<html lang="en">

<head>
    <title>js09_함수4_rest파라미터</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // default + rest 혼합사용 가능
        function fun(n = 10, n2 = 30, ...n3) {
            console.log("fun", n, n2, n3);
        }

        // rest 파라미터
        function fun(n, n2, ...n3) {
            console.log("fun", n, n2, n3);
        }

        // 호출
        fun(20, 30, 40);
        fun(20, 30, 40, 50);
        fun(20, 30, 40, 60, 70);
        fun(20, 30, 40, 8, 5, 6, 7, 8);
    </script>
</head>

<body>

</body>

</html>



- 함수 호출시 spread 연산자 이용한 방식으로 인자값을 전달 할 수 있다.
ex>
    function fun(n,n2) {}

    var x = [10,20];
    fun(x[0], x[1]); // 기본
    fun(...x); //spread

<!DOCTYPE html>
<html lang="en">

<head>
    <title>js09_함수5_spread연산자를이용한인자값전달</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // spread 연산자 이용한 인자값 전달
        function fun(n, n2) {
            console.log("fun", n, n2);
        }

        var arr = [10, 20];
        // ↓
        // fun(arr[0], arr[1]);
        fun(...arr); // spread 연산자

    </script>
</head>

<body>

</body>

</html>



- 기본형 데이터와 참조형 데이터 인자값 사용

<!DOCTYPE html>
<html lang="en">

<head>
    <title>js09_함수6_기본형및참조형인자값전달_callByvalue_callByValueReference</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // 기본형 및 참조형 인자값전달(callByvalue & callByValueReference)
        // 기본형 전달 ==> 전달받은 함수에서 값변경 해도 원본에는 영향이 없다.
        function fun(n) {
            n = 20; //  값 변경안됨.
        }

        var x = 10;
        fun(x);
        console.log(x);

        // 참조형 전달 ==> 전달받은 함수에서 값변경 해도 원본에는 영향이 있다.
        function fun2(n) {
            n[0] = 100; // 값 변경됨.
        }

        var x2 = [10, 20, 30];
        fun2(x2);
        console.log(x2);

    </script>
</head>

<body>

</body>

</html>


- 기능에 따라 4가지 형태

가. 파라미터 없고 리턴값 없는 형태
나. 파라미터 있는 리턴값 없는 형태
다. 파라미터 없고 리턴값 있는 형태
라. 파라미터 있고 리턴값 있는 형태

<!DOCTYPE html>
<html lang="en">

<head>
    <title>js09_함수7_기능에따른4가지함수형태</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // 가.파라미터 없고 리턴값 없는 형태

        function fun() { }
        var fun2 = function () { };

        fun();
        fun2();

        // 나.파라미터 있는 리턴값 없는 형태

        function fun3(n, n2) { }
        var fun4 = function (n, n2) { };

        fun3(10, 20);
        fun4(30, 40);

        // 다.파라미터 없고 리턴값 있는 형태

        function fun5() {
            return 100;
        }

        var fun6 = function () {
            return 100;
        }

        var result = fun5();
        var result = fun6();

        // 라.파라미터 있고 리턴값 있는 형태

        function fun7(n, n2) {
            return n + n2;
        }
        var fun8 = function (n, n2) {
            return n + n2;
        }

        var result = fun7(10, 20);
        var result = fun8(10, 20);

    </script>
</head>

<body>

</body>

</html>



- JS함수는 일급객체(first-class) 이다.
  일급객체의 핵심개념은 함수를 데이터로 처리하는 것이다.
  함수이용해서 할수 있는 작업은 다음과 같다.

    가. 함수를 변수에 저장할 수 있다.
    나. 함수호출시 인자값으로 함수를 사용할 수 있다.
    ex>
        arr.forEach(인자값);
        personList.forEach(function(data,idx){});
    
    다. 함수호출후 리턴값으로 함수를 사용할 수 있다.
    ex>
        var x = function(){};

        function fun() {
          // return 값;
          return x;
        }
    
    - 콜백함수(callback)
    ==> 개념: 사용자가 명시적으로 호출하지 않고 시스템이 특정상황에 호출하는
              함수를 의미한다.
    ==> 주로 이벤트 처리시 사용된다.

        자바의 swing 이벤트

          Button btnOk = new Button("OK");

          // 사용자호출 - addActionListener()
          // 시스템호출 - actionPerformed()

          btnOk.addActionListener(new ActionListener() {
              public void actionPerformed(ActionEvent e) {

              }
          });

<!DOCTYPE html>
<html lang="en">

<head>
    <title>js09_함수8_일급객체</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // 일급객체

        // 1. 변수에 저장
        function fun() { }

        var fun = function () {
            console.log("fun");
        };

        /*
            fun 이용하는 2가지 형태
            1. fun 자체값 이용 (100번지) ==> fun 변수만 사용
            2. 100 번지에 저장된 함수 이용 ==> fun() 함수호출형식으로 사용
        */

        // 1. fun 자체값 이용(100번지) ==> 콜백함수(callback)
        var fun2 = fun; // fun->함수, fun2->함수

        // 2. 100 번지에 저장된 함수 이용(일반적인 함수를 상요하는 형태이다.)
        fun();

    </script>
</head>

<body>

</body>

</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <title>js09_함수8_일급객체2</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script>
        // 일급객체

        // 1. 변수에 저장
        function fun() { }

        var fun = function () {
            console.log("fun");
        };


        var fun2 = fun;
        fun2();

        // 2. 함수호출시 인자값으로 사용 ==> 콜백함수(callback)(*)
        function yyy() {
            console.log("yyy");
        }

        function zzz() {
            console.log("zzz");
        }

        function xxx(f) {
            f();
        }

        // xxx 호출할때 시스템이 호출해야 되는 함수정보(yyy) 를
        // 인자값으로 전달해야 된다.
        xxx(yyy);
        xxx(zzz);

        // 3. 함수호출후 리턴값으로 함수사용
        // function kkk() {
        //     console.log("kkk");
        // }

        // var kkk = function () { console.log("kkk"); }

        function kkk2() {
            // return kkk;
            return function () { console.log("kkk"); }
        }

        var result = kkk2();
        result();

    </script>
</head>

<body>

</body>

</html>