์ฝ์คํ (Call Stack)
์ฝ์คํ์ ํ์ฌ ์คํ ์ค์ธ ํจ์์ ํธ์ถ์ ๊ธฐ๋กํ๋ ์๋ฃ ๊ตฌ์กฐ์
๋๋ค. ํจ์๊ฐ ํธ์ถ๋๋ฉด ํด๋น ํจ์์ ์ ๋ณด๊ฐ ์คํ์ ์ถ๊ฐ๋๊ณ , ํจ์์ ์คํ์ด ์๋ฃ๋๋ฉด ์คํ์์ ์ ๊ฑฐ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฝ์คํ์ ํจ์์ ํธ์ถ ์์๋ฅผ ์ถ์ ํ๊ณ , ์คํ ์ค์ธ ํจ์์ ์ปจํ
์คํธ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
๐ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ ์ฝ์คํ์ ์์ด๋ ๊ณผ์
function greet(name) { let greeting = "Hello, " + name + "!"; console.log(greeting); } function sayHello() { greet("Alice"); } sayHello();
- 1. sayHello() ํจ์๊ฐ ํธ์ถ๋๋ฉด์ ์๋ก์ด ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ ํธ์ถ ์คํ์ ์ถ๊ฐ๋ฉ๋๋ค.
ใํธ์ถ ์คํ: [sayHello()]
- 2. sayHello() ํจ์ ๋ด์์ greet("Alice")๊ฐ ํธ์ถ๋๋ฉด์ ๋ ๋ค๋ฅธ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ ํธ์ถ ์คํ์ ์ถ๊ฐ๋ฉ๋๋ค.
ใํธ์ถ ์คํ: [sayHello(), greet("Alice")]
- 3. greet("Alice") ํจ์ ๋ด์์ ๋ณ์ greeting์ด ์์ฑ๋๊ณ ๊ฐ์ด ํ ๋น๋ฉ๋๋ค.
ใํธ์ถ ์คํ: [sayHello(), greet("Alice")]
- 4. console.log(greeting)์ด ์คํ๋๊ณ ํธ์ถ ์คํ์์ greet("Alice") ์คํ ์ปจํ ์คํธ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.
ใํธ์ถ ์คํ: [sayHello()]
- 5. sayHello() ํจ์ ๋ด์ ๋ชจ๋ ์ฝ๋๊ฐ ์คํ๋๊ณ ํธ์ถ ์คํ์์ ํด๋น ์คํ ์ปจํ ์คํธ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.
ใํธ์ถ ์คํ: []
์ด๋ฒคํธ ๋ฃจํ ํ (Event Loop Queue)
์ด๋ฒคํธ ๋ฃจํ ํ๋ ๋น๋๊ธฐ ์์
์ ์๋ฃ ๋๋ ์ด๋ฒคํธ ๋ฐ์์ ๊ธฐ๋ค๋ฆฌ๋ ๋๊ธฐ์ด์
๋๋ค. ๋น๋๊ธฐ ํจ์์ ์ฝ๋ฐฑ ํจ์๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ธฐ๋ ์ด๋ฒคํธ ๋ฃจํ ํ์ ์ถ๊ฐ๋์ด ๋๊ธฐํ๋ค๊ฐ ์ฝ์คํ์ด ๋น์ด์์ ๋ ์คํ๋ฉ๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ ์ฝ์คํ์ด ๋น์ด์์ ๋๋ง๋ค ํ์์ ์์
์ ๊บผ๋ด์ด ์ฝ์คํ์ ์ถ๊ฐํ์ฌ ์คํ๋ ์ ์๋๋ก ํฉ๋๋ค.
๐ ์ด๋ฒคํธ ๋ฃจํ์ ํธ์ถ ์คํ 1
setTimeout(() => { console.log('hello'); }, 0); // ์์ ํ์ ์ฝ๋ฐฑ์ด ์ถ๊ฐ๋จ console.log('world'); // ์ถ๋ ฅ ๊ฒฐ๊ณผ: // world // hello
1. setTimeout(() => { console.log('hello'); }, 0); ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค.
- setTimeout ํจ์๊ฐ ํธ์ถ๋์ด ํ์ด๋จธ๊ฐ ์ค์ ๋ฉ๋๋ค. ์ด๋ ์ฝ๋ฐฑ ํจ์๋ ํ์คํฌ ํ์ ์ถ๊ฐ๋ฉ๋๋ค.
- ํ์ฌ ํธ์ถ ์คํ: [setTimeout()]
2. console.log('world'); ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค.
- "world"๊ฐ ์ฝ์์ ์ถ๋ ฅ๋ฉ๋๋ค.
- ํ์ฌ ํธ์ถ ์คํ: [setTimeout()]
3. ํธ์ถ ์คํ์์๋ ๋ ์ด์ ์คํํ ์ฝ๋๊ฐ ์์ผ๋ฏ๋ก ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์๋ํฉ๋๋ค.
4. ์ด๋ฒคํธ ๋ฃจํ๋ ํธ์ถ ์คํ์ด ๋น์ด์๋์ง ํ์ธํ๊ณ , ๋น์ด์๋ค๋ฉด ์์
ํ์ ์๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ํธ์ถ ์คํ์ ์ถ๊ฐํ์ฌ ์คํํฉ๋๋ค.
5. ์์
ํ์ ์๋ ์ฝ๋ฐฑ ํจ์๊ฐ ํธ์ถ ์คํ์ ์ถ๊ฐ๋์ด ์คํ๋ฉ๋๋ค.
- "hello"๊ฐ ์ฝ์์ ์ถ๋ ฅ๋ฉ๋๋ค.
- ํ์ฌ ํธ์ถ ์คํ: []
์ด๋ ๊ฒ ๋๋ฉด "world"๊ฐ ๋จผ์ ์ถ๋ ฅ๋๊ณ , ๊ทธ ํ "hello"๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค. ์ด๋ setTimeout์ ์๊ฐ ์ง์ฐ์ด 0ms๋ก ์ค์ ๋์๋๋ผ๋, ํด๋น ์ฝ๋ฐฑ ํจ์๊ฐ ์์
ํ์ ์ถ๊ฐ๋๊ณ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํตํด ํธ์ถ ์คํ์ ์ฌ๋ผ๊ฐ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ JavaScript์ ๋น๋๊ธฐ์ฑ์ ์ํด ์ฝ๋ฐฑ ํจ์์ ์คํ์ด ์ด๋ฃจ์ด์ง๋๋ค.
๐ ์ด๋ฒคํธ ๋ฃจํ์ ํธ์ถ ์คํ 2
function greet(name) { let greeting = "Hello, " + name + "!"; console.log(greeting); } function sayHello() { greet("Alice"); setTimeout(function() { console.log("๋น๋๊ธฐ ํจ์ ์คํ ์๋ฃ"); }, 1000); // 1์ด ํ์ ์คํ๋จ } sayHello();
- 1. sayHello() ํจ์๊ฐ ํธ์ถ๋๋ฉด์ ์๋ก์ด ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ ํธ์ถ ์คํ์ ์ถ๊ฐ๋ฉ๋๋ค.
ใํธ์ถ ์คํ: [sayHello()]
- 2. sayHello() ํจ์ ๋ด์์ greet("Alice")๊ฐ ํธ์ถ๋๋ฉด์ ๋ ๋ค๋ฅธ ์คํ ์ปจํ ์คํธ๊ฐ ์์ฑ๋๊ณ ํธ์ถ ์คํ์ ์ถ๊ฐ๋ฉ๋๋ค.
ใํธ์ถ ์คํ: [sayHello(), greet("Alice")]
- 3. greet("Alice") ํจ์ ๋ด์์ ๋ณ์ greeting์ด ์์ฑ๋๊ณ ๊ฐ์ด ํ ๋น๋ฉ๋๋ค.
ใํธ์ถ ์คํ: [sayHello(), greet("Alice")]
- 4. console.log(greeting)์ด ์คํ๋๊ณ ํธ์ถ ์คํ์์ greet("Alice") ์คํ ์ปจํ ์คํธ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.
ใํธ์ถ ์คํ: [sayHello()]
- 5. setTimeout ํจ์๊ฐ ํธ์ถ๋์ด ํ์ด๋จธ๊ฐ ์ค์ ๋ฉ๋๋ค. ์ด๋ ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ฏ๋ก ํธ์ถ ์คํ์๋ ์ถ๊ฐ๋์ง ์์ต๋๋ค.
ใํธ์ถ ์คํ:[sayHello()]
- 6. sayHello() ํจ์ ๋ด์ ๋ชจ๋ ์ฝ๋๊ฐ ์คํ๋์์ง๋ง, ์์ง ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋์ง ์์์ผ๋ฏ๋ก ์ด๋ฒคํธ ๋ฃจํ์์ ๋๊ธฐํฉ๋๋ค.
- 7. 1์ด ํ, ํ์ด๋จธ๊ฐ ๋ง๋ฃ๋๋ฉด ์ค์ ๋ ์ฝ๋ฐฑ ํจ์๊ฐ ์ด๋ฒคํธ ๋ฃจํ ํ์ ์ถ๊ฐ๋ฉ๋๋ค.
- 8. ์ด๋ฒคํธ ๋ฃจํ๋ ํธ์ถ ์คํ์ด ๋น์ด์๋์ง ํ์ธํ๊ณ , ๋น์ด์๋ค๋ฉด ์ด๋ฒคํธ ๋ฃจํ ํ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๊บผ๋ด์ ํธ์ถ ์คํ์ ์ถ๊ฐํ์ฌ ์คํํฉ๋๋ค.
- 9. ๋น๋๊ธฐ ํจ์ ์คํ ์๋ฃ" ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๊ณ ํธ์ถ ์คํ์์ ํด๋น ์คํ ์ปจํ ์คํธ๊ฐ ์ ๊ฑฐ๋ฉ๋๋ค.
ใํธ์ถ ์คํ: []
์ด๋ ๊ฒ ๋น๋๊ธฐ ํจ์๊ฐ ์ถ๊ฐ๋๋ฉด, ํด๋น ๋น๋๊ธฐ ํจ์์ ์ฝ๋ฐฑ ํจ์๊ฐ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ํตํด ์ ์ ํ ์์ ์ ํธ์ถ๋์ด ์คํ๋ฉ๋๋ค.
JavaScript ์ฝ๋ ์คํ์ด ๋ธ๋ผ์ฐ์ ์ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฏธ์น๋ ์ํฅ
์น ๋ธ๋ผ์ฐ์ ๋ ์ฝ ์คํ์ ์คํ ์ปจํ
์คํธ๊ฐ ์กด์ฌํ๋ ๋์, ์ฆ ์คํ ์ค์ธ ํจ์๊ฐ ์กด์ฌํ๋ ๋์์๋ ๋จนํต์ด ๋์ด ๋ฒ๋ฆฝ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๋๊ฐ 60fps๋ก ๋์ํ๊ธฐ ๋๋ฌธ์, ๋๋ต 16ms ์์ ์ฝ๋์ ์คํ์ ์๋ฃํ์ง ๋ชปํ๋ฉด ๋ธ๋ผ์ฐ์ ์ ์ ๋๋ฉ์ด์
์ด ๋๋ ๋๊ธฐ๋ ํ์์ด ๋ํ๋ฉ๋๋ค. ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์
์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
// ๋๊ธฐ์ ์ธ ์ฒ๋ฆฌ ์์ function syncExample() { console.log("์์"); for (let i = 0; i < 1000000000; i++) { // ๋งค์ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์ } console.log("์ข ๋ฃ"); } // ๋น๋๊ธฐ์ ์ธ ์ฒ๋ฆฌ ์์ function asyncExample() { console.log("์์"); setTimeout(function() { console.log("๋น๋๊ธฐ ์ฒ๋ฆฌ ์๋ฃ"); }, 2000); // 2์ด ํ์ ์ฝ๋ฐฑ ํจ์ ์คํ console.log("์ข ๋ฃ"); } // ๋๊ธฐ์ ์ธ ์ฒ๋ฆฌ ์คํ syncExample(); // ๋น๋๊ธฐ์ ์ธ ์ฒ๋ฆฌ ์คํ asyncExample();
์ ์ฝ๋์์ syncExample ํจ์๋ ๋งค์ฐ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋ฐ๋ณต๋ฌธ์ ํฌํจํ๊ณ ์์ด, ์คํ ์ค์๋ ๋ค๋ฅธ ์์
์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ด ํจ์๊ฐ ์คํ ์ค์ผ ๋๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋จนํต์ด ๋์ด ๋ฒ๋ฆฌ๊ณ , ์ ๋๋ฉ์ด์
์ด ๋๊ฒจ ๋ณด์ผ ์ ์์ต๋๋ค.
asyncExample ํจ์๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. setTimeout ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๋๋ก ํ์๊ธฐ ๋๋ฌธ์, ์ด ํจ์๊ฐ ์คํ๋๋ ๋์์๋ ๋ค๋ฅธ ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋๋ ๋๊ธฐ๋ ํ์์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ฐ๋ผ์, ๋น๋๊ธฐ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ๊ฐ ๋จนํต์ด ๋๋ ํ์์ ๋ฐฉ์งํ ์ ์์ผ๋ฉฐ, ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
asyncExample ํจ์๋ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. setTimeout ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ์คํํ๋๋ก ํ์๊ธฐ ๋๋ฌธ์, ์ด ํจ์๊ฐ ์คํ๋๋ ๋์์๋ ๋ค๋ฅธ ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋๋ ๋๊ธฐ๋ ํ์์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ฐ๋ผ์, ๋น๋๊ธฐ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ๊ฐ ๋จนํต์ด ๋๋ ํ์์ ๋ฐฉ์งํ ์ ์์ผ๋ฉฐ, ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.