๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’๊ณต๋ถ€/JS

[JavaScript] ์ด๋ฒคํŠธ ๋ฃจํ”„

by rindev 2021. 8. 14.

๐Ÿ™‹‍โ™€๏ธ๋ชฉ์ฐจ

JavaScript๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘?!

๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ

๋น„๋™๊ธฐ ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€?


๐Ÿ’ปJavascript๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ๋กœ ๋™์ž‘?!

โœ…์‹ฑ๊ธ€์Šค๋ ˆ๋“œ = ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰

๊ทธ๋Ÿฐ๋ฐ ์–ด๋–ป๊ฒŒ ๋น„๋™๊ธฐ๋กœ ์ผ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฑฐ์ง€?๐Ÿค”??

→ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๊ตฌ๋™๋˜๋Š” ํ™˜๊ฒฝ(๋ธŒ๋ผ์šฐ์ €, Node.js ๋“ฑ)์—์„œ๋Š” ์ฃผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ,

์ด๋Ÿฌํ•œ ๊ตฌ๋™ ํ™˜๊ฒฝ์ด ๋‹จ์ผ ํ˜ธ์ถœ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ ์—”์ง„๊ณผ ์ƒํ˜ธ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์žฅ์น˜๊ฐ€ ๋ฐ”๋กœ ์ด๋ฒคํŠธ๋ฃจํ”„!!

 

๐Ÿ’ป๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ

์ด๋ฏธ์ง€ ์ถœ์ฒ˜ : https://medium.com/@vdongbin/javascript-%EC%9E%91%EB%8F%99%EC%9B%90%EB%A6%AC-single-thread-event-loop-asynchronous-e47e07b24d1c

์œ„ ๊ทธ๋ฆผ์€ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์ด๋‹ค.

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์ธํ„ฐํ”„๋ฆฌํ„ฐ)
    • Heap : ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ผ์–ด๋‚˜๋Š” ๋ถ€๋ถ„
    • Call Stack : ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ์Œ“์ด๋Š” ์Šคํƒ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ ์™ธ
    • Web API : ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž์ฒด ์ง€์›ํ•˜๋Š” API. setTimeout์ด๋‚˜ XMLHttpRequest ๋“ฑ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
    • ์ฝœ๋ฐฑ ํ(ํƒœ์Šคํฌ ํ) : Web API์—์„œ ๋น„๋™๊ธฐ ์ž‘์—…์ด ์‹คํ–‰๋œ ํ›„ ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์ด ๋Œ€๊ธฐํ•˜๋Š” ๊ณณ
    • ์ด๋ฒคํŠธ ๋ฃจํ”„ : ์ฝœ์Šคํƒ์ด ๋น„์–ด์žˆ์„ ๋•Œ ํƒœ์Šคํฌ ํ์— ์žˆ๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋“ค์„ ๋„˜๊ฒจ์คŒ

 

๐Ÿ’ป๋น„๋™๊ธฐ์ฝ”๋“œ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”๊ฐ€?

https://youtu.be/wcxWlyps4Vg ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ œ์ž‘ํ•œ ์ด๋ฏธ์ง€

  • ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ฝœ์Šคํƒ์— ์Œ“์ด๊ฒŒ ๋˜๊ณ , ํ•จ์ˆ˜๊ฐ€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•จ๊ณผ ๋™์‹œ์— ์Šคํƒ์—์„œ ๋น ์ ธ๋‚˜์™€ ์‚ฌ๋ผ์ง„๋‹ค.
  • setTimeout์€ web API์— Timer๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค.
  • Timer๋Š” ์ผ์ • ์‹œ๊ฐ„์„ ๋Œ€๊ธฐํ•˜๋ฉด(ํ˜น์€ ๋น„๋™๊ธฐ ์ผ์„ ๋๋‚ด๋ฉด) callback์„ ํƒœ์Šคํฌํ์— ๋„˜๊ธฐ๊ณ  ์‚ฌ๋ผ์ง„๋‹ค.
  • ์ด๋ฒคํŠธ๋ฃจํ”„๋Š” ํƒœ์Šคํฌํ์™€ ์ฝœ์Šคํƒ์„ ์ง€์ผœ๋ณด๊ณ  ์žˆ๋‹ค๊ฐ€, ์ฝœ์Šคํƒ์ด ๋ชจ๋‘ ๋น„๋ฉด ํƒœ์Šคํฌํ์— ์žˆ๋Š” ์ฝœ๋ฐฑ์„ ์ฝœ์Šคํƒ์— ์˜ฌ๋ฆฐ๋‹ค.

 

โœ…ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šด ์˜ˆ์ œ(0์ดˆ ํ›„์— ์‹คํ–‰?)

 

0์ดˆ ํ›„์— ์‹คํ–‰ = ์ง€๊ธˆ ๋ฐ”๋กœ ์‹คํ–‰??๐Ÿค”

→ ์•„๋‹ˆ!!๐Ÿ˜ฑ

setTimeout์— ์˜ํ•ด ์ฝœ๋ฐฑ(console.log("์–ธ์ œ ์ถœ๋ ฅ??"))์€ ํƒœ์Šคํฌํ์— ์˜ฌ๋ผ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ!

์ฝœ์Šคํƒ์ด ๋น„์–ด์žˆ์–ด์•ผ ์ฝœ๋ฐฑ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, 1๊ณผ 2๊ฐ€ ์ถœ๋ ฅ๋œ ํ›„ ์ฝœ์Šคํƒ์ด ๋น„๋ฉด "์–ธ์ œ ์ถœ๋ ฅ??"์ด ์ถœ๋ ฅ๋œ๋‹ค.

 

 

๐Ÿ‘€์ฐธ๊ณ  (๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค)

๋Œ“๊ธ€