์คํ ์ปจํ
์คํธ๋?
Stack, Queue
- Stack : FILO(First In Last Out), LIFO(Last In First Out)
- Queue : FIFO(First In First Out), LILO(Last In Last Out)
์คํ ์ปจํ
์คํธ
- ์คํํ ์ฝ๋์ ์ ๊ณตํ ์ ๋ณด๋ค์ ๋ชจ์ ๋์ ๊ฐ์ฒด
์คํ ์ปจํ
์คํธ์ ๋์
- ๋์ผํ ํ๊ฒฝ์ ์๋ ์ฝ๋๋ค์ ์คํํ ๋ ํ์ํ ํ๊ฒฝ ์ ๋ณด๋ค์ ๋ชจ์ ์ปจํ
์คํธ ๊ตฌ์ฑ
- ์ปจํ
์คํธ๋ค์ ์์๋๋ก Call Stack์ ์์ ์ฌ๋ฆผ
- ์ต์์ ์ปจํ
์คํธ์ ๊ด๋ จ ์๋ ์ฝ๋๋ค์ ์คํ
- ์ ์ฒด ์ฝ๋์ ํ๊ฒฝ๊ณผ ์์๋ฅผ ๋ณด์ฅ
์คํ ์ปจํ
์คํธ์ ๊ตฌ์ฑ ๋ฐฉ๋ฒ
- ์ ์ญ ๊ณต๊ฐ โ ์๋ ์คํ
- eval() ํจ์ โ ์ฌ์ฉ์ ๊ถ์ฅํ์ง ์์
- ํจ์ โ ๊ฐ์ฅ ํํ ์คํ ์ปจํ
์คํธ ๊ตฌ์ฑ ๋ฐฉ๋ฒ
- ๋ธ๋ก โ
{ }
๋ก ๋๋ฌ ์์ธ ์ฝ๋ ๋ด๋ถ. ES6 ๋ถํฐ ์ง์
์คํ ์ปจํ
์คํธ์ ์ฝ์คํ
์์ ์ฝ๋
var a = 1;
function outer() {
function inner() {
console.log(a);
var a = 3;
}
inner();
console.log(a);
}
outer();
console.log(a);
- ์คํ ์์ : (1) โ (5) โ (3) โ (2) โ (4) โ (6)
์ฝ์คํ ๋ณํ
ํ์ฑํ ๋ ์คํ ์ปจํ
์คํธ์ ์์ง ์ ๋ณด
- VariableEnvironment
- environmentRecord (snapshot)
- outerEnvironmentReference (snapshot)
- LexicalEnvironment
- environmentRecord
- outerEnvironmentReference
- ThisBinding
VariableEnvironment
- ๋ด๊ธฐ๋ ๋ด์ฉ์ LexicalEnvironment์ ๊ฐ์ง๋ง ์ต์ด ์คํ ์์ ์ค๋
์ท์ ์ ์ง
- ์คํ ์ปจํ
์คํธ ์์ฑ ์ VariableEnvironment์ ๋จผ์ ์ ๋ณด๋ฅผ ๋ด๊ณ , ๊ทธ๋๋ก LexicalEnvironment์ ๋ณต์ฌ ํ ํ ์ฃผ๋ก LexicalEnvironment๋ฅผ ํ์ฉ
- ๋ด๋ถ ๊ตฌ์ฑ ์์ : ํ์ฌ ์ปจํ
์คํธ ๋ด์ ์๋ณ์๋ค์ ๋ํ ์ ๋ณด + ์ธ๋ถ ํ๊ฒฝ ์ ๋ณด๊ฐ ์ ์ธ ์์ ์ ์ค๋
์ท์ผ๋ก ์ ์ฅ
- environmentRecord (snapshot)
- outerEnvironmentReference (snapshot)
LexicalEnvironment
- ์ ์
- ํ๊ตญ์ด๋ก ๋ฒ์ญ ์ '์ดํ์ ํ๊ฒฝ', '์ ์ ํ๊ฒฝ'์ ์ฌ์ฉํ๋๋ฐ ๋ชจ๋ ์ ์ ์น ์์
- ํ์ฌ ์ปจํ
์คํธ ๋ด๋ถ์๋ a, b, c์ ๊ฐ์ ์๋ณ์๋ค์ด ์๊ณ , ๊ทธ ์ธ๋ถ ์ ๋ณด๋ D๋ฅผ ์ฐธ์กฐํ๋๋ก ๊ตฌ์ฑ
- ์์ ๊ฐ์ ๊ตฌ์ฑ์ด ๋ง์น ์ฌ์ ๊ณผ ๋น์ทํ์ฌ '์ฌ์ ์ ํ๊ฒฝ'์ด ๋ ์ ํฉํ ํํ
- ํ์ง๋ง ๊ทธ๋ฅ ์๋ฏธ๋ง ์ดํดํ๊ณ ์ง์นญํ ๋๋ LexicalEnvironment๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์
- ๋ด๋ถ ๊ตฌ์ฑ ์์ : VariableEnvironment์ ๋์ผํ์ง๋ง ๋ณ๊ฒฝ ์ฌํญ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ์ ๋จ
- environmentRecord
- outerEnvironmentReference
environmentRecord์ ํธ์ด์คํ
(hoisting)
environmentRecord
- ํ์ฌ ์ปจํ
์คํธ์ ๊ด๋ จ ๋ ์ฝ๋์ ์๋ณ์ ์ ๋ณด๋ค์ด ์ ์ฅ
- ์ปจํ
์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ํจ์์ ์ง์ ๋ ๋งค๊ฐ๋ณ์ ์๋ณ์
- ์ ์ธํ ํจ์๊ฐ ์์ ๊ฒฝ์ฐ ๊ทธ ํจ์ ์์ฒด
- var๋ก ์ ์ธ ๋ ๋ณ์์ ์๋ณ์
- ์ปจํ
์คํธ ๋ด๋ถ ์ ์ฒด๋ฅผ ์ฒ์๋ถํฐ ๋๊น์ง ์ญ ํ์ด๋๊ฐ๋ฉฐ ์์๋๋ก ์์ง
- ์ ์ญ ์คํ ์ปจํ
์คํธ
- ๋ณ์ ๊ฐ์ฒด ์์ฑ ๋์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ตฌ๋ ํ๊ฒฝ์ด ๋ณ๋๋ก ์ ๊ณตํ๋ ์ ์ญ ๊ฐ์ฒด๋ฅผ ํ์ฉ
- ๋ธ๋ผ์ฐ์ ์ window, Node.js์ global ๊ฐ์ฒด ๋ฑ
- ์ด๋ค์ ๋ด์ฅ(native) ๊ฐ์ฒด๊ฐ ์๋ ํธ์คํธ(host) ๊ฐ์ฒด๋ก ๋ถ๋ฅ
ํธ์ด์คํ
์ ๋ฑ์ฅ
- ๋ณ์ ์ ๋ณด๋ฅผ ์์งํ๋ ๊ณผ์ ์ ๋ง์ณค๋ค๋ฉด, ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์์๋ ๋ถ๊ตฌํ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด๋ฏธ ํด๋น ํ๊ฒฝ์ ์ํ ์ฝ๋์ ๋ณ์๋ช
๋ค์ ๋ชจ๋ ์๊ณ ์๊ฒ ๋จ
- '์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋ณ์๋ค์ ์ต์๋จ์ผ๋ก ๋์ด ์ฌ๋ ค ๋์ ๋ค์ ์ค์ ์ฝ๋๋ฅผ ์คํํ๋ผ'๋ผ๊ณ ์๊ฐํด๋ ์ฝ๋ ํด์์ ๋ฌธ์ ๊ฐ ์์
- ์ด๋ฌํ ๊ณผ์ ์์ ํธ์ด์คํ
์ด๋ผ๋ ๊ฐ๋
์ด ๋ฑ์ฅ
ํธ์ด์คํ
์ ๊ฐ๋
- ํธ์ด์คํ
(hoisting) : hoist (๋์ด ์ฌ๋ฆฌ๋ค) + ~ing โ ์๋ณ์๋ค์ ์ต์๋จ์ผ๋ก ๋์ด ์ฌ๋ ค ๋์
- ๋ณ์ ์ ๋ณด๋ฅผ ์์งํ๋ ๊ณผ์ ์ ๋์ฑ ์ดํดํ๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ๋์ฒดํ ๊ฐ์์ ๊ฐ๋
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ค์ ๋ก ๋์ด ์ฌ๋ฆฌ์ง๋ ์์ง๋ง ํธ์์ ๋์ด ์ฌ๋ฆฌ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ์๋ ๊ฒ
ํธ์ด์คํ
๊ท์น - ๋งค๊ฐ ๋ณ์์ ๋ณ์ ์ ์ธ์ ๋ํ ํธ์ด์คํ
- environmentRecord๋ ํ์ฌ ์คํ ๋ ์ปจํ
์คํธ ๋์ ์ฝ๋ ๋ด์ ์ด๋ค ์๋ณ์๋ค์ด ์๋์ง์๋ง ๊ด์ฌ์ด ์์ง, ๊ฐ ์๋ณ์๋ค์ด ์ด๋ค ๊ฐ์ด ํ ๋น ๋ ์ง์๋ ๊ด์ฌ์ด ์์
- ์์ - ์๋ณธ
function a (x) {
console.log(x);
var x;
console.log(x);
var x = 2;
console.log(x);
}
a(1);
-
ํธ์ด์คํ
์ด๋ผ๋ ๊ฐ๋
์ ๋ชจ๋ฅธ๋ค๊ณ ํ์ ๋, ์์ ์ฝ๋๋ฅผ ๋ณด๊ณ (1) ~ (3)์ ๊ฐ์ ์์ํด ๋ณด์
- (1) : ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌ ๋
1
- (2) : ์ง์ญ๋ณ์๋ก x๊ฐ ์ ์ธ๋์์ง๋ง ๊ฐ์ด ์์ผ๋ฏ๋ก
undefined
- (3) : ์ง์ญ๋ณ์ x์ ํ ๋น ๋
2
-
ํ์ง๋ง ์ค์ ๊ฒฐ๊ณผ๋ 1, 1, 2
๊ฐ ๋์ค๊ฒ ๋จ. ๊ฒฐ๊ณผ ํ์ธ
-
๋งค๊ฐ ๋ณ์, ๋ณ์ ์ ์ธ์ด ์ด๋ป๊ฒ ํธ์ด์คํ
๋๋์ง ๊ฐ๋
์ ์ผ๋ก ํ์ธํ๊ธฐ ์ํด ์๋์ ์์ ์ฝ๋ ํ์ธ
-
์์ - ๋งค๊ฐ ๋ณ์ ํธ์ด์คํ
function a () {
var x = 1;
console.log(x);
var x;
console.log(x);
var x = 2;
console.log(x);
}
a();
-
๋งค๊ฐ๋ณ์๋ฅผ ๋ณ์ ์ ์ธ ๋ฐ ํ ๋น๊ณผ ๊ฐ๋ค๊ณ ๊ฐ์ฃผํ์ฌ ๋ณํํ ์ํ
-
๊ฒฐ๊ณผ๋ ๋์ผ. ๊ฒฐ๊ณผ ํ์ธ
-
์์ - ๋ณ์ ์ ์ธ ๋ถ๋ถ๊ณผ ํ ๋น ๋ถ๋ถ์ ๋๋ ํธ์ด์คํ
function a () {
var x;
var x;
var x;
x = 1;
console.log(x);
console.log(x);
x = 2;
console.log(x);
}
a();
- environmentRecord๋ ํ์ฌ ์คํ ๋ ์ปจํ
์คํธ ๋์ ์ฝ๋ ๋ด์ ์ด๋ค ์๋ณ์๋ค์ด ์๋์ง์๋ง ๊ด์ฌ์ด ์๊ธฐ ๋๋ฌธ์ ๋ณ์ ์ ์ธ ๋ถ๋ถ๋ง ์ต์๋จ์ผ๋ก ์ฌ๋ผ๊ฐ๊ฒ ๋จ
- ๊ฒฐ๊ณผ๋ ๋์ผ. ๊ฒฐ๊ณผ ํ์ธ
ํธ์ด์คํ
๊ท์น - ํจ์ ์ ์ธ์ ๋ํ ํธ์ด์คํ
function a() {
console.log(b);
var b = 'bbb';
console.log(b);
function b() {}
console.log(b);
}
a();
-
์ง๊ธ๊น์ง์ ์ง์์ ๋์ํด (1) ~ (3)์ ์์ํด ๋ณด์
- (1) : ๋ณ์, ํจ์์ ์ ์ธ๋ถ๊ฐ ํธ์ด์คํ
๋์ด b๊ฐ ์ ์ธ์ ๋์ด ์์ผ๋ ๊ฐ์ด ์์ผ๋
undefined
- (2) : ๋ฐ๋ก ์์์ b์ 'bbb'๋ฅผ ํ ๋น ๋ฐ์์ผ๋
bbb
- (3) : ๋ฐ๋ก ์์ b๋ฅผ ํจ์๋ก ์ ์ธ ํ์ผ๋
function b() {}
-
ํ์ง๋ง ๊ฒฐ๊ณผ๋ function b() {}, bbb, bbb
๊ฐ ๋์ค๊ฒ ๋จ. ๊ฒฐ๊ณผ ํ์ธ
-
์์ - ๋ณ์ ์ ์ธ, ํจ์ ์ ์ธ ํธ์ด์คํ
function a() {
var b;
function b() {}
console.log(b);
b = 'bbb';
console.log(b);
console.log(b);
}
a();
- ๋ณ์๋ ์ ์ธ๋ถ์ ํ ๋น๋ถ๋ฅผ ๋๋ ์ ์ธ๋ถ๋ง ๋์ด์ฌ๋ฆฌ์ง๋ง, ํจ์๋ ํจ์ ์ ์ฒด๋ฅผ ๋์ด ์ฌ๋ฆผ
- ํธ์ด์คํ
์ด ๋๋ ์ํ์์์ ํจ์ ์ ์ธ๋ฌธ์ (*)๊ณผ ๊ฐ์ด ํจ์๋ช
์ผ๋ก ์ ์ธํ ๋ณ์์ ํจ์๋ฅผ ํ ๋นํ ๊ฒ์ฒ๋ผ ์ฌ๊ธธ ์ ์์
- ๊ฒฐ๊ณผ๋ ๋์ผ. ๊ฒฐ๊ณผ ํ์ธ
ํจ์ ์ ์ธ๋ฌธ๊ณผ ํจ์ ํํ์
- ํจ์ ์ ์ธ๋ฌธ : ํจ์ ์ ์๋ถ๋ง ์กด์ฌํ๊ณ ๋ณ๋์ ํ ๋น ๋ช
๋ น์ด ์๋ ๊ฒ
- ํธ์ด์คํ
์ ํจ์ ์ ์ฒด๋ฅผ ๋์ด ์ฌ๋ฆผ
- ํจ์ ํํ์ : ์ ์ํ ํจ์๋ฅผ ๋ณ๋์ ๋ณ์์ ํ ๋นํ๋ ๊ฒ
- ์ต๋ช
ํจ์ ํํ์ : ํจ์๋ช
์ ์ ์ํ์ง ์์
- ๊ธฐ๋ช
ํจ์ ํํ์ : ํจ์๋ช
์ ์ ์ํจ
- ์ธ๋ถ์์ ํจ์๋ช
์ผ๋ก ํธ์ถ ๋ถ๊ฐ๋ฅ
- ๋ด๋ถ์์ ์ฌ๊ทํจ์๋ฅผ ํธ์ถํ๋ ์ฉ๋๋ก ์ฌ์ฉ. ํ์ง๋ง ๋ณ์๋ช
์ผ๋ก๋ ํธ์ถ ๊ฐ๋ฅํ์ฌ ๊ตณ์ด ์ธ ํ์๋ ์์ด ๋ณด์
- ํธ์ด์คํ
์ ๋ณ์๋ก ์ทจ๊ธ๋์ด ์ ์ธ ๋ถ๋ถ๋ง ๋์ด ์ฌ๋ฆผ
function a() { }
a();
var b = function () { }
b();
var c = function d() { }
c();
d();
ํจ์ ์ ์ธ๋ฌธ์ ์ํ์ฑ
- ํจ์ ์ ์ธ๋ฌธ์ด ์ฝ๋ ์๋จ์ ์ ์ธ๋์ด ์๋ ์ํ์์ ๋์ผํ ์ด๋ฆ์ ํจ์ ์ ์ธ๋ฌธ์ด ์ฝ๋ ํ๋จ์ ์ค๋ณตํด์ ์ ์ธ ๋ ๊ฒฝ์ฐ.
- ํธ์ด์คํ
๊ณผ์ ์์ ๋ ํจ์ ์ ์ธ๋ฌธ์ด ๋ชจ๋ ๋์ด ์ฌ๋ ค์ง๊ณ , ์๋์ ์ผ๋ก ํ๋จ์ ์๋ ํจ์ ์ ์ธ๋ฌธ์ด ์ฝ๋ ์ ์ฒด์ ์ํฅ์ ๋ฏธ์น๊ฒ ๋จ.
- ํจ์ ํํ์์ผ๋ก ํจ์๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ํ๋จ์ ํจ์๊ฐ ๋์ค๊ธฐ ์ ๊น์ง๋ ์๋จ์ ์ ์ธ ๋ ํจ์๋ก ์ฌ์ฉ ๋๋ค๊ฐ ํ๋จ์ ํจ์๊ฐ ๋์ค๋ฉด ๊ทธ๋ ๋ถํฐ ํ๋จ์ ํจ์๋ก ์ ์ฉ ๋จ.
- ์์ - ํจ์ ์ ์ธ๋ฌธ
console.log(sum(3, 4));
function sum(x, y) {
return x + y;
}
var a = sum(1, 2);
console.log(a);
function sum(x, y) {
return `${x} + ${y} = ${x + y}`;
}
var c = sum(1, 2);
console.log(c);
var sum = function (x, y) {
return x + y;
}
var a = sum(1, 2);
console.log(a);
var sum = function (x, y) {
return `${x} + ${y} = ${x + y}`;
}
var c = sum(1, 2);
console.log(c);
์ค์ฝํ, ์ค์ฝํ ์ฒด์ธ, outerEnvironmentReference
- ์ค์ฝํ (Scope) : ์๋ณ์์ ๋ํ ์ ํจ ๋ฒ์
- ES5๊น์ง๋ ์ ์ญ ๊ณต๊ฐ ์ธ์ ์ค์ง ํจ์์ ์ํด์๋ง ์ค์ฝํ๊ฐ ์์ฑ
- ์ค์ฝํ ์ฒด์ธ (Scope chain) : ์๋ณ์์ ๋ํ ์ ํจ ๋ฒ์๋ฅผ ์์์ ๋ถํฐ ๋ฐ๊นฅ์ผ๋ก ์ฐจ๋ก๋ก ๊ฒ์ํด ๋๊ฐ๋ ๊ฒ
- ์ค์ฝํ ์ฒด์ธ์ ๊ฐ๋ฅ์ผ ํ๋ ๊ฒ์ด outerEnvironmentReference
์ค์ฝํ ์ฒด์ธ
- ํ์ฌ ์ค์ฝํ์ ์ ์ธ ๋ ์๋ณ์์ด ์์ผ๋ฉด ์์ ์ค์ฝํ๋ก ์ด๋ํ์ฌ ๊ฒ์
- ์ฌ๋ฌ ์ค์ฝํ์์ ๋์ผํ ์๋ณ์๋ฅผ ์ ์ธํ ๊ฒฝ์ฐ์๋ ๋ฌด์กฐ๊ฑด ์ค์ฝํ ์ฒด์ธ ์์์ ๊ฐ์ฅ ๋จผ์ ๋ฐ๊ฒฌ๋ ์๋ณ์์๋ง ์ ๊ทผ ๊ฐ๋ฅ
- ๋ณ์ ์๋ํ (Variable shadowing) : ์์ ์ค์ฝํ์ ์ ์ธ๋์ด ์์ง๋ง, ํ์ฌ ์ค์ฝํ์ ์ด๋ฏธ ์ ์ธ๋ ๊ฒฝ์ฐ์๋ ๊ฐ์ด ํ ๋น๋์ด ์์ง ์๋ค๊ณ ํ๋๋ผ๋ ํ์ฌ ์ค์ฝํ์ ๋ณ์๋ฅผ ์ฐ์ ์ผ๋ก ํจ
- ์์
var a = 1;
var outer = function() {
var inner = function() {
console.log(a);
var a = 3;
};
inner();
console.log(a);
}
outer();
console.log(a);
- (1) inner ํจ์ ์ปจํ
์คํธ์๋ a ์๋ณ์๊ฐ ์กด์ฌํ์ง๋ง ์์ง ๊ฐ์ด ํ ๋น๋์ง ์์๊ธฐ ๋๋ฌธ์
undefined
์ ์ถ๋ ฅ
- (2) outer ํจ์ ์ปจํ
์คํธ์๋ a ์๋ณ์๊ฐ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก, outerEnvironmentReference๋ฅผ ๋ฐ๋ผ๊ฐ์ ์ ์ญ ์ปจํ
์คํธ์ a์ ๋ค์ด ์๋
1
์ ์ถ๋ ฅ
- (3) ์ ์ญ ์ปจํ
์คํธ์๋ a ์๋ณ์๊ฐ ์กด์ฌํ๊ณ ๊ฐ์ด ์กด์ฌํ๋ฏ๋ก
1
์ ์ถ๋ ฅ
- ๊ฒฐ๊ณผ ํ์ธ
์ค์ฝํ ์ฒด์ธ ํ์ธ - ํฌ๋กฌ ์ ์ฉ
var a = 1;
var outer = function() {
var b = 2;
var inner = function() {
console.dir(inner);
};
inner();
}
outer();
์ ์ญ๋ณ์์ ์ง์ญ๋ณ์
- ์ ์ญ๋ณ์ : ์ ์ญ ๊ณต๊ฐ์์ ์ ์ธํ ๋ณ์
- ์ง์ญ๋ณ์ : ํจ์ ๋ด๋ถ์์ ์ ์ธํ ๋ณ์
this
- ์คํ ์ปจํ
์คํธ์ thisBinding์๋ this๋ก ์ง์ ๋ ๊ฐ์ฒด๊ฐ ์ ์ฅ๋จ
- ์คํ ์ปจํ
์คํธ ํ์ฑํ ๋น์์ this๊ฐ ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ, this์๋ ์ ์ญ ๊ฐ์ฒด๊ฐ ์ ์ฅ ๋จ
- ๊ทธ ๋ฐ์๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ this์ ์ ์ฅ๋๋ ๋์์ด ๋ค๋ฆ