JS 챌린지 5일

HeeJune KIM·2023년 9월 9일

1. while문

while (/* 조건식 */) {
    /* 반복 실행될 코드 */
}

while 문은 먼저 조건식을 평가하고, 조건식이 참인 경우에만 반복 실행될 코드 블록이 실행됩니다. 조건식이 거짓이면 코드 블록은 실행되지 않고, 반복문이 종료됩니다.

continuebreak는 반복문 제어 구문으로 다음과 같이 사용됩니다:

  • continue: continue 문은 현재 반복을 중지하고 다음 반복을 시작합니다. 반복문의 나머지 부분을 건너뛰고 다음 반복으로 이동합니다.
  • break: break 문은 반복문에서 즉시 탈출하고 반복을 종료합니다. 이후의 반복은 실행되지 않습니다.

아래는 while 문과 continue, break의 예제입니다:

var i = 0;

while (i < 5) {
    i++; // i를 증가시킴

    if (i === 3) {
        continue; // i가 3일 때 다음 반복으로 넘어감
    }

    console.log(i);

    if (i === 4) {
        break; // i가 4일 때 반복문을 탈출
    }
}

2. do while문

do {
    /* 반복 실행될 코드 */
} while (/* 조건식 */);

do...while 문은 코드 블록을 최소한 한 번 실행한 다음, 조건식을 평가합니다. 조건식이 참(true)인 경우에는 코드 블록을 다시 실행하고, 조건식이 거짓(false)인 경우에 반복문을 종료합니다.

do...while 문을 사용하면 최소한 한 번의 실행을 보장하고, 그 이후에 조건에 따라 추가적인 실행을 결정할 수 있습니다. 이는 특정 작업을 최소 한 번 실행하고 사용자 입력을 확인하는 경우 등에 유용합니다.

아래는 do...while 문의 예제입니다:

var i = 0;

do {
    i++; // i를 증가시킴
    console.log(i);
} while (i < 5);

3. for문

while 문으로 0부터 4까지 더하기:

var sum = 0;
var i = 0; // 초기 설정 코드

while (i < 5 /* 조건식 */) {
    sum = sum + i;
    i++; // 업데이트 코드
}

for 문으로 0부터 4까지 더하기:

var sum = 0;

for (var i = 0; i < 5; i++) {
    sum = sum + i;
}

4. for in문

for 문을 사용한 객체 속성 출력:

var obj = {
    name: "John",
    age: 30,
    city: "New York"
};

var property_list = Object.keys(obj);

for (var i = 0; i < property_list.length; i++) {
    var propertyName = property_list[i];
    console.log("\t", propertyName, ": ", obj[propertyName]);
}

for...in 문을 사용한 객체 속성 출력:

var obj = {
    name: "John",
    age: 30,
    city: "New York"
};

for (var propertyName in obj) {
    console.log("\t", propertyName, ": ", obj[propertyName]);
}

5. 변수의 scope

Function Scope (함수 범위):
변수가 함수 내에서 선언된 경우, 해당 변수는 그 함수 내에서만 유효합니다. 함수 외부에서는 접근할 수 없습니다. 예를 들어:

function exampleFunction() {
    var x = 10; // x는 exampleFunction() 함수 범위에서만 유효
    console.log(x);
}

console.log(x); // 에러: x는 함수 외부에서 접근할 수 없음

Nested Function (중첩 함수):
함수 내부에서 다른 함수를 정의하는 경우, 내부 함수는 외부 함수의 변수에 접근할 수 있습니다. 이러한 경우 내부 함수는 외부 함수의 범위를 포함하게 되며, 이를 클로저(Closure)라고 합니다. 예를 들어:

function outerFunction() {
    var x = 10; // outerFunction 범위의 변수 x

    function innerFunction() {
        console.log(x); // 내부 함수에서 outerFunction의 변수 x에 접근
    }

    innerFunction();
}

outerFunction(); // 내부 함수를 호출하여 outerFunction의 변수 x 출력

6. 변수의 shadowing

변수의 Shadowing은 함수 내에서 함수 외부에 이미 선언된 변수와 동일한 이름의 변수를 선언하면, 함수 내에서는 함수 내부에 선언된 변수가 우선 순위를 가지게 되는 현상을 말합니다. 이때 함수 외부에 있는 변수는 잠시 가려지는데, 이것을 "Shadowing" 또는 "변수의 가려짐"이라고 합니다.

var x = 10; // 전역 변수

function exampleFunction() {
    var x = 5; // 함수 내에서 같은 이름의 변수 x를 선언 (Shadowing)
    console.log(x); // 함수 내부 변수 x 출력
}

exampleFunction(); // 함수 호출

console.log(x); // 전역 변수 x 출력

7. method, this

메소드(Method): 메소드는 객체에 속한 함수를 의미합니다. 객체는 속성(프로퍼티)과 메소드로 구성됩니다. 객체의 속성은 데이터를 저장하고, 메소드는 특정 작업을 수행하는 함수입니다. 메소드는 객체에 속해 있으므로 해당 객체를 통해 호출됩니다.

var person = {
    firstName: "John",
    lastName: "Doe",
    greet: function() {
        console.log("Hello, " + this.firstName + " " + this.lastName);
    }
};

person.greet(); // "Hello, John Doe"를 출력

this 키워드: this는 현재 실행 중인 메소드가 속한 객체를 가리킵니다. this를 사용하여 객체 내의 다른 속성에 접근하거나 수정할 수 있습니다. this는 객체 내부에서 메소드를 호출할 때 매우 유용하게 사용됩니다.

this의 값은 호출하는 방법에 따라 달라질 수 있습니다. 예를 들어, 다른 함수 내에서 person.greet를 호출하면 this가 다른 객체나 undefined가 될 수 있습니다. 이러한 동작을 이해하고 올바르게 사용하기 위해서는 JavaScript의 실행 컨텍스트와 스코프 규칙을 이해하는 것이 중요합니다.

8. closure ( 클로저 )

클로저(Closure)는 JavaScript의 중요한 개념 중 하나로, 함수와 해당 함수가 선언된 환경(스코프)로 구성됩니다. 클로저는 함수가 선언될 때의 환경(변수, 스코프)가 함께 저장되어, 함수가 반환된 후에도 그 환경에 접근할 수 있게 만듭니다.

여기에서 예시로 든 makeCounterFunction 함수는 클로저를 생성하는 함수입니다. 이 함수는 초기값(initVal)을 받아들이고, Increase라는 내부 함수를 반환합니다. 이때 Increase 함수는 count 변수와 함께 클로저를 형성합니다.

function makeCounterFunction(initVal) {
    var count = initVal;
    function Increase() {
        count++;
        console.log(count);
    }
    return Increase;
}

var counter1 = makeCounterFunction(0);
var counter2 = makeCounterFunction(10);

counter1(); // 1
counter1(); // 2

counter2(); // 11
counter2(); // 12

위 예제에서 counter1counter2는 각각 서로 다른 클로저를 가지고 있습니다. counter1의 클로저는 count 변수를 0으로 초기화하고, counter2의 클로저는 count 변수를 10으로 초기화합니다. 따라서 각각의 클로저는 독립적인 상태를 유지하고 있으며, Increase 함수는 해당 클로저의 count 변수에 접근할 수 있습니다.

9. 평균 구하기

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

double solution(int arr[], size_t arr_len) {
    double sum = 0;
    
    for (size_t i = 0; i < arr_len; i++) {
        sum += arr[i];
    }
    
    double average = sum / arr_len;
    return average;
}

0개의 댓글