๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“• STUDY/Node.js

[Node.js๋กœ ์„œ๋ฒ„๋งŒ๋“ค๊ธฐ] 2. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•(๋ณ€์ˆ˜/ํ˜ธ์ด์ŠคํŒ…/ํด๋กœ์ €)

โœ… ๋ณ€์ˆ˜, ํ˜ธ์ด์ŠคํŒ…, ํด๋กœ์ €

1. ๋ณ€์ˆ˜

- ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์  ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ€์ˆ˜ ํƒ€์ž…์„ ๋ฏธ๋ฆฌ ์„ ์–ธํ•  ํ•„์š” ์—†์Œ

- ํƒ€์ž…์€ ํ”„๋กœ๊ทธ๋žจ์ด ์ฒ˜๋ฆฌ๋˜๋Š” ๊ณผ์ •์—์„œ ์ž๋™์œผ๋กœ ํŒŒ์•…ํ•จ ( typeof(๋ณ€์ˆ˜)๋ฅผ ํ†ตํ•ด ํ™•์ธ )

 

[ var vs let vs const ]

- var : ES6 ์ด์ „ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์‚ฌ์šฉ

(์ด์ œ๋Š” let, const ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•จ)

 

์ด์œ ๋Š”?
var์˜ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…๊ณผ function-level-scope๋กœ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ ๋•Œ๋ฌธ!


2. ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…

 

๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…(hoisting)์ด๋ž€?
๋ณ€์ˆ˜์˜ ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์ด๋ฃจ์–ด์ ธ ์•„์ง ๊ฐ’์ด ์—†์Œ์—๋„ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๋Š” ํ˜„์ƒ
(๋ณ€์ˆ˜ ์„ ์–ธ ์ด์ „์— ์ฐธ์กฐ ๊ฐ€๋Šฅ)

* Hoisting : ๋Œ์–ด์˜ฌ๋ฆฌ๋‹ค.

 

1) var์˜ ๊ฒฝ์šฐ

// sample 01
console.log(puppy);
var puppy = 'cute';
console.log(puppy);

// ์ถœ๋ ฅ๊ฒฐ๊ณผ
/*
undefined
cute
*/

โžก ์•„์ง puppy๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํ˜ธ์ถœํ–ˆ์Œ์—๋„,

     ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๊ณ  undefined๋ผ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ.

๐Ÿ’ฅ ์—ฌ๊ธฐ์„œ ์ฃผ์˜!
null vs undefined
1. null : ๋ณ€์ˆ˜์˜ ๊ฐ’์„ null๋กœ ์ง€์ •ํ•œ ๊ฒƒ!
โžก ์ฆ‰, ๋ณ€์ˆ˜๋Š” null ์ด๋ผ๋Š” ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ์Œ

2. undefined : ๋ณ€์ˆ˜๊ฐ€ ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ!
โžก ๋‚ด๊ฐ€ ์•„์ง ํ• ๋‹นํ•˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๊ฐ€ ์ œ ๋ง˜๋Œ€๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ

 

2) let, const์˜ ๊ฒฝ์šฐ (ES6 ์ดํ›„ var๋ณด๋‹ค ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅ)

// sample-02-1
let dog;
dog = 'happy';
console.log(dog);
let dog = 'happy'; // ์˜ค๋ฅ˜ ๋ฐœ์ƒ

// smaple 02-2
const puppy = 'cute';
const puppy = 'so cute'; // ์˜ค๋ฅ˜ ๋ฐœ์ƒ

 

โžก let ๊ณผ const ์ค‘๋ณต์„ ์–ธ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ, ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ… ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

(์ฆ‰, ๋‚ด๊ฐ€ ๊ฐ’์„ ์ค€ ๋ณ€์ˆ˜๋งŒ์ด ์ œ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฏ€๋กœ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ… ๋ฌธ์ œ๋กœ ์‹ค์ˆ˜ํ•  ์ผ์„ ๊ฐ์†Œ์‹œํ‚ด)


3. ์Šค์ฝ”ํ”„ (scope)

 

์Šค์ฝ”ํ”„๋ž€?

๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„

 

1) var์˜ ๊ฒฝ์šฐ

ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ (function-level-scope)

: ํ•จ์ˆ˜์˜ ๋ธ”๋ก ๋ฒ”์œ„ ๋‚ด์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์ธ์ • (ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋ชจ๋‘ ์ „์—ญ๋ณ€์ˆ˜)

// sample 03
var puppy = 'cute';
console.log(puppy);
{
    var puppy = 'so cute';
}
console.log(puppy);

// ์ถœ๋ ฅ๊ฒฐ๊ณผ
/*
cute
so cute
*/

 โžก var๋Š” function-level-scope๋ฅผ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์—, ์ „์—ญ๋ณ€์ˆ˜์— ์›ํ•˜์ง€ ์•Š๋Š” ๊ฐ’์„ ๋ฎ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ ์ด ์žˆ์Œ

 

