์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ํ๊ฒฝ
Call stack๊ณผ Event loop๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ธฐ ์ํด ๊ผญ ์์งํด์ผํ๋ ๊ฐ๋ ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ ํ๊ฒฝ์ ์๋ฏธํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์ ํ๊ฒฝ์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์๋ค. ํฌ๊ฒ Memory heap, call stack, web apis, callback queue, event loop๊ฐ ์๋ค.

Call Stack
ํธ์ถ ์คํ์ ํจ์์ ํธ์ถ์ ์คํ ๋ฐฉ์์ผ๋ก ๊ธฐ๋กํ๋ ์๋ฃ๊ตฌ์กฐ๋ค. ํ๋ก๊ทธ๋จ์์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์์๋๋ก ์คํ์ ๋ด๊ณ , ๊ฐ์ฅ ๋์ค์ ๋ค์ด์จ ์์ ์ ๋จผ์ ์ฒ๋ฆฌํ๋ LIFO(Last In First Out) ๊ตฌ์กฐ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฑ๊ธ ์ค๋ ๋ ๊ธฐ๋ฐ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์ ํ๋์ ํธ์ถ ์คํ๋ง์ ๊ฐ์ง๊ณ ์๊ณ , ํ ๋ฒ์ ํ๋์ task๋ง ์ฒ๋ฆฌํ ์ ์๋ค.
function fifth(){console.log(5)}
function fourth() { fifth()
console.log(4)}
function third() { fourth()
console.log(3)}
function second() { third()
console.log(2)}
function first() { second()
console.log(1)}
first();
// first ํธ์ถ์ ๊ฒฐ๊ณผ๊ฐ
// 5 4 3 2 1
์์ ์ฝ๋์ ๊ฐ์ด ์ต์๋จ ์ฝ๋๋ ๋ฒจ์์ first๋ผ๋ ํจ์๊ฐ ํธ์ถ๋์๊ณ , second๋ถํฐ fifth๊น์ง ์ฐจ๋ก๋๋ก ํธ์ถ๋๊ณ ๋ง์ง๋ง fifth ํจ์๋ถํฐ ์คํ๋๊ณ ๋ฐํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ ๊ฒ ๋๊ธฐ ๋ก์ง์์๋ ํ๋์ task๊ฐ ์ข
๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ Task๋ ์คํ๋์ง ๋ชปํ๊ณ ์์ฐจ์ ์ผ๋ก๋ง ์คํ๋ ์ ์๋ค.
Callback Queue
Callback Queue๋ ํจ์๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค. Call stack๊ณผ ๋ค๋ฅด๊ฒ ๊ฐ์ฅ ๋จผ์ ๋ค์ด์จ ํจ์๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ฒ๋ฆฌํ๋ FIFO(First In First Out) ๊ตฌ์กฐ๋ค. ํน์ ์ด๋ฒคํธ์ ๋ฐ๋ฅธ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ํ๋ฉด, ์ฝ๋ฐฑ ํจ์๋ Callback Queue์ ์ ์ฅ๋๋ค.
Event Loop
Event Loop๋ Call stack์ด ๋ค ๋น์์ง๋ฉด Callback queue์ ์กด์ฌํ๋ ํจ์๋ฅผ ํ๋์ฉ ํธ์ถ ์คํ์ผ๋ก ์ฎ๊ธฐ๋ ์ญํ ์ ํ๋ค.
- ํธ์ถ ์คํ์ ์์ ์ ๋ชจ๋ ์ฒ๋ฆฌํ๋ค.
- ํธ์ถ ์คํ์ด ๋น์์ ๊ฒฝ์ฐ. Microtask Queue๋ฅผ ํ์ธํ๊ณ ์ฒ๋ฆฌํด์ผ ํ ์์ ์ด ์๋ค๋ฉด Call Stack์ ๋ฃ๊ณ ์ฒ๋ฆฌํ๋ค.
- ๋ง์ฝ Mircrotask Queue๊ฐ ๋น์์ ๊ฒฝ์ฐ์๋ Animation Frames๋ฅผ ํ์ธํ๊ณ ์ฒ๋ฆฌํด์ผ ํ ์์ ์ด ์๋ค๋ฉด Call Stack์ ๋ฃ๊ณ ์ฒ๋ฆฌํ๋ค.
- 1~3 ๊ณผ์ ์ ๊ฑฐ์น๊ณ ๋ ํ ๋ง์ง๋ง์ผ๋ก Callback Queue๋ฅผ ํ์ธํ๊ณ ์ด์ ๊ณผ์ ๊ณผ ๊ฐ์ด Call Stack์ ๋ฃ๊ณ ์ฒ๋ฆฌํ๋ค.
* ํฌ๋กฌ ๋ธ๋ผ์ฐ์ (V8) ๊ธฐ์ค Microtask Queue -> Animation Frames-> Callback Queue ์ ์์๋ก ๋น๋๊ธฐ ํจ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
์ด๋ฒคํธ ๋ฃจํ์ ๋์์ ์๊ฐ์ ์ผ๋ก ๋ณด๋ ค๋ฉด http://latentflip.com/loupe/
์ฌ๊ธฐ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์ ํ์คํฌ ํ, ์ด๋ฒคํธ ๋ฃจํ๊ฐ ์ ํํ ์ด๋ป๊ฒ ๊ตฌํ๋์ด ์๋์ง์ ๋ํด์ ์์ธํ ๋ค๋ฃจ์ง๋ ์์ง๋ง, ์ด๋ฒคํธ๋ฃจํ๋ฅผ ๊ฐ๋จํ๊ฒ ์ดํดํ๋ ๋ฐ ์ข๋ค.
์ถ์ฒ:
Javascript ๋น๋๊ธฐ ํจ์์ ๋์์๋ฆฌ (feat. EventLoop)
Overview ์ด๋ฒ ํฌ์คํ ์์๋ ์ต๊ทผ Javascript๊ด๋ จ ํฌ์คํ 3๊ฐ๋ฅผ ์์ฑํ๋ฉด์ ๊ฐ์ธ์ ์ผ๋ก ๊ถ๊ธํ๋ ๋ด์ฉ์ ๋ค๋ค๋ณด๋ ค๊ณ ํฉ๋๋ค. (1) ํธ๋ค๋ฅ ํบ์๋ณด๋ Callback ํจ์ (2) ํธ๋ค๋ฅ ํบ์๋ณด๋ Promise (3) ํธ๋ค๋ฅ ํบ
gruuuuu.github.io
(JavaScript) ํธ์ถ ์คํ๊ณผ ์ด๋ฒคํธ๋ฃจํ
์๋ ํ์ธ์. ์ด๋ฒ ์๊ฐ์๋ ํธ์ถ ์คํ๊ณผ ์ด๋ฒคํธ๋ฃจํ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค! ์ ๋ง ์ค๋๋ง์ ์๋ฐ์คํฌ๋ฆฝํธ ํํธ ๊ฐ์ข๋ฅผ ์ฌ๋ฆฌ๋ค์. ์ฌ์ค ์ฌ๋งํ ๊ฒ๋ค์ ๋ค ๋ค๋ค๋ค๊ณ ์๊ฐํด์ 50๊ฐ์ผ๋ก ๋๋ด๋ ค
www.zerocho.com
8. Javascript์ ์ฝ ์คํ๊ณผ ์ด๋ฒคํธ ๋ฃจํ
์ง๋ ํฌ์คํธ์์ ์ ๊น ๋ค๋ฃจ์๋ ์ฝ ์คํ(call stack)์ ๋ํด ์์๋ณด๊ณ , ์กฐ๊ธ ๋ ๋์๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ๋ ํ ์๊ฐ ํ๋์ ์์ ๋ง ์ฒ๋ฆฌํ ์ ์๋ ๋จ์ผ ์ค๋ ๋ ๊ธฐ๋ฐ์ ์ธ์ด์์๋ ๋ถ๊ตฌํ๊ณ ๋์์ ๋ง
frontj.com
'Javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์๋ฐ์คํฌ๋ฆฝํธ์ ES6 ~ES2014 (2) | 2023.12.07 |
|---|---|
| ์๋ฐ์คํฌ๋ฆฝํธ์ Promise์ await/async (4) | 2023.11.21 |
| ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ (2) | 2023.11.17 |