์๋ฐ์คํฌ๋ฆฝํธ ์ด๋ฒคํธ ๋ฃจํ๋ ์ฑ๊ธ ์ค๋ ๋ ํ๊ฒฝ(single-threaded)
์์ ๋น๋๊ธฐ ์์
์ผ๋ก ๋์์ฑ์ ์ง์ํ๋ ๋ฉ์ปค๋์ฆ์
๋๋ค. ์ด๋ฒคํธ ๋ฃจํ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ, ์ฝ๋ฐฑ์คํ, ํ์คํฌ ํ ๊ด๋ฆฌ ๋ฑ์ ๋ด๋นํ์ฌ ๋น๋๊ธฐ ์์
์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ ํฉ๋๋ค. ์์ฒญ๋ ๋น๋๊ธฐ ์์
์ด ์๋ฃ๋๋ฉด ์ฝ๋ฐฑ์ด ํ์คํฌ ํ๋ก ์ด๋ํ๊ณ ์ฝ์คํ์ด ๋น ์ํ๊ฐ ๋๋ฉด ์ด๋ฒคํธ ๋ฃจํ๋ ํ์์ ์ฒซ๋ฒ์งธ ์ฝ๋ฐฑ์ ๊บผ๋ด์ ์ฝ์คํ์ ๋ฃ์ด์ฃผ๊ณ ์ฝ์คํ์์ ์ฝ๋ฐฑํจ์๋ฅผ ์คํ ํฉ๋๋ค. ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ๋น๋๊ธฐ ์์
์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ ํฉ๋๋ค.
์ฝ๋ ์์ 1
console.log("1"); setTimeout(() => { console.log("2"); }, 0); Promise.resolve() .then(() => { console.log("3"); }) .then(() => { console.log("4"); }); console.log("5");
์ถ๋ ฅ
1 5 3 4 2
์ค๋ช
- "1"๊ณผ "5"๋ ๋๊ธฐ ์ฝ๋๋ก ๋จผ์ ์คํ.
- Promise์ then์ Microtask Queue์์ ์์ฐจ ์คํ ("3", "4").
- setTimeout์ Task Queue์์ ๋ง์ง๋ง์ ์คํ ("2")
์ฝ๋ ์์ 2
console.log("์์"); // setTimeout์ผ๋ก ๋น๋๊ธฐ ์์ ์ถ๊ฐ (Task Queue๋ก ์ด๋) setTimeout(() => { console.log("setTimeout ์คํ (5์ด ํ)"); }, 5000); // Promise๋ก ๋น๋๊ธฐ ์์ ์ถ๊ฐ (Microtask Queue๋ก ์ด๋) Promise.resolve() .then(() => { console.log("Promise ์คํ"); }); // ๋ฌด๊ฑฐ์ด ๋๊ธฐ ์์ (Call Stack์์ ๋ฐ๋ก ์คํ) for (let i = 0; i < 3; i++) { console.log("๋๊ธฐ ์์ ${i}"); } console.log("๋");
์คํ ์์์ ์ค๋ช
ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ด ์์ฐจ์ ์ผ๋ก ๋ํ๋ฉ๋๋ค.
์์ ๋๊ธฐ ์์ 0 ๋๊ธฐ ์์ 1 ๋๊ธฐ ์์ 2 ๋ Promise ์คํ (5์ด ํ) setTimeout ์คํ (5์ด ํ)
- console.log("์์"): Call Stack์ ์์ด๊ณ ๋ฐ๋ก ์คํ๋์ด ์ถ๋ ฅ.
- setTimeout: ๋น๋๊ธฐ ํจ์๋ก, 5์ด ํ ์คํ๋ ์ฝ๋ฐฑ์ด Task Queue์ ์ถ๊ฐ๋จ.
- Promise.resolve().then(): Promise๋ Microtask Queue์ ์ถ๊ฐ๋จ (Microtask๋ Task Queue๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์).
- for ๋ฃจํ: ๋๊ธฐ ์ฝ๋๋ก Call Stack์์ ์ฆ์ ์คํ, "๋๊ธฐ ์์ 0, 1, 2" ์ถ๋ ฅ.
- console.log("๋"): Call Stack์ ์์ด๊ณ ๋ฐ๋ก ์คํ.
- Call Stack์ด ๋น์ด์ง: ์ด๋ฒคํธ ๋ฃจํ๊ฐ Microtask Queue๋ฅผ ํ์ธํ๊ณ Promise์ ์ฝ๋ฐฑ์ ์คํ ("Promise ์คํ" ์ถ๋ ฅ).
- 5์ด ํ: ์ด๋ฒคํธ ๋ฃจํ๊ฐ Task Queue์์ setTimeout์ ์ฝ๋ฐฑ์ ๊ฐ์ ธ์ ์คํ ("setTimeout ์คํ" ์ถ๋ ฅ).
์ด๋ฒคํธ ๋ฃจํ์ ๋์ ์์ฝ
- ๋๊ธฐ ์ฝ๋๋ ์ฆ์ Call Stack์์ ์คํ๋ฉ๋๋ค.
- ๋น๋๊ธฐ ์์ ์ Task Queue(์: setTimeout) ๋๋ Microtask Queue(์: Promise)์ ๋ค์ด๊ฐ ๋๊ธฐํฉ๋๋ค.
- ์ด๋ฒคํธ ๋ฃจํ๋ Call Stack์ด ๋น์ด ์์ ๋ ํ์์ ์์ ์ ๊บผ๋ด ์คํํ๋ฉฐ, Microtask Queue๊ฐ Task Queue๋ณด๋ค ์ฐ์ ์์๊ฐ ๋์ต๋๋ค.
๊ด๋ จ๊ฒ์๋ฌผ [์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ์] : https://nam-yeun-hwa.github.io/posts/38
์ฐธ๊ณ ์ ํฌ๋ธ : https://www.youtube.com/watch?v=eiC58R16hb8