๐ JavaScript
๐ const
์ var
์ ์ฐจ์ด์ ์?โ
var
์ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๊ฐ ์๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ ์ญ์์ ์ฐธ์กฐํ ์ ์๊ณ , let
์ด๋ const
๋ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ง์ญ ๋ณ์๋ก ์ฝ๋ ๋ธ๋ก๋ด์ ์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
var
์ ๋ณ์ ์ ์ธ ์ ์ ์ฐธ์กฐํด๋ ์๋ฌ๊ฐ ๋์ง ์๊ณ undefined
๋ฅผ ๋ฐํํ์ง๋ง, let
์ ๋ณ์ ์ ์ธ๋ฌธ์ ์ ํด๋น ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ฉด Reference Error๋ฅผ ๋ฐํํฉ๋๋ค.
์ด๋ฌํ ์ด์ ๋ฅผ ์คํ ์ปจํ
์คํธ ๊ด์ ์์ ๋ณด์๋ฉด var
์ ๋ณ์ ์ ์ธ๊ณผ ์ด๊ธฐํ๊ณผ์ ์ด ๋์์ ์ผ์ด๋๊ฒ ๋๋๋ฐ, ์ค์ฝํ์ ๋ณ์๋ฅผ ๋ฑ๋กํ๊ณ ๋ณ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฑ๋กํ ๊ณต๊ฐ์ ํ๋ณดํ ํ undefined
์ด๊ธฐํ ๊ณผ์ ์ ๊ฑฐ์ณค๊ธฐ ๋๋ฌธ์ ์ ์ธ ์ด์ ์ ์ฐธ์กฐํด๋ undefined
๋ฅผ ๋ฐํํ ์ ์๋ ๊ฒ์
๋๋ค. let
์ ๋ณ์ ์ ์ธ๊ณผ ์ด๊ธฐํ ๊ณผ์ ์ด ๋ฐ๋ก ์ด๋ฃจ์ด์ง๋๋ฐ, ์ด์ ์ ๋ณ์๋ฅผ ์ฐธ์กฐํ๊ฒ ๋๋ฉด ์ค์ฝํ์ ๋ณ์๋ฅผ ๋ฑ๋กํ์ง๋ง ๋ณ์๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋นํ ๊ณต๊ฐ์ ํ๋ณดํ์ง ๋ชปํ๊ณ ๋ณ์ ์ ์ธ๋ฌธ์ ๋ง๋ ๊ทธ ์์ ์ ์ด๊ธฐํ ๊ณผ์ ์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ด์ ์ ์ฐธ์กฐํ๋ฉด ์ฐธ์กฐ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ ์ด๊ฒ์ ์ค์ฝํ์ ์์๋ถํฐ ๋ณ์ ์ ์ธ๋ฌธ์ ๊น์ง์ ๊ณต๊ฐ์ TDZ(์ผ์์ ์ฌ๊ฐ์ง๋)๋ผ๊ณ ํฉ๋๋ค.
let
๊ณผ var
์ ์ฌํ ๋น์ด ๊ฐ๋ฅํ์ง๋ง const
๋ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ const
๋ ๋ณ์๋ฅผ ์ ์ธ๊ณผ ๋์์ ํ ๋น์ ํด์ผ ํฉ๋๋ค.
๐ ํธ์ด์คํ ์ด๋โ
ํธ์ด์คํ
์ด๋ ๊ฐ๋
์์ฒด๋ ์ฝ๋ ํด์์ ์ข ๋ ์์ํ๊ฒ ํ๊ธฐ ์ํด ๋์ด์ฌ๋ฆฐ๋ค๋ผ๊ณ ํด์ํ๊ณ ์์ต๋๋ค.
๋ณ์๊ฐ ์ ์ธ๊ณผ ๊ฐ ํ ๋น์ด ๊ฐ์ด ์ด๋ฃจ์ด์ง ๋ฌธ์ฅ์ ์ ์ธ๋ถ๋ง ํธ์ด์คํ
๋๊ณ , ํ ๋น๋ฌธ์ ๊ทธ์๋ฆฌ์ ๊ทธ๋๋ก ์ ์งํ๊ณ ์๊ฒ๋ฉ๋๋ค. ์ด๋ ํจ์์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์์ ์ฐจ์ด์ ์ด ์๋๋ฐ ํจ์ ์ ์ธ๋ฌธ์ ํจ์์์ฒด ํต์ฒด๋ก ๋์ด์ฌ๋ฆฌ๊ฒ๋๊ณ , ํจ์ ํํ์์ ์์ด๊ธฐ ๋๋ฌธ์ ์ ์ธ๋ถ๋ง ํธ์ด์คํ
๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ES6์ ๋์
๋ let
, const
๋ฅผ ํฌํจํ์ฌ ๋ชจ๋ ์ ์ธ์ ํธ์ด์คํ
ํฉ๋๋ค.
// ํจ์ ์์ฒด๋ฅผ ํธ์ด์คํ
function test1() {
console.log('ํจ์ ์ ์ธ๋ฌธ');
}
// ์ ์ธ๋ถ๋ง ํธ์ด์คํ
// var test2 = undefined;
var test2 = function() {
console.log('ํจ์ ํํ์');
}
๐ ์คํ ์ปจํ ์คํธโ
์คํ ์ปจํ
์คํธ๋ ์คํํ ์ฝ๋์ ๋ํ ํ๊ฒฝ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด๋ก ์ ์ญ ๊ณต๊ฐ์์ ์๋์ผ๋ก ์์ฑ๋๋ ์ ์ญ ์ปจํ
์คํธ์ ํจ์ ์คํ์ ์ํ ์ปจํ
์คํธ๋ฑ์ด ์์ต๋๋ค.
์คํ ์ปจํ
์คํธ ๊ฐ์ฒด๋ ํ์ฑํ ๋ ์์ ์ VariableEnvironment
, LexicalEnvironment
, thisBinding
์ธ๊ฐ์ง ์ ๋ณด๋ฅผ ์์งํฉ๋๋ค. ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋ ๋ VariableEnvironment
, LexicalEnvironment
๋ ๋์ผํ ๋ด์ฉ์ผ๋ก ๊ตฌ์ฑ๋์ง๋ง, VariableEnvironment
๋ ์ด๊ธฐ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
VariableEnvironment
์ LexicalEnvironment
๋ ๋งค๊ฐ๋ณ์๋ช
, ๋ณ์์ ์๋ณ์, ํจ์์ ํจ์๋ช
๋ฑ์ ์ ๋ณด๋ฅผ ์์งํ๋ environmentRecord
์ ๋ฐ๋ก ์ง์ ์ปจํ
์คํธ์ LexicalEnvironment
์ ๋ณด๋ฅผ ์ฐธ์กฐํ๋ outerEnvironmentReference
๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค.
outerEnvironmentReference
๋ ํด๋น ํจ์๊ฐ ์ ์ธ๋ ์์น์ LexicalEnvironment
๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ๋ง์ฝ ์ฝ๋์ ๋ณ์์ ๋ํด ์ ๊ทผํ๊ธฐ ์ํด์ LexicalEnvironment
๋ฅผ ์ฐธ์กฐํ๋๋ฐ ๋ง์ฝ LexicalEnvironment
์ ํด๋น ๋ณ์์ ๋ํ ์ ๋ณด๊ฐ ์กด์ฌํ ๊ฒฝ์ฐ๋ LexicalEnvironment
์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ๊ณ , ๋ง์ฝ ์์ ๊ฒฝ์ฐ์๋ outerEnvironmentReference
์ ๋ด๊ธด ๋ฐ๋ก ์ง์ ์ปจํ
์คํธ์ LexicalEnvironment
๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค. ์ด๋ ์ ์ญ ์ปจํ
์คํธ์ LexicalEnvironment
๊น์ง๋ ๋ณ์์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ๊ฒฌํ์ง ๋ชปํ๋ฉด undefined
๋ฅผ ๋ฐํํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ๊ณผ์ ์ ์ค์ฝํ์ฒด์ธ์ด๋ผ๊ณ ํ๋ฉฐ, ์ด๋ฌํ ๊ตฌ์กฐ์ ์ธ ํน์ฑ ๋๋ถ์ ์ฌ๋ฌ ์ค์ฝํ์์ ๋์ผํ ์๋ณ์๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ๋จผ์ ๋ฐ๊ฒฌ๋ ์๋ณ์์๊ฒ๋ง ์ ๊ทผํ ์ ์๊ฒ ๋๋ ๊ฒ ์ ๋๋ค.
thisBinding
์ this
๋ก ์ง์ ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๋๋ฐ, ๋ง์ฝ this
๊ฐ ์ง์ ๋์ง ์์์ ๋๋ this
๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋๊ณ , ๊ทธ ์ธ์๋ ํจ์์ ํธ์ถ๋ฐฉ๋ฒ์ ๋ฐ๋ผ this
์ ์ ์ฅ๋๋ ๋์์ด ๋ฌ๋ผ์ง๋๋ค.
์ฐธ๊ณ : https://saseungmin.github.io/summary_of_technical_books/docs/javascript/core-javascript/chapter-2
๐ thisโ
this
๋ ์คํ ์ปจํ
์คํธ๊ฐ ์์ฑ๋ ๋ ํจ๊ป ๊ฒฐ์ ๋ฉ๋๋ค. ์คํ ์ปจํ
์คํธ๋ ํจ์๊ฐ ํธ์ถ๋ ๋ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ this
์ ์์ฑ๋ ํจ์๋ฅผ ํธ์ถํ ๋ ๊ฒฐ์ ๋๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ this
๋ ์ํฉ์ ๋ฐ๋ผ์ ๋ฌ๋ผ์ง๋๋ค. ์ผ๋จ, ์ ์ญ ๊ณต๊ฐ์์์ this
๋ ๋ธ๋ผ์ฐ์ ์์๋ window
, node.js์์๋ global
์ ์ฐธ์กฐํฉ๋๋ค.
ํจ์๊ฐ ๋ฉ์๋๋ก์จ ํธ์ถ๋๋ ๊ฒฝ์ฐ ๋ฉ์๋๋ฅผ ํธ์ถ์ํจ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋๋ฐ, ๋ฉ์๋ ๋ช ์ ๋ฐ๋ก ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
var obj = {
methodA: function() { console.log(this); },
inner: {
methodB: function() { console.log(this); },
},
};
obj.methodA(); // { methodA: f, inner: {...} } ( === obj)
obj.inner.methodB(); // { methodB: f } ( === obj.inner)
์ด๋ค ํจ์๊ฐ ํจ์๋ก์จ ํธ์ถ๋๋ ๊ฒฝ์ฐ๋ this
๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ด๋ ๋ฉ์๋ ๋ด๋ถํจ์์์๋ this
๋ ์ ์ญ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ด ๋ฉ์๋ ๋ด๋ถ์์ ํจ์๋ฅผ ์ ์ญ ๊ฐ์ฒด๋ฅผ ๋ณด์ง ์๊ฒ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฉ์๋ ๋ด๋ถ์์ self
์ ๊ฐ์ ๋ณ์๋ฅผ ์ฌ์ฉํด ํจ์ ์์ ์ค์ฝํ์ this
๋ฅผ self
๋ก ํ ๋น ํ ๋ค ํ์ฉํ ์๋ ์๊ณ , this
๋ฅผ ๋ฐ์ธ๋ฉํ์ง ์๋ ํ์ดํํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์๊ณ , ๋ช
์์ ์ผ๋ก this
๋ฅผ ๋ฐ์ธ๋ฉ์์ผ์ฃผ๋ call
apply
bind
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์์ต๋๋ค.
์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์์ this
๋ ์ฝ๋ฐฑ ํจ์์ ์ ์ด๊ถ์ ๋๊ฒจ๋ฐ์ ํจ์๊ฐ ์ ์ํ๋ฐ์ ๋ฐ๋ฅด๋ฉฐ, ๋ง์ฝ ์ ์๋์ง ์์ ๊ฒฝ์ฐ์๋ this
๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
์์ฑ์์์์ this
๋ ์์ฑํ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค.
๋ํ, ๋ช
์์ ์ผ๋ก this
๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋๋ฐ apply
์ call
์ ๋์ ๊ธฐ๋ฅ์ ์ผ๋ก๋ ์ฐจ์ด๋ ์์ง๋ง, apply
๋ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ๋ฐ๋ ๋ฐ๋ฉด, call
์ ์ธ์ ๋ชฉ๋ก์ ์์๋๋ก ๋ฐ์ต๋๋ค.
ES5์ ๋์จ bind
๋ call
๊ณผ ์ ์ฌํ์ง๋ง, ์ฐจ์ด์ ์ call
์ ํจ์๋ฅผ ํธ์ถํ์ง๋ง, bind
๋ ํธ์ถ์ ํ์ง ์๊ณ ํจ์๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฌํ bind
์ ๊ธฐ๋ฅ ๋๋ถ์ this
๋ฅผ ๋ฏธ๋ฆฌ ์ ์ฉํ๋ ๊ฒ๊ณผ ๋ถ๋ถํจ์์ ์ฉํ๋ ๋๊ฐ์ง ๋ชฉ์ ์ ์ง๋๋๋ค. ๊ทธ๋ฆฌ๊ณ bind
๋ฅผ ์ฌ์ฉํด ์ ๋ก ๋ง๋ ํจ์๋ name
ํ๋กํผํฐ์ bound
๋ผ๋ bind
์ ์๋ํ ์ ๋์ด๊ฐ ๋ถ๊ธฐ ๋๋ฌธ์, call
์ด๋ apply
๋ณด๋ค ์ฝ๋๋ฅผ ์ถ์ ํ๋๋ฐ ๋ ์์ํฉ๋๋ค.
์ฐธ๊ณ : https://saseungmin.github.io/summary_of_technical_books/docs/javascript/core-javascript/chapter-3
๐ ํด๋ก์ โ
function outer() {
var k = 1;
function inner() {
console.log(k);
}
return inner;
}
var func = outer();
func(); // 1;
ํด๋ก์ ๋ ์ด๋ค ํจ์ A์ ๋ณ์ k๊ฐ ์กด์ฌํ ๋ k๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถ ํจ์ B๊ฐ ์ธ๋ถ๋ก ์ ๋ฌ๋ ๊ฒฝ์ฐ A์ ์คํ ์ปจํ ์คํธ๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ์ธ๋ถ ํจ์ A์ ๋ณ์ k๊ฐ ์ฌ๋ผ์ง์ง ์๋ ํ์์ด๋ผ๊ณ ํฉ๋๋ค.
inner
ํจ์์์ outer
์ ๋ณ์ k
์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์คํ ์ปจํ
์คํธ ๊ด์ ์ ์ ์ค๋ช
ํ๋ฉด inner
ํจ์๋ด์์ ์ฐธ์กฐํ๊ณ ์๋ k
์๋ณ์๋ฅผ inner
์ LexicalEnvironment
๋ฅผ ์ฐธ์กฐํด์ k
์ ์ ๋ณด๊ฐ ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ์ง๋ง, ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ง์ ์ปจํ
์คํธ์ LexicalEnvironment
์ ๋ณด๋ฅผ ์ฐธ๊ณ ํ๊ณ ์๋ inner
์ outerEnvironmentReference
์์ ๋ณ์ k
์ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์๊ธฐ ๋๋ฌธ์ ์์ ์ค์ฝํ์ k
์ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์๋ ๊ฒ์
๋๋ค.
outer
๊ฐ ํธ์ถ๋๊ณ outer
ํจ์์ ์คํ์ปจํ
์คํธ๊ฐ ์ข
๋ฃ๋๋ฉด LexicalEnvironment
์ ์๋ k
๋ฅผ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ง์ฐ๊ฒ ๋ฉ๋๋ค. ํ์ง๋ง, ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ด๋ค ๊ฐ์ ์ฐธ์กฐํ๋ ๋ณ์๊ฐ ํ๋๋ผ๋ ์กด์ฌํ๋ค๋ฉด ๊ทธ ๊ฐ์ ๊ฐ๋น์ง์ปฌ๋ ํฐ์ ์์ง๋์์์ ์ ์ธ๋๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ outer
๊ฐ ํธ์ถ๋ ํ inner
๋ฅผ ๋ฐํํ๊ณ ๋ด๋ถํจ์์ธ inner
๋ฅผ ์ธ์ ๋ ์ง ํธ์ถํ ๊ฐ๋ฅ์ฑ์ด ์ด๋ ค์๊ธฐ ๋๋ฌธ์ ์ฆ, ๋ณ์ k
์ ์ธ์ ๋ ์ง ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์์ง๋์์์ ์ ์ธ๋๊ฒ ๋ฉ๋๋ค.
๊ทธ๋์ ํด๋ก์ ๋ฅผ ํ์ฉํ์ฌ ์ปค๋ง์ด๋ผ๋ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์๋๋ฐ ์ปค๋ง์ ๋ ์ด์์ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ํจ์๊ฐ ์ฌ๋ฌ ํจ์๋ก ๋ถ๋ฆฌ๋ ํจํด์ผ๋ก, ํ์ํ ๋ชจ๋ ๋งค๊ฐ ๋ณ์๊ฐ ํ ๋ฒ์ ํ๋์ฉ ๋์ ๋ฉ๋๋ค. ์ด ๊ธฐ๋ฒ์ ํจ์ํ ์คํ์ผ๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์ฝ๊ณ , ํฉ์ฑํ๊ธฐ ๋ ์ฌ์์ง ๊ฒฝ์ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ์ ๊ฐ ๋ณดํต ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์
const curry = (message) => (name) => `hi! ${name} ${message}`;
const greeting = curry('์๋
ํ์ธ์!');
greeting('harang'); // hi! harang ์๋
ํ์ธ์!
greeting('์น๋ฏผ'); // hi! ์น๋ฏผ ์๋
ํ์ธ์!
์ฐธ๊ณ : https://saseungmin.github.io/summary_of_technical_books/docs/javascript/core-javascript/chapter-5
๐ ์ค์ฝํโ
์ค์ฝํ๋ ์ด๋ค ๋์์ ๋ค๋ฅธ ๋์๊ณผ ๊ตฌ๋ถํ์ฌ ์๋ณํ ์ ์๋ ์ ์ผํ ์ด๋ฆ์ ์ฐพ์๋ด๊ธฐ ์ํ ๊ท์น์ ๋๋ค. ์ด ์๋ณ์๋ ์์ ์ด ์ด๋์ ์ ์ธ๋์ด์๋์ง์ ์ํด ์์ ์ ์ ํจํ ๋ฒ์๋ฅผ ์ฐพ์ต๋๋ค.
var x = 'global';
function foo () {
var x = 'function scope';
console.log(x);
}
foo(); // function scope
console.log(x); // global
์ ์์ฒ๋ผ ์ ์ญ์ ์ ์ธ๋ ๋ณ์ x
๋ ์ด๋์์๋ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ์ง๋ง, foo
ํจ์ ๋ด๋ถ์ ์๋ ๋ณ์ x
๋ foo
๋ด๋ถ์์๋ง ์ฐธ๊ณ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฌํ ๊ท์น์ ์ค์ฝํ๋ผ๊ณ ํฉ๋๋ค. ์ด์ฒ๋ผ ์ ์ญ ์ค์ฝํ์ ์ง์ญ ์ค์ฝํ๋ก ๊ตฌ๋ถ์ง์ต๋ ๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ์ค์ฝํ๋ ํจ์ ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ๋ฐ๋ฆ
๋๋ค. ์ฆ, ํจ์ ์ฝ๋ ๋ธ๋ก ๋ด๋ถ์์ ์ ์ธ๋ ๋ณ์๋ ํจ์ ๋ด๋ถ์์๋ง ์ฐธ์กฐ๊ฐ๋ฅํ๊ณ , ํจ์์ธ๋ถ์์๋ ์ฐธ์กฐ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒ์ ๋งํฉ๋๋ค. ํ์ง๋ง, let
ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ ์์ปฌ ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด๋๋ฐ ๋ ์์ปฌ ์ค์ฝํ๋ ํจ์๊ฐ ์คํ๋ ๋น์์ ์ค์ฝํ๊ฐ ๊ฒฐ์ ๋๋ ๊ฒ์ด ์๋, ํจ์๊ฐ ์ ์ธ๋ ์์น์ ๋ฐ๋ผ ์ค์ฝํ๊ฐ ๊ฒฐ์ ๋๋ ๊ฒ์ ๋งํฉ๋๋ค.
๐ IIFE (Immediately-Invoked Function Expression, ์ฆ์ ์คํ ํจ์)โ
์ฆ์ ์คํ ํจ์๋ ๋ง ๊ทธ๋๋ก ํจ์๋ฅผ ์ ์ํ์๋ง์ ์คํํ๋ ๊ฒ์ ์ฆ์ ์คํ ํจ์๋ผ๊ณ ํฉ๋๋ค.
์ฆ์ ์คํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ๋ณดํต ์ ์ญ ์ค์ฝํ๋ฅผ ์ค์ผ์ํค์ง ์๊ธฐ ์ํด ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋์ ์ฆ์ ์คํ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํด๋ก์ ๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ ์ง์ญ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ private ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ณ์ ์ฌ์ฉ ์ถฉ๋์ ๋ง์ ์๋ ์์ต๋๋ค.
๐ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง, ์บก์ฒ๋ง, ์์โ
์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด๋ ํ ์ ์๋ฆฌ๋จผํธ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ๊ทธ ์๋ฆฌ๋จผํธ๋ก๋ถํฐ ์์ํด์ ์์ ์์๊น์ง ์ด๋ฒคํธ๊ฐ ์ ๋ฌ๋๋ ๋ฐฉ์์
๋๋ค. ๊ธฐ๋ณธ์ ์ธ ๋์๋ฐฉ์์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์
๋๋ค.
์ด๋ฒคํธ ์บก์ฒ๋ง์ผ๋ก ๋ณ๊ฒฝํ๋ ค๋ฉด addEventListener
์ ๋ง์ง๋ง ์ธ์๋ก capture true
๋ฅผ ์ฃผ๋ฉด๋ฉ๋๋ค. ์ด๋ ์ด๋ ๊ฒ ์ค์ ํ ๋ค ํด๋น ์๋ฆฌ๋จผํธ๋ฅผ ํด๋ฆญํ๋ฉด ์ ์ฉ๋ ์๋ฆฌ๋จผํธ๋ถํฐ ์ด๋ฒคํธ๊ฐ ์บก์ฒ๋ง์ผ๋ก ๋ฐ์ํ๊ณ ๋ค์ ์ด๋ฒคํธ ๋ฒ๋ธ๋ง ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
์ด๋ฒคํธ ์์(event delegation)์ ๋์ผํ ๋๋ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์ฌ๋ฌ ์์๋ฅผ ๋ค๋ค์ผํ ๋ ์ฌ์ฉ๋๋๋ฐ, ์ด๋ฒคํธ ์์์ ์ฌ์ฉํ๋ฉด ๊ฐ์๋ง๋ค ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ์ง ์์๋๋๊ณ , ์์ ์๋ฆฌ๋จผํธ์ ๋จ ํ๋์ ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ๋ฉด ์ฌ๋ฌ ์๋ฆฌ๋จผํธ๋ฅผ ๋ค๋ฃฐ ์ ์๊ฒ ๋ฉ๋๋ค. ์ด๋ ๋ฏ ์ด๋ฒคํธ ์์์ ์ฅ์ ์ ์์ฑํด์ผํ ์ฝ๋์ ์๊ฐ ์ค์ด๋ค๊ณ ๊ทธ๋งํผ ๋ฉ๋ชจ๋ฆฌ๋ ์ ์ฝํ ์ ์์ต๋๋ค. ๋จ์ ์ผ๋ก๋ ์ด๋ฒคํธ ์์์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ด๋ฒคํธ๊ฐ ๋ฐ๋์ ๋ฒ๋ธ๋ง ๋์ผํฉ๋๋ค.
๐ ์ฝ ์คํ๊ณผ ํโ
์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ๋ ์์ ํ์
์ด๋ ์ฐธ์กฐ ํ์
์ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ก ์ฝ ์คํ๊ณผ ํ์ ์ฌ์ฉํฉ๋๋ค.
์ฝ ์คํ์ ์์ ํ์
๊ฐ๊ณผ ํจ์๊ฐ ์คํ๋ ๋์ ์คํ ์ปจํ
์คํธ๋ฅผ ์ ์ฅํฉ๋๋ค. ํ์ ๊ฐ์ฒด, ๋ฐฐ์ด, ํจ์๋ฑ ๋์ ์ผ๋ก ๋ณํํ๋ ์ฐธ์กฐ ํ์
์ ์ ์ฅํฉ๋๋ค.
๐ ํ๋กํ ํ์ โ
์ด๋ค ์์ฑ์ ํจ์๋ฅผ new
์ฐ์ฐ์์ ํจ๊ป ํธ์ถํ๋ฉด Constructor
์ ์ ์๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ฒ ๋๊ณ , ์ด ์ธ์คํด์ค์๋ __proto__
๋ผ๋ constructor
์ prototype
ํ๋กํผํฐ๋ฅผ ์ฐธ์กฐํ๋ ํ๋กํผํฐ๊ฐ ์๋์ผ๋ก ๋ถ์ฌ๊ฐ ๋ฉ๋๋ค.
__proto__
์ ์๋ต์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค๋ constructor
์ prototype
์ ์์ ์ ๋ฉ์๋์ธ๊ฒ์ฒ๋ผ ํธ์ถํ ์ ์์ต๋๋ค.
__proto__
๋ฐฉํฅ์ผ๋ก ๊ณ์ ๋์๊ฐ๋ค๋ณด๋ฉด ์ต์ข
์ ์ผ๋ก Object.prototype
์ ๋๋ฌํ๊ฒ๋๋๋ฐ, ์ด๋ฌํ __proto__
์์ ๋ค์ __proto__
๋ฅผ ์ฐพ์๊ฐ๋ ๋ฐฉ์์ ํ๋กํ ํ์
์ฒด์ธ๋์ด๋ผ๊ณ ํฉ๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ์ ์ธ ์๋ฆฌ ๋๋ฌธ์ ์ ํฌ๋ ๊ฐ์์ ํ๋กํ ํ์
๋ฉ์๋๋ฅผ ์์ ์ ๋ฉ์๋์ธ๋ฅ ํธ์ถ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋์ ์ ๊ทผ ๋ฐฉ์์ ์์ ์ผ๋ก๋ถํฐ ๊ฐ์ฅ ๊ฐ๊น์ด ๋์์์๋ถํฐ ๋จผ ๋์์ผ๋ก ๋์๊ฐ๋ฉฐ, ์ํ๋ ๊ฐ์ ์ฐพ์ผ๋ฉด ์ค๋จํ๊ฒ ๋ฉ๋๋ค.
Object.prototype
์๋ ๋ชจ๋ ๋ฐ์ดํฐ ํ์
์ด ์ฌ์ฉํ ์ ์๋ hasOwnProperty
์ ๊ฐ์ ๋ฒ์ฉ์ ์ธ ๋ฉ์๋๋ค์ด ์กด์ฌํ๋ฉฐ, ๊ฐ์ฒด๋ง์ ์ํ ๋ฉ์๋๋ Object
์์ฑ์ ์์ ์คํํฑํ๊ฒ ๋ด๊ฒจ์์ต๋๋ค.
๐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์์ ์ฒ๋ฆฌ๋ฐฉ์โ
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ด๋ถ์ ์ผ๋ก stack, webapis, task queue, event loop๊ฐ ์กด์ฌํฉ๋๋ค. stack์ ์ค์ฝํ ๋จ์๋ก ์ํ๋๋ฉฐ, webapis๋ ๋น๋๊ธฐ์ ์ฒ๋ฆฌํ ์์
์ ์คํ์ผ๋ก ๋๊ฒจ๋ฐ์ ํ ํด๋น ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. task queue๋ webapis์์ ๋น๋๊ธฐ์ ์ฒ๋ฆฌ๊ฐ ๋๋ ์์
์ด task queue์ ์์ด๊ฒ ๋ฉ๋๋ค. event loop๋ stack์ ๋จ์ ํ ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ๋๊ธฐ์ค์ธ task queue๋ฅผ stack์ผ๋ก ์ฌ๋ฆฌ๋ ์ญํ ์ ํฉ๋๋ค.
๊ทธ๋์ ๋น๋๊ธฐ์ ์ธ ์์
์ stack์์ ์ฝ๋๊ฐ ์คํ๋๊ณ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ฝ๋๋ค์ด ์กด์ฌํ๋ค๋ฉด, webapis๋ก ์ฎ๊ฒจ์ ์ฌ๊ธฐ์ ์ฒ๋ฆฌ๋ฅผ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฒ๋ฆฌ๊ฐ ๋๋๋ฉด task queue๋ก ์ด๋ํ์ฌ ๋๊ธฐํ๊ฒ ๋๊ณ , event loop๋ stack์ ๋น์์ ธ์๋ ๊ฒ์ ํ์ธ ํ ๋ค ๋น์์ ธ์์ผ๋ฉด task queue์ ์๋ ์์
์ stack์ผ๋ก ์ฌ๋ฆฐ๋ค ํด๋น ์ฝ๋๋ฅผ ์คํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
๐ JavaScript์ ๊ด๋ จํ์ฌ same-origin ์ ์ฑ ์ ์ค๋ช ํ์ธ์.โ
same-origin ์ ์ฑ ์ JavaScript ๋๋ฉ์ธ ๊ฒฝ๊ณ๋ฅผ ๋์ด์ ์์ฒญํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. origin์ URI ์ฒด๊ณ, ํธ์คํธ์ด๋ฆ, ํฌํธ๋ฒํธ์ ์กฐํฉ์ผ๋ก ์ ์๋ฉ๋๋ค. ์ด ์ ์ฑ ์ ํ ํ์ด์ง์ ์ ์์ ์ธ ์คํฌ๋ฆฝํธ๊ฐ ํด๋น ํ์ด์ง์ DOM์ ํตํด ๋ค๋ฅธ ์น ํ์ด์ง์ ์ค์ํ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค.
๐ "use strict";
์ด ๋ฌด์์ธ๊ฐ์? ์ฌ์ฉ์ ์ฅ๋จ์ ์ด ๋ฌด์์ธ๊ฐ์?โ
Strict ๋ชจ๋๋ JavaScript ๋ค์ํ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ ํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฅ์ ์ผ๋ก๋ ์ค์๋ก ์ ์ญ๋ณ์๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๊ณ , ์๋ฌต์ ์ผ๋ก ์คํจํ ์์ธ๋ฅผ throwํ์ง ๋ชปํ๋ ํ ๋น์ ๋ง๋ญ๋๋ค. ๊ทธ๋ฆฌ๊ณ this
๋ ์ ์ญ ์ปจํ
์คํธ์์ undefined
์ด๊ณ ํจ์์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ๊ณ ์ ํด์ผํฉ๋๋ค.
๋จ์ ์ผ๋ก๋ ์ผ๋ถ ๊ฐ๋ฐ์๋ ์ต์ํ์ง ์์ ๊ธฐ๋ฅ์ด ๋ง๊ณ , function.caller
์ function.arguments
์ ๋ ์ด์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก ๋ค๋ฅธ ์๊ฒฉํ ๋ชจ๋๋ก ์์ฑ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ณํฉํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๐ ๋๊ธฐ, ๋น๋๊ธฐ ํจ์์ ์ฐจ์ด์ ์ ์ค๋ช ํ์ธ์.โ
๋๊ธฐ ํจ์๋ ๋ธ๋กํน์ธ ๋ฐ๋ฉด, ๋น๋๊ธฐ ํจ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋๊ธฐ ํจ์์์ ๋ค์ ๋ช ๋ น๋ฌธ์ด ์คํ๋๊ธฐ ์ ์ ์ ๋ช ๋ น๋ฌธ์ด ์๋ฃ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ์๋ ํ๋ก๊ทธ๋จ์ ๋ช ๋ น๋ฌธ์ ์์๋๋ก ์ ํํ๊ฒ ํ๊ฐํ๊ณ ๋ช ๋ น๋ฌธ ์ค ํ๋๊ฐ ๋งค์ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ฉด ํ๋ก๊ทธ๋จ ์คํ์ด ์ผ์์ค์ง๋ฉ๋๋ค.
๋น๋๊ธฐ ํจ์๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด์ ์ฝ๋ฐฑ์ ๋ฐ๊ณ , ๋น๋๊ธฐ ํจ์๊ฐ ํธ์ถ๋ ํ ์ฆ์ ๋ค์ ์ค ์คํ์ด ๊ณ์๋ฉ๋๋ค. ์ฝ๋ฐฑ์ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋๊ณ ํธ์ถ ์คํ์ด ๋น์ด ์์ ๋๋ง ํธ์ถ๋ฉ๋๋ค. ๋ณดํต ์น ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฟผ๋ฆฌํ๋ ๋ฑ์ ๋ฌด๊ฑฐ์ด ์์ ์ ๋น๋๊ธฐ์์ผ๋ก ์ํํ์ฌ, ๋ฉ์ธ ์ค๋ ๋๊ฐ ๊ธด ์์ ์ ์๋ฃํ ๋๊น์ง ๋ธ๋กํนํ์ง ์๊ณ ๋ค๋ฅธ ์์ ์ ๊ณ์ํ ์ ์์ต๋๋ค.
๐ ๊ณ ์ฐจ ํจ์(higher-order function)์ ์ ์๋ ๋ฌด์์ธ๊ฐ์?โ
๊ณ ์ฐจ ํจ์๋ ๋ค๋ฅธ ํจ์๋ฅผ ๋งค๊ฐ ๋ณ์๋ก ์ฌ์ฉํ์ฌ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋, ๊ฒฐ๊ณผ๋ก ํจ์๋ฅผ ๋ฐํํ๋ ํจ์์
๋๋ค. ๊ณ ์ฐจ ํจ์๋ ๋ฐ๋ณต์ ์ผ๋ก ์ํ๋๋ ์ด๋ค ์ฐ์ฐ์ ์ถ์ํํ๊ธฐ ์ํ ๊ฒ์
๋๋ค. ์์๋ก๋ ๋ฐฐ์ด ๋ฉ์๋์ธ map
, reduce
, filter
๊ฐ ์๋๋ฐ ์ด๋ค์ ๊ณ ์ฐจํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๊ฐ ํญ๋ชฉ์ ๋ณํํ๊ณ , ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ก์ด ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค.
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐโ
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ์ค๋ ๋์ ๋๋ค. ๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋๋ก ํ ๋ฒ์ ํ๋์ ์ฝ๋๋ง ์คํ์ํฌ ์ ์์ต๋๋ค. ํ์ง๋ง ์ฐ๋ฆฌ๋ ๋ธ๋ผ์ฐ์ ์ ์ด๋ฒคํธ ๋ฃจํ ๋๋ถ์ ๋ฉํฐ ์ค๋ ๋๋ก ๋์ํ์ฌ ๋น๋๊ธฐ ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ ์คํ ํ ํจ์๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ๋ก ์ฝ ์คํ๊ณผ ํ(Queue)์ ํจ์๋ฅผ ๊ณ์ ํ์ธํฉ๋๋ค. ๋ง์ฝ ์ฝ ์คํ์ด ๋น์ด ์๊ณ ํ์ ๋๊ธฐ ์ค์ธ ํจ์๊ฐ ์๋ค๋ฉด, ์์ฐจ์ ์ผ๋ก ํ์ ๋๊ธฐ์ค์ธ ํจ์๋ฅผ ์ฝ ์คํ์ผ๋ก ์ด๋์ํต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋ฐ๋ณต๋๋ ๋งค ์ํ(Iteration)์ tick์ด๋ผ ๋ถ๋ฆ ๋๋ค.
์ด๋ ์ฝ ์คํ์์ ๋ฐ๋ก ํ๋ก ๋์ด๊ฐ๋๊ฒ ์๋๋ผ ์ค๊ฐ์ Web APIs๋ฅผ ํ ๋ฒ ๊ฑฐ์ณ ํ๋ก ๋์ด๊ฐ๋๋ค. ์ด๋ ์ด๋ค ํจ์๋ ์ด๋ฒคํธ๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์, ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ง์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์๋๋ผ ๋ธ๋ผ์ฐ์ ์ ์์์ ํฉ๋๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ๋์์ ์ฌ๋ฌ ์์
์ ์ํํ ์ ์๋ค๋ ํฐ ์ฅ์ ์ด ์์ง๋ง, ๋น๋๊ธฐ ํจ์๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ด๋ค ์ฝ๋๊ฐ ๋จผ์ ์คํ๋๋์ง ์ ์ ์๊ณ ๊ฐ๋
์ฑ์ด ๋๋น ์ง๋๋ค. ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ๋ฒ์ด ์๊ฒผ๊ณ ํฌ๊ฒ ์ฝ๋ฐฑ(Callback) ํจ์, Promise
, async/await
๋ฅผ ์ฌ์ฉํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
async/await
๋ Promise
๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ฉฐ, then/catch/finally์
๊ฐ์ ํ์ ์ฒ๋ฆฌ ๋ฉ์๋ ์์ด ๋ง์น ๋๊ธฐ ์ฒ๋ฆฌ์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๐ Chart.js vs D3.js (๊ฒฝํ์ ์ํ ๊ฐ์ธ์ ์ธ ๋น๊ต)โ
Chart.js๋ ๊ธฐ๋ณธ ์ ํ์ ๊ทธ๋ํ๊ฐ ์ฃผ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฅ ์ฝ๊ฒ ํด์ ํ๊ณ ํ๋ก์ ํธ ์ ์ ๊ธฐ๊ฐ์ด ์งง์ ๊ฒฝ์ฐ ์ฌ์ฉํ๋ฉด ์ข์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ Chart.js๋ฅผ ์ฌ์ฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์กด์ฌํ์ฌ React์ ๊ฐ์ ํ๋ฐํธ์๋ JavaScript ํ๋ ์์ํฌ ๋ด์์๋ ์ฌ์ฉํ๊ธฐ ์ฝ์ต๋๋ค. ๋ํ, Chart.js๋ ๋ฌธ์ํ๋ ์ ๋์ด ์์ด์์ต๋๋ค. ์ด์ ๋นํด D3.js๋ ํ์ต ๊ณก์ ์ด ํจ์ฌ ๋ ํฌ์ง๋ง ๋ฌธ์ํ๋ Chart.js์ ๋นํด ์์ฌ์ด ๋ถ๋ถ์ด ์์ต๋๋ค. ๊ทธ์น๋ง, Chart.js์ ๋นํด ํจ์ฌ ๋ ๋ง์ custom์ ํ ์ ์์ผ๋ฉฐ ๋ค์ํ ๊ทธ๋ํ ์ ํ์ด ๋ง์ต๋๋ค.
๐ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋น์ง ์ปฌ๋ ์ โ
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋๋ฌ ๊ฐ๋ฅ์ฑ(reachability) ์ด๋ผ๋ ๊ฐ๋
์ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
โ๋๋ฌ ๊ฐ๋ฅํ(reachable)โ ๊ฐ์ ์ฝ๊ฒ ๋งํด ์ด๋ป๊ฒ๋ ์ ๊ทผํ๊ฑฐ๋ ์ฌ์ฉํ ์ ์๋ ๊ฐ์ ์๋ฏธํฉ๋๋ค. ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ๋์ง ์์ต๋๋ค.
- ์๋ ํญ๋ชฉ์ ๊ทธ ํ์๋ถํฐ ๋๋ฌ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์, ๋ช
๋ฐฑํ ์ด์ ์์ด๋ ์ญ์ ๋์ง ์์ต๋๋ค.
- ํ์ฌ ํจ์์ ์ง์ญ ๋ณ์์ ๋งค๊ฐ๋ณ์
- ์ค์ฒฉ ํจ์์ ์ฒด์ธ์ ์๋ ํจ์์์ ์ฌ์ฉ๋๋ ๋ณ์์ ๋งค๊ฐ๋ณ์
- ์ ์ญ ๋ณ์
- ๊ธฐํ ๋ฑ๋ฑ
์ด๋ฐ ๊ฐ์ ๋ฃจํธ(root) ๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
๋ฃจํธ๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ด๋ ์ฒด์ด๋์ผ๋ก ๋ฃจํธ์์ ์ฐธ์กฐํ ์ ์๋ ๊ฐ์ ๋๋ฌ ๊ฐ๋ฅํ ๊ฐ์ด ๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝ ํธ ์์ง ๋ด์์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ(garbage collector)๊ฐ ๋์์์ด ๋์ํฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ , ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด๋ ์ญ์ ํฉ๋๋ค.
๋ด๋ถ ์๊ณ ๋ฆฌ์ฆโ
'mark-and-sweepโ์ด๋ผ ๋ถ๋ฆฌ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ด ์๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋ฃจํธ(root) ์ ๋ณด๋ฅผ ์์งํ๊ณ ์ด๋ฅผ โmark(๊ธฐ์ต)โ ํฉ๋๋ค.
- ๋ฃจํธ๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ด๊ฒ๋ค์ โmarkโ ํฉ๋๋ค.
- mark ๋ ๋ชจ๋ ๊ฐ์ฒด์ ๋ฐฉ๋ฌธํ๊ณ ๊ทธ ๊ฐ์ฒด๋ค์ด ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ mark ํฉ๋๋ค. ํ๋ฒ ๋ฐฉ๋ฌธํ ๊ฐ์ฒด๋ ์ ๋ถ mark ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ๋ ์ผ์ ์์ต๋๋ค.
- ๋ฃจํธ์์ ๋๋ฌ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฐฉ๋ฌธํ ๋๊น์ง ์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค.
- mark ๋์ง ์์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ํฉ๋๋ค.
์ต์ ํ ๊ธฐ๋ฒ:
- generational collection(์ธ๋๋ณ ์์ง) โ ๊ฐ์ฒด๋ฅผ '์๋ก์ด ๊ฐ์ฒดโ์ '์ค๋๋ ๊ฐ์ฒดโ๋ก ๋๋๋๋ค. ๊ฐ์ฒด ์๋น์๋ ์์ฑ ์ดํ ์ ์ญํ ์ ๋น ๋ฅด๊ฒ ์ํํด ๊ธ๋ฐฉ ์ธ๋ชจ๊ฐ ์์ด์ง๋๋ฐ, ์ด๋ฐ ๊ฐ์ฒด๋ฅผ '์๋ก์ด ๊ฐ์ฒดโ๋ก ๊ตฌ๋ถํฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ด๋ฐ ๊ฐ์ฒด๋ฅผ ๊ณต๊ฒฉ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐํฉ๋๋ค. ์ผ์ ์๊ฐ ์ด์ ๋์ ์ด์๋จ์ ๊ฐ์ฒด๋ '์ค๋๋ ๊ฐ์ฒดโ๋ก ๋ถ๋ฅํ๊ณ , ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ๋ ๊ฐ์ํฉ๋๋ค.
- incremental collection(์ ์ง์ ์์ง) โ ๋ฐฉ๋ฌธํด์ผ ํ ๊ฐ์ฒด๊ฐ ๋ง๋ค๋ฉด ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ํ ๋ฒ์ ๋ฐฉ๋ฌธํ๊ณ mark ํ๋๋ฐ ์๋นํ ์๊ฐ์ด ์๋ชจ๋ฉ๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋ง์ ๋ฆฌ์์ค๊ฐ ์ฌ์ฉ๋์ด ์คํ ์๋๋ ๋์ ๋๊ฒ ๋๋ ค์ง๊ฒ ์ฃ . ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ฐ ํ์์ ๊ฐ์ ํ๊ธฐ ์ํด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋ถ๋ฆฌํ ๋ค์, ๊ฐ ๋ถ๋ถ์ ๋ณ๋๋ก ์ํํฉ๋๋ค. ์์ ์ ๋ถ๋ฆฌํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ์ถ์ ํ๋ ๋ฐ ์ถ๊ฐ ์์ ์ด ํ์ํ๊ธด ํ์ง๋ง, ๊ธด ์ง์ฐ์ ์งง์ ์ง์ฐ ์ฌ๋ฌ ๊ฐ๋ก ๋ถ์ฐ์ํฌ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
- idle-time collection(์ ํด ์๊ฐ ์์ง) โ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์คํ์ ์ฃผ๋ ์ํฅ์ ์ต์ํํ๊ธฐ ์ํด CPU๊ฐ ์ ํด ์ํ์ผ ๋์๋ง ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์คํํฉ๋๋ค.