์๋ฐ์คํฌ๋ฆฝํธ์ ๐single thread์ ํน์ง์ ๐setTimeout ํจ์์ ์คํ๊ณผ์ ์ ํตํด ์ดํด๋ณด์์ด์์ด์์์!
=> ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ง ์ค ํ๋์ธ ๐single thread์ ๋ฐ์ ํ ๊ด๋ จ์ด ์๋ค.
=> ๐single thread์ ํน์ง์ ์ดํดํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ์์์ ์ด ๋๋ ์ ์์๋์!
<script> function yo(){ setTimeout(function(){ console.log('1.5์ด ํ์ด๋จธ ๋!') }, 1500); for(let i=0;i<3;i++){ doSomething(); // 1์ด ์ ๋ ๊ฑธ๋ฆฌ๋ ํจ์๋ผ ๊ฐ์ console.log(i) } console.log('3์ด ๊ฑธ๋ฆฌ๋ for๋ฌธ ๋!') } yo(); console.log('main ๋!') </script>
- ์ฐ์ ๋ค์ ํจ์์ ์์๋๋ ๊ณผ์ ์ ์ ์ด๋ณด์.
- ํจ์ yo๋ผ๋ function ์์ด ์ด ํจ์๋ฅผ ํธ์ถํ๋ค.
- ํจ์ yo๋ 1.5์ด ๋ค์ ์ฝ์ ๋ก๊ทธ '1.5 ์ด ํ์ด๋จธ ๋!'์ ์ฐ๋ ํจ์๋ฅผ ์คํํ๋ผ๊ณ ํ์ด๋จธ๋ฅผ ๊ฑธ์ด๋์๋ค.
- setTimeout๋ฅผ ํธ์ถ์ ๋๋ด๋ฉด for๋ฌธ์ 3๋ฒ ๋๋๋ฐdoSomething(1์ด ์๊ฐ์ด ๊ฑธ๋ฆฌ๋) ์์์ ํจ์ ํธ์ถ๊ณผ ์ฝ์๋ก๊ทธ์ ๋ช ๋ฒ์งธ ์ผ ๋์๋์ง i๋ก ํ์๋๋ ๊ณผ์ ์ 3๋ฒ์ ๋๊ธฐ ์ํด์ ์ด 3์ด๊ฐ ํ์ํ๋ค.
- ์ดํ ๋ชจ๋ for๋ฌธ์ ๋น ์ ธ๋๊ฐ๋ฉด ์ฝ์์ '3์ด
๊ฑธ๋ฆฌ๋ for๋ฌธ์ ๋๋ฌ๋ค!'๋ผ๋ ๋ก๊ณ ๋ฅผ ์ฐ๋๋ค.- yoํจ์ ํธ์ถ์ ๋ชจ๋ ๋ง์น๋ฉด ๋ง์ง๋ง์ผ๋ก '๋ฉ์ธ ๋'์ด๋ผ๊ณ ์ฝ์์ ์ฐ๋๋ค.
- ๊ทธ ์ด์ ๋ ๐single thread์์ ๋ฐ์ํ๋ ๊ณผ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์
Queue
์์ ์ฝ๋๋ฅผ ํ๋์ฉ ๊บผ๋ด
๐single thread์ ํด๋นํ๋ ํ๋์Call Stack
์์ ํ๋์ฉ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ๋๋ฌธ์ ์ด๋ฌํ ํ์์ด ๋ฐ์ํ๋ค.
-WHAT ISโ
Queue
- ์๋ฐ์คํฌ๋ฆฝํธ์
Queue
๊ฐ ์๋๋ฐ ์ผ์ข ์ ํ ์ผ๋ค์ ๋ชจ์ ๋์ ๊ฒ์ด๋ค.
EX>Queue
์ main ํจ์, ์ฌ์ฉ์๊ฐ ํด๋ฆญ ์ ํด๋ฆญ์ ํด๋น๋๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๊ฐ์ ํจ์๊ฐ ์์ธ๋ค.
Event Loop
& Call Stack
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง,
Event Loop
๊ฐ ์ดQueue
๋ฅผ ๊ณ์ ํ์ธํ์ฌ ์ด ์์์ ํ๋์ฉ ์ฝ๋๋ฅผ ๊บผ๋ดCall Stack
์ผ๋ก ๋ณด๋ด ์คํ์ ์ํจ๋ค.- ์ด์ฒ๋ผ
Call Stack
์Queue
์ ๋ค์ด์๋ ํจ์(์ฝ๋)๋ฅผ ๊บผ๋ด์ดCall Stack
์ผ๋ก ๋ณด๋ด ์คํ์ํจ๋ค.**- ์ดํ ์คํ์ด ์๋ฃ๋๋ฉด ํจ์๋ฅผ ๋ฒ๋ฆฌ๊ณ ๋ค์ ๋ค์ ํจ์๋ฅผ
Queue
์์ ๊บผ๋ด์Call Stack
์ผ๋ก ๋ณด๋ด ์คํํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
EX>Call Stack
๋ณด๋ธ 1>click
์์ ๋ ๋ค๋ฅธ ํจ์๋ฅผ ์คํํ๋ฉด click ์์ 2>ํจ์
๊ฐ ์์ด๊ณ ๊ทธ ํจ์ ๋ด๋ถ์์ ์ฝ์๋ก๊ทธ ์ฐ์ผ๋ฉด ํจ์ ๋ฐ๋ก ์์ 3>์ฝ์๋ก๊ทธ ํจ์
๊ฐ ์์ธ๋ค.
์ดํ ์คํ ์์๋ ๊ฐ์ฅ ์๋จ์ 3>์ฝ์๋ก๊ทธ
๋ฅผ ์คํํ์ฌ ๋ฆฌํดํ ๋ค ๋น ์ง๊ฒ๋๊ณ 2>ํจ์
๋ฅผ ๋ฆฌํดํด์ ๋น ์ง ๋ค 1>click
๋ฆฌํดํ ๋ค ๋น ์ง๊ฒ ๋๋ฉด ๋น์ด์๋Call Stack
์ผ๋ก ๋์๊ฐ๋ค.- ์ดํ
Event Loop
๋Queue
์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๋๊น์ง ๊ณ์ ํ์ธ์ ํ๋ค.
<script> //1. main ํจ์๋ queue์์ call stack์ผ๋ก ์ด๋ function yo(){ //2. yo ํจ์๋ main ํจ์ ์๋จ์ผ๋ก ์ฌ๋ผ๊ฐ (call stack) setTimoust(function(){ // 3. setTiemout ํจ์: ์ธ๋ถ ๋๊ธฐํจ console.log('1.5์ด ํ์ด๋จธ ๋!') }, 1500); for(let i=0;i<3;i++){ // 4, 5. doSomething ํธ์ถ๊ณผ ์ฝ์ ๋ก๊ทธ ๋ฐ๋ณต /** 4. for๋ฌธ ๋ด๋ถ doSomething () ํจ์๋ yoํจ์ ์๋จ์ผ๋ก ์ด๋(call stack) doSomething(); 5. console.log(i) ํจ์๋ doSomething ๋ฆฌํด๋๋ฉด yo ํจ์ ์๋จ์ผ๋ก ์ด๋(call stack) ** // console.log(i) } console.log('3์ด ๊ฑธ๋ฆฌ๋ for๋ฌธ ๋!') } yo(); console.log('main ๋!') </script>
- ๊ฐ์ฅ ๋จผ์ 1>
Queue
์ main ํจ์๊ฐ ๋ค์ด๊ฐ๊ณ main ํจ์๋ฅผ ์คํ์ ์ํด ์์๋๋ 2>Call Stack
์ ์ง์ด๋ฃ๋๋ค.
- main ํจ์์์ ์คํ๋ yo ํจ์๊ฐ main ํจ์ ์๋จ์ผ๋ก 2>
call stack
์ ์ฌ๋ผ๊ฐ๋ค.
- setTiemout ํจ์๋ ์ธ๋ถ, (ํ๊ฒฝ์ ๋ฐ๋ฅธ ํธ์คํธ ๊ฐ์ฒด์ธ Web API) ์ฆ ๋ธ๋ผ์ฐ์ ์์ ์๋ ํจ์๋ก ์ธ๋ถ ํจ์ setTiemout์๊ฒ function์ ๋๊ฒจ์ฃผ๋ฉด์ 1.5 ์ด๋ค์ ์ฝ์์ ์คํํ๋ผ๊ณ ์๋ ค์ค๋ค.
- for ๋ฌธ์ ๋๋ฉฐ doSomething() ํจ์๊ฐ ์คํ๋์ด 1์ด๊ฐ ์ง๋๊ฐ๊ณ ์ดํ ์ฝ์๋ก๊ทธ์ i๋ฅผ ์ฐ๋ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- 2>
call stack
์์ ์ผํ๋ ๋์(๋ฐ๋ณต๋ฌธ ์คํ) 1.5์ด๊ฐ ์ง๋๋ฉด ๋ setTiemout ํจ์๋ฅผQueue
์ ๋ฃ๊ณ ์ดํ setTiemout ํจ์๋Call Stack
์ด ์คํ์ ๋ง์น ๋๊น์ง ๋๊ธฐ ์ํ์ ๋จธ๋ฌธ๋ค.
- for ๋ฌธ์ ํจ์ ํธ์ถ(// 3์ด ๊ฒฝ๊ณผ ํ)๊ณผ ํ์๋ฅผ ๋ด์ ์ฝ์์ด ๋ชจ๋ ์ฐํ๋ ๋ฆฌํด์ ๋ฐ๋ณตํ ๋ค(// 0,1,2)
Call Stack
์๋จ์์ ๋น ์ ธ for ๋ฌธ์ ๋น ์ ธ๋์ค๋ฉด ('3์ด ๊ฑธ๋ฆฌ๋ for๋ฌธ ๋!) ๋ก๊ทธ๊ฐ ์คํ๋ ๋ค ๋ฆฌํด๋๋ฉฐCall Stack
์์ ์ ๊ฑฐ๋๋ค.
- ์ดํ
Call Stack
์ ๋จ์์๋ ๋ง์ง๋ง main ํจ์์์('main ๋!') ๋ก๊ทธ๊ฐ ์ฐํ๋ฉด์ main ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด์Call Stack
์ด ๋น ์ํ๊ฐ ๋๋ค.
- ์ด์ ์์ผ
Queue
์ ์๋ setTiemout ํจ์๋ฅผCall Stack
์ผ๋ก ์ฎ๊ฒจ ์คํํ๋ฉฐ ๋ง์ง๋ง์ผ๋ก ('1.5์ด ํ์ด๋จธ ๋!')๋ก๊ทธ๋ฅผ ์ฐ์ ๋ค ๋ฆฌํด๋๋ฉฐCall Stack
์์ ์ ๊ฑฐ๋๋ค.
Call Stack
์ ํ๋์ด๊ธฐ์ ํ๋ ์ผ์ ๋ฉ์ถ์ง ๋ชปํ๋ค.- ์๋ฐ์คํฌ๋ฆฝํธ์
ํ์ด๋จธ ํจ์
๋Call Stack
์ด ์คํ(์ผํ๋)๋๋ ๋์ ์ง์ ๋๋ ์ด ์๊ฐ ๋ค์Queue
์ ํ์ด๋จธ๋ก ๋๊ฒจ์ค ํจ์๋ฅผ ๋ฃ.์ด.์ค.๋ฟ.์ด.๋ค.
-Call Stack
์ด ํ๋ ์ผ์ ๋ชจ๋ ๋ง์ณ(์ฝ๋์ ์คํ์ด ์๋ฃ)Call Stack
๋ด๋ถ๊ฐ ๋น์ด์ ธ์์ด์ผQueue
์ ๋๊ธฐํ๋ ํ์ด๋จธ๊ฐCall Stack
์ผ๋ก ์ฌ๋ผ๊ฐ ์คํ ๋ ์ ์๋ค
- ์ฝ๋์ข ๋ - https://www.youtube.com/watch?v=iNH4UQxZexs