01. 함수 : 선언적 함수

자바스크립트(JavaScript)에서 함수는 프로그램 내에서 재사용 가능한 코드 블록을 나타내는 중요한 개념입니다. 함수를 사용하면 특정 작업을 수행하는 코드를 논리적으로 묶어서 호출하고 실행할 수 있습니다. 이를 통해 코드의 재사용성을 증가시키고 유지보수를 용이하게 만들 수 있습니다. 함수는 자체 스코프 내에서 변수를 선언하고, 매개변수를 통해 입력을 받아 작업을 수행하며, 결과를 반환할 수 있습니다.

{
    function func(){
        var x = 100;
        var y = 200;
        var z = "javascript";

        console.log(x); 
        console.log(y);
        console.log(z); 
   }
   func();
}

함수 선언은 function 키워드를 사용하여 함수를 정의하는 것을 말합니다. 함수 선언을 통해 함수의 이름, 매개변수(parameter), 함수 본문 등을 정의하고 해당 함수를 호출할 수 있습니다.

결과 확인하기
100
200
javascript

02. 함수 : 익명 함수

자바스크립트에서 익명 함수(Anonymous Function)는 이름이 없는 함수를 말합니다. 익명 함수는 주로 함수 표현식으로 사용되며, 다른 함수의 인수로 전달되거나 변수에 할당되는 등의 상황에서 활용됩니다. 익명 함수는 함수 선언과 마찬가지로 함수의 기능을 정의하고 호출할 수 있습니다.

{
    const func8 = function (){
        let x = 100;
        let y = 200;
        let z = "javascript";

        console.log(x); 
        console.log(y);
        console.log(z);  
    }
    func();
}   

익명 함수는 주로 함수 표현식과 함께 사용됩니다. 함수 표현식은 변수에 함수를 할당하는 것을 의미하며, 변수를 통해 익명 함수를 참조하고 호출할 수 있습니다.

결과 확인하기
100
200
javascript

03. 함수 : 매개변수 함수

매개변수 함수(Functions with Parameters)는 함수가 호출될 때 함수 내부로 값을 전달하기 위해 사용되는 개념입니다. 함수는 종종 특정 작업을 수행하기 위해 입력값을 필요로 하며, 이 입력값은 매개변수(parameter)를 통해 함수 내부로 전달됩니다.

{
    function func(x, y, z){
        console.log(x);
        console.log(y);
        console.log(z);
    }
    func(100, 200, "javascript");

    const func1 = function(x, y, z){
        console.log(x);
        console.log(y);
        console.log(z);
    }
    func(100, 200, "javascript");
}   

매개변수 함수는 여러 가지 방법으로 사용되며, 함수의 유연성과 재사용성을 높이는 데 도움을 줍니다.

결과 확인하기
100
200
javascript
100
200
javascript

04. 함수 : 리턴값 함수

리턴값 함수(Return Value Functions)는 함수가 작업을 수행한 후 결과값을 반환하는 함수를 말합니다. 함수 내부에서 계산된 값을 함수 외부로 전달하거나 다른 곳에서 활용하기 위해 사용됩니다.

{
    function func(){
        const x = 100;
        const y = 200;
        const z = "javascript";
                
        return x + y;
    }
    console.log(func());

    const func1 = function(){
        const x = 100;
        const y = 200;
    const z = "javascript";
                
        return x + y;
    }
    console.log(func1());
}   

리턴값 함수는 함수의 실행 결과를 외부로 전달하거나 다른 연산에서 활용하기 위해 중요한 개념입니다. 함수가 작업을 수행하고 그 결과를 호출한 쪽에서 활용할 수 있도록 합니다.

결과 확인하기
300
300

05. 함수 : 매개변수 + 리턴값 함수

매개변수와 리턴값을 가지는 함수는 입력값을 받아 처리하고, 그 결과를 반환하는 기능을 수행합니다.