2) let ๊ณผ const์˜ ๊ฒฝ์šฐ

๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ (block-level-scope)

: ๋ชจ๋“  ์ฝ”๋“œ ๋ธ”๋ก(ํ•จ์ˆ˜, if ๋ฌธ, for ๋ฌธ, while ๋ฌธ, try/catch ๋ฌธ ๋“ฑ) ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ๋งŒ ์œ ํšจํ•˜๋ฉฐ,

  ์ฝ”๋“œ ๋ธ”๋ก ์™ธ๋ถ€์—์„œ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. (์ฝ”๋“œ ๋ธ”๋ก ๋‚ด๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ง€์—ญ ๋ณ€์ˆ˜)

// sample04
let puppy = 'cute';
{
    let puppy = 'so cute';
}
console.log(puppy); // cute

โžก 1๋ฐ˜ ์ดํ˜„์ง„๊ณผ 3๋ฐ˜ ์ดํ˜„์ง„์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ธ ๊ฒƒ์ฒ˜๋Ÿผ,

      ๋‘ ๊ฐœ์˜ puppy๋Š” ์ด๋ฆ„๋งŒ ๊ฐ™์„ ๋ฟ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์ž„.


4. let vs const

// sample05-1
const puppy = 'cute';
puppy = 'so cute!!';
console.log(puppy);
// TypeError: Assignment to constant variable.

// sample 05-2
let dog;
console.log(dog); // undefined
dog = 'so lovely';
console.log(dog); // so lovely

- let์€ ๊ฐ’์„ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Œ
- const๋Š” ์žฌํ• ๋‹น ๋ถˆ๊ฐ€๋Šฅ (๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•จ)


5. ํด๋กœ์ €(closure)

ํด๋กœ์ €๋ž€?

๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

// sample 06
function outer(){
    var a = 'A';
    var b = 'B';
    function inner(){
        var a = 'AA';
        console.log(a); // AA
        console.log(b); // B
    }
    console.log(a); // A
    return inner;
}
var outerFunc = outer();
outerFunc();

// ์ถœ๋ ฅ๊ฒฐ๊ณผ
/*
A
AA
B
*/

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์Šค์ฝ”ํ”„๋Š” ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ์ƒ์„ฑ๋จ.

โžก inner() ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„๊ฐ€ outer()ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„๋ฅผ ์ฐธ์กฐํ•จ.

โžก outer()์˜ ์‹คํ–‰์ด ๋๋‚˜๊ณ  ์†Œ๋ฉธ๋œ ์ดํ›„์—๋„ inner()ํ•จ์ˆ˜๊ฐ€ outer()ํ•จ์ˆ˜์˜ ์Šค์ฝ”ํ”„์— ์ ‘๊ทผ ( = ํด๋กœ์ € )

 

์œ„ ์˜ˆ์ œ์˜ ๊ฒฝ์šฐ,

1) outer() ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ var a์ธ 'A'๋ฅผ ์ถœ๋ ฅ

2) var outerFunc์— inner()๋ฅผ ๋ฐ˜ํ™˜

3) outerFunc()๋ฅผ ์‹คํ–‰ํ•˜๋ฉด inner()๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Œ

โžก outerFunc()๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ inner()์˜ ์ง€์—ญ๋ณ€์ˆ˜ a์™€ outer()์˜ ์ง€์—ญ๋ณ€์ˆ˜ b๊ฐ€ ์ถœ๋ ฅ๋˜์–ด 'AA', 'B'๊ฐ€ ์ถœ๋ ฅ๋จ.


๐Ÿ’ก ์ •๋ฆฌ ๐Ÿ’ก

๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ์ œ๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์ธํ•ด ๋ฐœ์ƒ


์ „์—ญ ๋ณ€์ˆ˜๋Š” ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ด ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ,
์Šค์ฝ”ํ”„๊ฐ€ ๋„“์–ด์„œ ์‚ฌ์šฉ์ฒ˜๋ฅผ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋ฉฐ,
๋น„์ˆœ์ˆ˜ ํ•จ์ˆ˜์— ์˜ํ•ด ์˜๋„์น˜ ์•Š๊ฒŒ ๋ณ€๊ฒฝ๋  ์ˆ˜๋„ ์žˆ์–ด ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ด.

๋”ฐ๋ผ์„œ ๋ณ€์ˆ˜์˜ ์Šค์ฝ”ํ”„๋Š” ์ข์„์ˆ˜๋ก ์ข‹๊ธฐ ๋•Œ๋ฌธ์—
ES6๋Š” var์˜ ๋‹จ์  ๋ณด์™„์„ ์œ„ํ•ด let๊ณผ const ํ‚ค์›Œ๋“œ๋ฅผ ๋„์ž…ํ•จ.