{
    function func(x){
        return x;
    }
    document.write(func("함수가 실행되었습니다.1
")); }

매개변수는 함수로 전달되는 입력 값들을 가리키며, 리턴값은 함수가 처리한 결과를 호출한 곳으로 반환하는 값입니다.

결과 확인하기
함수가 실행되었습니다.1

06. 화살표 함수 : 선언적 함수

화살표 함수는 화살표(=>) 연산자를 사용하여 정의됩니다. 화살표 함수에서는 함수의 이름이 필요하지 않으며, 함수의 인자는 괄호 안에 정의되고, 함수 본문은 화살표 오른쪽에 작성됩니다.

{
    func = () => {
        console.log("실행되었습니다.");
    }
    func();
}   

func 변수에 화살표 함수가 할당됩니다. 이 함수는 매개변수가 없으며, 함수 본문은 단순히 "실행되었습니다"라는 문자열을 콘솔에 출력하는 동작을 수행합니다.
그 다음, func()라는 함수 호출이 있습니다. 이 코드는 이전에 정의한 func 변수에 할당된 화살표 함수를 실행하도록 요청합니다.
실행 결과는 다음과 같이 콘솔에 "실행되었습니다"라는 문자열이 출력됩니다

결과 확인하기
실행되었습니다

07. 화살표 함수 : 익명 함수

화살표 함수는 화살표(=>) 연산자를 사용하여 정의됩니다. 화살표 함수에서는 함수의 이름이 필요하지 않으며, 함수의 인자는 괄호 안에 정의되고, 함수 본문은 화살표 오른쪽에 작성됩니다.

{
    const func = () => {
        console.log("실행되었습니다");
    }
    func();
}   

1.const func는 화살표 함수를 func라는 변수에 할당합니다.
2.func();은 func 변수에 할당된 화살표 함수를 호출하고, 함수 본문 내에서 "실행되었습니다"라는 문자열을 콘솔에 출력합니다.

결과 확인하기
실행되었습니다

08. 화살표 함수 : 매개변수 함수

화살표 함수는 화살표(=>) 연산자를 사용하여 정의됩니다. 화살표 함수에서는 함수의 이름이 필요하지 않으며, 함수의 인자는 괄호 안에 정의되고, 함수 본문은 화살표 오른쪽에 작성됩니다.

{
    func = (str) => {
        console.log(str);
    }
    func("실행되었습니다");
}   

1.func = (str) => { console.log(str); }은 화살표 함수 func를 정의합니다. 이 함수는 str 매개변수를 받아와서 받은 문자열을 콘솔에 출력합니다.
2.func("실행되었습니다");은 정의된 화살표 함수 func를 호출합니다. 호출 시 문자열 "실행되었습니다"가 함수 내부로 전달되고, 이 문자열이 콘솔에 출력됩니다.

결과 확인하기
실행되었습니다

09. 화살표 함수 : 리턴값 함수

화살표 함수는 화살표(=>) 연산자를 사용하여 정의됩니다. 화살표 함수에서는 함수의 이름이 필요하지 않으며, 함수의 인자는 괄호 안에 정의되고, 함수 본문은 화살표 오른쪽에 작성됩니다.

{
    func = () => {
        return "실행되었습니다";
    }
    console.log(func());
}   

1.func = () => { return "실행되었습니다"; }은 화살표 함수 func를 정의합니다. 이 함수는 매개변수를 받지 않고, "실행되었습니다"라는 문자열을 반환합니다.
2.console.log(func());은 정의된 화살표 함수 func를 호출하고 반환된 문자열 "실행되었습니다"를 콘솔에 출력합니다.

결과 확인하기
실행되었습니다

10. 화살표 함수 : 매개변수 + 리턴값 함수

화살표 함수는 화살표(=>) 연산자를 사용하여 정의됩니다. 화살표 함수에서는 함수의 이름이 필요하지 않으며, 함수의 인자는 괄호 안에 정의되고, 함수 본문은 화살표 오른쪽에 작성됩니다.

{
    // 익명 함수

    const func = (str) => {
        return str;
    }
    console.log(func("실행되었습니다.1"));

    // 괄호 생략 
    
    const func2 = str => {
        return str;
    }
    console.log(func2("실행되었습니다.2"));

    // 리턴 생략
    const func3 = str =>  str;
            
    console.log(func3("실행되었습니다.3"));

    // 선언적 (가독성X)
    func4 = str => str;

    console.log(func4("실행되었습니다.4"))
}   

익명 함수
1.func = (str) => { return str; }는 화살표 함수 func를 정의합니다. 이 함수는 str 매개변수를 받아와서 받은 문자열을 그대로 반환합니다.
2.console.log(func("실행되었습니다.1"));은 정의된 화살표 함수 func를 호출하고, 문자열 "실행되었습니다.1"을 함수에 전달합니다.
함수 내부에서는 이 문자열을 받아서 그대로 반환하므로, 콘솔에 "실행되었습니다.1"이 출력됩니다.

괄호 생략
1.func2 = str => { return str; }는 화살표 함수 func2를 정의합니다. 이 함수는 하나의 매개변수 str을 받아서 받은 문자열을 그대로 반환합니다.
2.console.log(func2("실행되었습니다.2"));은 정의된 화살표 함수 func2를 호출하고, 문자열 "실행되었습니다.2"를 함수에 전달합니다.
함수 내부에서는 이 문자열을 받아서 그대로 반환하므로, 콘솔에 "실행되었습니다.2"가 출력됩니다.

리턴 생략
1.func3 = str => str;는 화살표 함수 func3를 정의합니다. 이 함수는 하나의 매개변수 str을 받아서 받은 문자열을 그대로 반환합니다.
화살표 함수의 경우, 중괄호 {}와 return 키워드를 생략하고 한 줄로 표현할 수 있습니다.
2.console.log(func3("실행되었습니다.3"));은 정의된 화살표 함수 func3를 호출하고, 문자열 "실행되었습니다.3"을 함수에 전달합니다.
함수 내부에서는 이 문자열을 받아서 그대로 반환하므로, 콘솔에 "실행되었습니다.3"이 출력됩니다.

선언적 (가독성X)
1.func4 = str => str;는 화살표 함수 func4를 정의합니다. 이 함수는 하나의 매개변수 str을 받아서 받은 문자열을 그대로 반환합니다.
화살표 함수의 경우, 중괄호 {}와 return 키워드를 생략하고 한 줄로 표현할 수 있습니다.
2.console.log(func4("실행되었습니다.4"));은 정의된 화살표 함수 func4를 호출하고, 문자열 "실행되었습니다.4"을 함수에 전달합니다.
함수 내부에서는 이 문자열을 받아서 그대로 반환하므로, 콘솔에 "실행되었습니다.4"가 출력됩니다.

결과 확인하기
실행되었습니다.1
실행되었습니다.2
실행되었습니다.3
실행되었습니다.4

11. 함수 유형 : 함수와 매개변수를 이용한 형태

"매개변수를 이용한 형태"의 함수입니다. 이 함수는 두 개의 매개변수를 받아들이며 (num과 str), 이 매개변수를 사용하여 함수 내부에서 작업을 수행합니다.

{           
    function func(num, str){
        console.log(num + ". " + str);
        console.log(`${num}. ${str}`);
    }
    func(11, "함수가 실행되었습니다.");
}

console.log(num + ". " + str);: 이 줄은 num과 str을 문자열 결합 연산자인 +를 사용하여 연결하고, 그 결과를 콘솔에 출력합니다. ${num}. ${str}와 같은 문자열을 생성합니다.
console.log(`${num}. ${str}`);: 이 줄은 ES6의 템플릿 리터럴을 사용하여 ${} 내에 있는 변수 num과 str을 삽입하고, 그 결과를 콘솔에 출력합니다. 마찬가지로 ${num}. ${str}와 같은 문자열을 생성합니다.
그런 다음 func 함수가 호출되고 인자로 11과 "함수가 실행되었습니다."를 전달합니다. 콘솔에는 다음과 같이 두 줄의 출력이 표시됩니다

결과 확인하기
11. 함수가 실행되었습니다.

12. 함수 유형 : 함수와 변수를 이용한 형태

함수 내에서 변수를 선언하고 사용하여 작업을 수행하는 형태를 말합니다.

{           
    const num = 12;
    const str = "함수가 실행되었습니다";

    function func(num, str){
        console.log(`${num}. ${str}`);
    }
    func(num, str);
}

1.const num = 12;: num이라는 상수를 선언하고 값으로 12를 할당합니다.
2.const str = "함수가 실행되었습니다";: str이라는 상수를 선언하고 값으로 "함수가 실행되었습니다"를 할당합니다.
3.function func(num, str) { ... }: func라는 이름의 함수를 정의합니다. 이 함수는 두 개의 매개변수 num과 str을 받아들입니다.
4.console.log(${num}. ${str});: 함수 내에서 템플릿 리터럴을 사용하여 num과 str을 결합한 문자열을 콘솔에 출력합니다. 이 문자열은 ${num}. ${str}와 같은 형태로 출력됩니다.

결과 확인하기
12. 함수가 실행되었습니다.

13. 함수 유형 : 함수와 배열 이용한 형태

함수는 배열을 매개변수로 받거나 배열을 이용하여 작업을 수행하거나 반환할 수 있습니다.

{           
    const num = [13, 14];
    const str = ["함수가 실행되었습니다.", "함수가 실행되었습니다."]

    function func(num, str){
        console.log(`${num}. ${str}`);
    }
    func(num[0], str[0]);
    func(num[1], str[1]);
}

1.const num = [13, 14];: num이라는 배열을 선언하고, 배열 안에 13과 14 두 개의 숫자를 요소로 가지도록 초기화합니다.
2.const str = ["함수가 실행되었습니다.", "함수가 실행되었습니다."];: str이라는 배열을 선언하고, 배열 안에 "함수가 실행되었습니다."라는 문자열을 두 번 넣어 초기화합니다.
3.function func(num, str) { ... }: func라는 이름의 함수를 정의합니다. 이 함수는 두 개의 매개변수 num과 str을 받아들입니다.
4.console.log(${num}. ${str});: 함수 내에서 템플릿 리터럴을 사용하여 num과 str을 결합한 문자열을 콘솔에 출력합니다. 이 문자열은 ${num}. ${str}와 같은 형태로 출력됩니다.

결과 확인하기
13. 함수가 실행되었습니다.
14. 함수가 실행되었습니다.

14. 함수 유형 : 함수와 객체 이용한 형태

함수는 객체를 매개변수로 받거나 객체를 반환하고, 객체 내부의 속성과 메서드를 활용하여 작업을 수행합니다.

{           
    const info = {
        num : 15,
        str : "함수가 실행되었습니다"
    }
    function func(num, str){
        console.log(`${num}. ${str}`);
    }
    func(info.num, info.str);
}

1.const info = { num: 15, str: "함수가 실행되었습니다" };: info라는 객체를 정의하고, 객체 내에 num 속성에는 15를, str 속성에는 "함수가 실행되었습니다"를 할당합니다. 이 객체에는 두 가지 속성이 포함되어 있습니다.
2.function func(num, str) { ... }: func라는 이름의 함수를 정의합니다. 이 함수는 두 개의 매개변수 num과 str을 받아들입니다.
3.console.log(${num}. ${str});: 함수 내에서 템플릿 리터럴을 사용하여 num과 str을 결합한 문자열을 콘솔에 출력합니다. 이 문자열은 ${num}. ${str}와 같은 형태로 출력됩니다.
4.함수 호출 시에는 info.num과 info.str 값을 인자로 전달합니다. 여기서 info.num은 객체 info의 num 속성에 있는 값 15를, info.str은 객체 info의 str 속성에 있는 문자열 "함수가 실행되었습니다"를 전달합니다.

결과 확인하기
15. 함수가 실행되었습니다

15. 함수 유형 : 함수와 객체 및 배열을 이용한 형태

"함수와 객체 및 배열을 이용한 형태"는 JavaScript에서 다양한 데이터 구조를 조합하여 작업을 수행하는 형태입니다.

{           
    const info = [
        { num: 16, str: "함수가 실행되었습니다."},
        { num: 17, str: "함수가 실행되었습니다."},
    ];
    function func(num, str){
        console.log(`${num}. ${str}`);
    }
    func(info[0].num, info[0].str);
    func(info[1].num, info[1].str);
}

1.const info = [...]: info라는 배열을 정의하고, 배열 내에 객체들을 요소로 가지도록 초기화합니다. 각 객체는 num과 str이라는 속성을 가지고 있습니다.
2.function func(num, str) { ... }: func라는 이름의 함수를 정의합니다. 이 함수는 두 개의 매개변수 num과 str을 받아들입니다.
3.console.log(${num}. ${str});: 함수 내에서 템플릿 리터럴을 사용하여 num과 str을 결합한 문자열을 콘솔에 출력합니다. 이 문자열은 ${num}. ${str}와 같은 형태로 출력됩니다.
4.그런 다음, func 함수가 두 번 호출됩니다:
5.첫 번째 호출에서는 info 배열의 첫 번째 요소에 접근하여 해당 객체의 num과 str 속성 값을 인자로 전달하고, 두 번째 호출에서는 info 배열의 두 번째 요소에 접근하여 해당 객체의 num과 str 속성 값을 인자로 전달합니다.

결과 확인하기
16. 함수가 실행되었습니다
17. 함수가 실행되었습니다

16. 함수 유형 : 함수와 객체 안에 함수를 이용한 형태

"함수와 객체 및 배열을 이용한 형태"는 JavaScript에서 다양한 데이터 구조를 조합하여 작업을 수행하는 형태입니다.

{           
    const info = [
        { num: 16, str: "함수가 실행되었습니다."},
        { num: 17, str: "함수가 실행되었습니다."},
    ];
    function func(num, str){
        console.log(`${num}. ${str}`);
    }
    func(info[0].num, info[0].str);
    func(info[1].num, info[1].str);
}

1.const info = [...]: info라는 배열을 정의하고, 배열 내에 객체들을 요소로 가지도록 초기화합니다. 각 객체는 num과 str이라는 속성을 가지고 있습니다.
2.function func(num, str) { ... }: func라는 이름의 함수를 정의합니다. 이 함수는 두 개의 매개변수 num과 str을 받아들입니다.
3.console.log(${num}. ${str});: 함수 내에서 템플릿 리터럴을 사용하여 num과 str을 결합한 문자열을 콘솔에 출력합니다. 이 문자열은 ${num}. ${str}와 같은 형태로 출력됩니다.
4.그런 다음, func 함수가 두 번 호출됩니다:
5.첫 번째 호출에서는 info 배열의 첫 번째 요소에 접근하여 해당 객체의 num과 str 속성 값을 인자로 전달하고, 두 번째 호출에서는 info 배열의 두 번째 요소에 접근하여 해당 객체의 num과 str 속성 값을 인자로 전달합니다.

결과 확인하기
16. 함수가 실행되었습니다
17. 함수가 실행되었습니다

17. 함수 유형 : 객체 생성자 함수

"함수와 객체 및 배열을 이용한 형태"는 JavaScript에서 다양한 데이터 구조를 조합하여 작업을 수행하는 형태입니다.

{           
    function Func(num,str){
        this.num = num
        this.str = str
        this.result = () =>{
            console.log(`${this.num}. ${this.str}`);
        }
    }
    // 인스턴스 생성 
    const info1 = new Func(19, "함수가 실행되었습니다.");
    const info2 = new Func(20, "함수가 실행되었습니다.");

    // 호출
    info1.result();
    info2.result();
}

1.function Func(num, str) { ... }: Func라는 객체 생성자 함수를 정의합니다. 이 함수는 두 개의 매개변수 num과 str을 받아들이며, 이 두 값을 객체의 속성으로 설정하고, result라는 메서드를 객체에 추가합니다. 이 메서드는 객체 내의 num과 str을 사용하여 문자열을 생성하고 콘솔에 출력합니다.
2.const info1 = new Func(19, "함수가 실행되었습니다.");: Func 생성자 함수를 사용하여 info1이라는 객체 인스턴스를 생성합니다. 생성자 함수에 전달된 인자 19와 "함수가 실행되었습니다."는 num과 str 속성에 각각 설정됩니다.
3.const info2 = new Func(20, "함수가 실행되었습니다.");: 비슷하게 Func 생성자 함수를 사용하여 info2라는 객체 인스턴스를 생성합니다. 이 때, num은 20이고 str은 같은 문자열인 "함수가 실행되었습니다."로 설정됩니다.
4.info1.result();: info1 객체의 result 메서드를 호출합니다. 이 메서드는 this.num과 this.str을 이용하여 문자열을 생성하고, 결과를 콘솔에 출력합니다.
5.info2.result();: 이번에는 info2 객체의 result 메서드를 호출합니다. 마찬가지로 this.num과 this.str을 이용하여 문자열을 생성하고, 결과를 콘솔에 출력합니다.

결과 확인하기
19. 함수가 실행되었습니다
20. 함수가 실행되었습니다

18. 함수 유형 : 프로토타입 함수

프로토타입 함수(Prototype Function)는 JavaScript에서 객체 지향 프로그래밍 (OOP) 개념 중 하나로, 객체의 프로토타입(prototype)에 함수를 추가하여 모든 해당 객체 유형의 인스턴스가 해당 함수를 공유할 수 있도록 하는 방법입니다.

{           
    function Func(num, str){
        this.num = num
        this.str = str
    }

    Func.prototype.result = function(){
        console.log(`${this.num}. ${this.str}`);
    }

    const info1 = new Func(21, "함수가 실행되었습니다.")
    const info2 = new Func(22, "함수가 실행되었습니다.")

    info1.result();
    info2.result();
}

1.function Func(num, str) { ... }: Func라는 객체 생성자 함수를 정의합니다. 이 함수는 두 개의 매개변수 num과 str을 받아들이며, 이 두 값을 객체의 속성으로 설정하고, result라는 메서드를 객체에 추가합니다. 이 메서드는 객체 내의 num과 str을 사용하여 문자열을 생성하고 콘솔에 출력합니다.
2.const info1 = new Func(19, "함수가 실행되었습니다.");: Func 생성자 함수를 사용하여 info1이라는 객체 인스턴스를 생성합니다. 생성자 함수에 전달된 인자 19와 "함수가 실행되었습니다."는 num과 str 속성에 각각 설정됩니다.
3.const info2 = new Func(20, "함수가 실행되었습니다.");: 비슷하게 Func 생성자 함수를 사용하여 info2라는 객체 인스턴스를 생성합니다. 이 때, num은 20이고 str은 같은 문자열인 "함수가 실행되었습니다."로 설정됩니다.
4.info1.result();: info1 객체의 result 메서드를 호출합니다. 이 메서드는 this.num과 this.str을 이용하여 문자열을 생성하고, 결과를 콘솔에 출력합니다.
5.info2.result();: 이번에는 info2 객체의 result 메서드를 호출합니다. 마찬가지로 this.num과 this.str을 이용하여 문자열을 생성하고, 결과를 콘솔에 출력합니다.

결과 확인하기
19. 함수가 실행되었습니다
20. 함수가 실행되었습니다

19. 함수 유형 : 객체 리터럴 함수

일반적으로 "객체 리터럴에 함수를 포함하는 방법"이라고 설명됩니다. 이것은 JavaScript에서 객체와 함수를 조합하여 사용하는 방법 중 하나입니다.

{           
    function Func(num,str){
        this.num = num
        this.str = str
    }

    Func.prototype = {
        result1 : function(){
            console.log(`${this.num}. ${this.str}`);
        },
        result2 : function(){
            console.log(`${this.num}. ${this.str}`);
        }
    }
    const info1 = new Func(23, "함수가 실행되었습니다.")
    const info2 = new Func(24, "함수가 실행되었습니다.")

    info1.result1();
    info2.result2();
}

1.Func 함수 정의:
2.Func 함수는 두 개의 인자(num과 str)를 받습니다.
3.함수 내에서 this.num과 this.str 프로퍼티에 해당 인자 값을 할당합니다.
4.Func 프로토타입 설정:
5.Func.prototype을 사용하여 result1과 result2라는 두 개의 메서드를 정의합니다.
6.result1 및 result2 메서드는 현재 객체의 num 및 str 속성 값을 출력하는 간단한 함수입니다.
7.두 개의 객체 생성:
8.info1과 info2는 Func 생성자 함수를 사용하여 생성된 객체입니다.
9.info1은 23과 "함수가 실행되었습니다."라는 값을 가지고 있습니다.
10.info2는 24와 "함수가 실행되었습니다."라는 값을 가지고 있습니다.
11.객체 메서드 호출:
12.info1.result1()을 호출하면 info1 객체의 result1 메서드가 실행되어 "23. 함수가 실행되었습니다."를 출력합니다.
13.info2.result2()를 호출하면 info2 객체의 result2 메서드가 실행되어 "24. 함수가 실행되었습니다."를 출력합니다.

결과 확인하기
23. 함수가 실행되었습니다
24. 함수가 실행되었습니다

20. 함수 : 즉시실행함수

즉시실행함수는 함수를 정의하자마자 즉시 호출하여 실행하는 방법을 말합니다.

{           
    (function (){
        console.log("25. 함수가 실행되었습니다.");
    })();

    (() => {
        console.log("26. 함수가 실행되었습니다.");
    })();
}

1.(function () { console.log("25. 함수가 실행되었습니다."); })();: 익명 함수를 정의하고 즉시 실행합니다. 이 함수는 "25. 함수가 실행되었습니다."라는 메시지를 콘솔에 출력합니다.
2.(() => { console.log("26. 함수가 실행되었습니다."); })();: 화살표 함수를 정의하고 즉시 실행합니다. 이 함수는 "26. 함수가 실행되었습니다."라는 메시지를 콘솔에 출력합니다.
3.각각의 즉시 실행 함수는 함수가 정의되자마자 실행되므로, 스크립트를 실행할 때 즉시 메시지가 콘솔에 출력됩니다. 이 코드는 주로 스코프를 제어하고 코드 블록을 독립적으로 실행할 때 유용하게 사용됩니다.

결과 확인하기
25. 함수가 실행되었습니다.
26. 함수가 실행되었습니다.

21. 함수 : 파라미터함수

"파라미터 함수(parameterized function)"는 함수를 정의할 때 매개변수(parameter)를 가지고 있는 함수를 가리킵니다. 매개변수는 함수에 전달되는 값들을 받아들이는 변수로, 함수의 동작을 제어하고 데이터를 전달하는 데 사용됩니다.

{           
    function func(str = "27. 함수가 실행되었습니다."){
        console.log(str);
    }
    func();

    const func1 = (str = "28. 함수가 실행되었습니다.") => {
        console.log(str);
    }
    func1();
}

1.func 함수:str 매개변수의 기본값으로 "27. 함수가 실행되었습니다."를 설정하고 있습니다.
함수를 호출할 때 str 인자가 제공되지 않으면 기본값이 사용됩니다.
func() 함수를 호출하면 "27. 함수가 실행되었습니다."라는 메시지가 콘솔에 출력됩니다.
2.func1 화살표 함수:str 매개변수의 기본값으로 "28. 함수가 실행되었습니다."를 설정하고 있습니다.
마찬가지로 함수를 호출할 때 str 인자가 제공되지 않으면 기본값이 사용됩니다.
func1() 화살표 함수를 호출하면 "28. 함수가 실행되었습니다."라는 메시지가 콘솔에 출력됩니다.

결과 확인하기
27. 함수가 실행되었습니다.
28. 함수가 실행되었습니다.

22. 함수 : 재귀 함수

"재귀 함수(recursive function)는 자기 자신을 호출하는 함수를 말합니다. 재귀 함수는 주로 하나의 큰 문제를 작은 부분 문제로 나누어 해결할 때 사용됩니다.

{           
    function func(num){
        for(let i=1; i<=num; i++){
            console.log("29. 함수가 실행되었습니다.");
        }
    }
    func(10);

    function func1(num){
        if(num < 1) return;

        console.log("30. 함수가 실행되었습니다.");
        func1(num - 1);
    }
    func1(10);
}

1.func(num) 함수:이 함수는 매개변수 num에 전달된 숫자만큼 "29. 함수가 실행되었습니다."라는 메시지를 반복하여 콘솔에 출력합니다.
for 루프를 사용하여 num 횟수만큼 메시지를 출력합니다.
예를 들어, func(10)을 호출하면 "29. 함수가 실행되었습니다."가 10번 출력됩니다.
2.func1(num) 함수:이 함수는 재귀 함수(recursive function)로 구현되어 있습니다.
매개변수 num이 1보다 작거나 같을 때 종료 조건으로 설정되어 있습니다. 따라서 num이 1보다 작으면 함수가 더 이상 재귀 호출되지 않고 종료됩니다.
그렇지 않은 경우, 함수 내에서 "30. 함수가 실행되었습니다." 메시지를 출력한 후 func1(num - 1)과 같이 자기 자신을 재귀적으로 호출합니다.
호출된 함수는 num이 1씩 감소하면서 재귀적으로 호출되고, 종료 조건에 도달할 때까지 계속해서 메시지를 출력합니다.
func1(10)을 호출하면 10부터 1까지 순서대로 "30. 함수가 실행되었습니다."가 출력됩니다.

결과 확인하기

23. 함수 : 콜백 함수

콜백 함수(callback function)는 다른 함수의 인자로 전달되고, 이후에 실행되는 함수를 가리킵니다. 콜백 함수는 주로 비동기적인 작업이 완료되었을 때 결과를 처리하거나 어떤 이벤트가 발생했을 때 특정 동작을 수행하기 위해 사용됩니다.

{           
    function func1(){
        console.log("32. 함수가 실행되었습니다.")
    }
    function func2(callback){
        callback();
    }
    func2(func1);

    // 03 반복문으로 콜백함수 만들기
    function func3(num){
        console.log(num + ". 함수가 실행되었스빈다")
    }
    function func4(callback){
        for(let i=33; i<=38; i++){
            callback(i);
        }
    }
    func4(func3);
}

1.func1과 func2 함수:func1 함수는 "32. 함수가 실행되었습니다."라는 메시지를 콘솔에 출력하는 역할을 합니다.
func2 함수는 다른 함수 callback을 인자로 받아서 이를 실행하는 역할을 합니다.
func2(func1)은 func2 함수를 호출하면서 func1 함수를 콜백으로 전달합니다. 따라서 func1 함수가 실행되어 "32. 함수가 실행되었습니다."라는 메시지가 콘솔에 출력됩니다.
2.func3와 func4 함수:func3 함수는 매개변수 num을 받아서 "n. 함수가 실행되었습니다"라는 형식의 메시지를 콘솔에 출력하는 역할을 합니다.
func4 함수는 다른 함수 callback을 인자로 받아서 for 루프를 사용하여 숫자 33부터 38까지를 callback 함수에 전달하여 실행합니다.
func4(func3)은 func4 함수를 호출하면서 func3 함수를 콜백으로 전달합니다. 이 때, func3 함수가 func4 함수에서 여러 번 호출되면서 "n. 함수가 실행되었습니다" 형식의 메시지가 순서대로 출력됩니다.

결과 확인하기

24. 함수 : 비동기 함수 : 콜백 함수

비동기 함수(Asynchronous function)는 JavaScript에서 다른 코드와 병렬적으로 실행되며, 주로 비동기 작업을 처리하기 위해 사용됩니다. 이러한 비동기 작업은 네트워크 요청, 파일 읽기, 타이머 기능 등과 관련이 있으며, 이러한 작업은 결과를 기다리지 않고 프로그램이 계속 실행됩니다. 그러면서 비동기 작업이 완료되면 결과를 처리하기 위해 콜백 함수가 호출됩니다. 비동기 함수를 사용하려면 주로 콜백 함수(callback function)를 활용합니다. 콜백 함수는 다른 함수의 매개변수로 전달되고, 비동기 작업이 완료되면 호출됩니다. 이를 통해 작업의 완료를 감지하고 결과를 처리할 수 있습니다.

{           
    // 01 동기적인 함수 호출 (39, 40)
    function func1(){
        console.log("39. 함수가 실행되었습니다.");
    }
    function func2(){
        console.log("40. 함수가 실행되었습니다.");
    }

    func1();
    func2();

    // 02 비동기적인 함수 호출 (42, 1초후 41)
    function func3(){
        setTimeout(() => {
            console.log("41. 함수가 실행되었습니다.");
        }, 1000);
    }
    function func4(){
        console.log("42. 함수가 실행되었습니다.");
    }

    func3();
    func4();

    // 03 비동기적인 콜백 함수 호출 (43, 44 (43이 다 다운이된다음에 그다음 44가 호출되게하는 방법 | 가독성이 안 좋아 잘 사용하지 않음))
        function func5(callback){
            setTimeout(() => {
                console.log("43. 함수가 실행되었습니다.");
                callback();
            }, 1000);
        }
        function func6(){
            console.log("44. 함수가 실행되었습니다.");
        }

        func5(function(){
            func6();
        });
    // 콜백 지옥
        function funcA(callback){
            setTimeout(() => {
                console.log("funcA가 실행되었습니다.")
                callback();
            }, 1000)
        };
        function funcB(callback){
            setTimeout(() => {
                console.log("funcB가 실행되었습니다.")
                callback();
            }, 1000)
        };
        function funcC(callback){
            setTimeout(() => {
                console.log("funcC가 실행되었습니다.")
                callback();
            }, 1000)
        };
        function funcD(){
            setTimeout(() => {
                console.log("funcD가 실행되었습니다.")
            }, 1000)
        };

        funcA(function(){
            funcB(function(){
                funcC(function(){
                    funcD();
                });
            });
        });
    }    

1.동기적인 함수 호출:func1과 func2 함수는 동기적으로 호출되며, func1이 먼저 실행된 후에 func2가 실행됩니다.
2.비동기적인 함수 호출:func3 함수는 setTimeout을 사용하여 1초(1000ms) 후에 실행됩니다. func4 함수는 즉시 실행됩니다.
3.비동기적인 콜백 함수 호출:func5 함수는 비동기적으로 실행되고, 1초 후에 콜백 함수를 호출합니다. 콜백 함수 내에서 func6 함수가 실행됩니다.

결과 확인하기
39. 함수가 실행되었습니다.
40. 함수가 실행되었습니다.
42. 함수가 실행되었습니다.
41. 함수가 실행되었습니다.
43. 함수가 실행되었습니다.
44. 함수가 실행되었습니다.
funcA가 실행되었습니다.
funcB가 실행되었습니다.
funcC가 실행되었습니다.
funcD가 실행되었습니다.

25. 함수 : 비동기 함수 : 프로미스

비동기 함수는 일반적으로 시간이 걸리는 작업을 수행하는 동안 다른 작업을 실행할 수 있게 해줍니다.
이를 통해 웹 애플리케이션에서 지연 없이 사용자 경험을 개선하거나 네트워크 요청과 같은 비동기 작업을 수행할 수 있습니다.
프로미스(Promise)는 비동기 코드를 더 쉽게 다룰 수 있게 해주는 객체입니다. 프로미스는 비동기 작업이 완료되었을 때 결과를 반환하거나 오류를 처리할 수 있도록 도와줍니다.

{           
    let data = true;

    const func = new Promise((resolve, reject) => {
        if(data){
            resolve("45. 함수가 실행되었습니다.")
        } else {
            reject("45. 함수가 실행되지 않았습니다.")
        }
    });

    func
        .then(
            result => console.log(result)
        )
        .catch (
            error => console.log(error)
        )

    //콜백지옥 --> 프로미스
    function funcA(){
        return new Promise((resolve) => {
            setTimeout(() => {
                console.log("funcA가 실행되었습니다.");
                resolve();
            }, 1000);
        })
    }
    function funcB(){
        return new Promise((resolve) => {
            setTimeout(() => {
                console.log("funcB가 실행되었습니다.");
                resolve();
            }, 1000);
        })
    }
    function funcC(){
        return new Promise((resolve) => {
            setTimeout(() => {
                console.log("funcC가 실행되었습니다.");
                resolve();
            }, 1000);
        })
    }
    function funcD(){
        return new Promise((resolve) => {
            setTimeout(() => {
                console.log("funcD가 실행되었습니다.");
                resolve();
            }, 1000);
        })
    }
    funcA()
        .then(funcB)
        .then(funcC)
        .then(funcD)
        .catch((error) => {
            console.log(error)
        })
}

위 코드는 JavaScript를 사용하여 Promise를 이용한 비동기 작업 관리를 보여주는 코드입니다.
1.data 변수가 true이면 "45. 함수가 실행되었습니다."를 출력하고, 그렇지 않으면 "45. 함수가 실행되지 않았습니다."를 출력하는 func Promise를 생성합니다.
2.func Promise은 then 메소드를 사용하여 성공 시 result를 출력하고, catch 메소드를 사용하여 실패 시 error를 출력합니다.
3.funcA, funcB, funcC, 그리고 funcD 함수는 각각 1초 지연 후에 메시지를 출력하고 Promise를 해결합니다.
4.이후, funcA()가 실행되고, 각 함수는 then 메소드를 통해 비동기적으로 실행되어 "funcA가 실행되었습니다."부터 "funcD가 실행되었습니다."까지의 메시지가 출력됩니다.
5.만약 어떤 함수에서 오류가 발생하면, catch 블록이 실행되어 오류 메시지가 출력됩니다.

결과 확인하기
45. 함수가 실행되었습니다.
funcA가 실행되었습니다.
funcB가 실행되었습니다.
funcC가 실행되었습니다.
funcD가 실행되었습니다.

26. 함수 : 비동기 함수 : async/await

async/await는 JavaScript에서 비동기 코드를 작성하고 관리하는 데 사용되는 편리한 기능 중 하나입니다. 이 기능은 프로미스를 기반으로 하며, 코드를 보다 간결하게 작성하고 에러 처리를 용이하게 할 수 있도록 도와줍니다.
async/await는 코드를 더 읽기 쉽게 만들고, 콜백 지옥을 피하며, 에러 처리를 효율적으로 할 수 있습니다.

{           
    // 01 : 동기 함수 호출
    function func(){
        console.log("46. 함수가 실행되었습니다.");
    };
    func();

    // 02 : 비동기 방식으로 쓰겠다 선언함
    async function func2(){
        console.log("47. 함수가 실행되었습니다.");
    };
    func2();

    // 03 : fetch를 사용한 데이터 가져오기
    async function func3(){
        const result = await fetch("https://l-jy16.github.io/webs2024/json/test.json")
        const data = await result.json();
        console.log(data)
    };
    func3();

    // 04 : 에러 처리를 포함한 fetch 사용
    async function func4(){
        try{
            const result = await fetch("https://l-jy16.github.io/webs2024/json/test.json")
            const data = await result.json();
            console.log(data)
        } catch (error){
            console.log(error)
        }
    };
    func4();
}

1.func 함수를 동기적으로 호출하여 "46. 함수가 실행되었습니다."를 콘솔에 출력합니다.
2.func2 함수를 비동기 함수로 정의하고 호출하여 "47. 함수가 실행되었습니다."를 콘솔에 출력합니다.
3.func3 함수를 비동기 함수로 정의하고, 웹에서 JSON 데이터를 가져오기 위해 fetch를 사용합니다. 데이터를 가져온 후, 해당 데이터를 콘솔에 출력합니다.
4.func4 함수를 비동기 함수로 정의하고, fetch를 사용하여 웹에서 JSON 데이터를 가져오는데, try...catch 블록을 사용하여 에러 처리를 포함합니다. 데이터를 성공적으로 가져오면 출력하고, 에러가 발생하면 에러 메시지를 콘솔에 출력합니다.
이 코드는 동기 함수 호출, 비동기 함수 정의 및 호출, 웹에서 데이터 가져오기, 그리고 에러 처리의 예를 보여주며, JavaScript에서 비동기적인 작업을 다루는 방법을 보여줍니다.

결과 확인하기
1.func 함수는 동기적으로 호출되며, "46. 함수가 실행되었습니다."를 콘솔에 출력합니다.
2.func2 함수는 비동기 함수로 선언되었지만, 내부 코드는 동기적으로 실행되며, "47. 함수가 실행되었습니다."를 콘솔에 출력합니다.
3.func3 함수는 비동기 함수로 선언되었으며, fetch를 사용하여 웹에서 JSON 데이터를 가져옵니다. await 키워드를 사용하여 데이터가 로드될 때까지 기다린 후, 해당 데이터를 콘솔에 출력합니다.
4.func4 함수도 비동기 함수로 선언되었으며, fetch를 사용하여 JSON 데이터를 가져옵니다. 하지만, try...catch 블록을 사용하여 에러 처리를 포함하고 있습니다. 데이터가 정상적으로 로드되면 출력하고, 에러가 발생하면 에러 메시지를 콘솔에 출력합니다.
실제 결과는 웹에서 데이터를 가져오는 네트워크 요청의 성공 또는 실패에 따라 달라집니다. 정상적으로 데이터를 가져오면 JSON 데이터가 출력되며, 에러가 발생하면 에러 메시지가 출력됩니다. 결과값은 요청된 JSON 데이터와 가능한 에러 메시지에 따라 달라질 것입니다.