settimeout vs setinterval - Lee-hyuna/33-js-concepts-kr GitHub Wiki
์๋ฌธ: setTimeout VS setInterval
์ฐ์ ์ด ์ฃผ์ ์ ๋ํด ์๊ฒฌ์ด ๋ถ๋ถํ๋ค๋ ๊ฒ์ ๋งํ๊ณ ์ถ๋ค. ๊ทธ๋๋ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๊ฒ๋ค์ ๊ฝค ๋ง์ ์ฌ์ค์ ๊ธฐ๋ฐํ๋ค. ์ด ๋ฌธ์์ ์๋ ๋ชจ๋ ๊ฒ๋ค์ ๋ด ๊ฐ์ธ์ ์ธ ๊ฒฝํ์ ๊ธฐ๋ฐํ๋ค.
๋ํ ์ด ๋ฌธ์๊ฐ window.requestAnitaionFrame()์ ์ฐ๊ด๋๋ฉด ์๋๋ค๋ ๊ฒ์ ์์์ผํ๋ค. setTimeout์ด๋ setInterval ๋์ window.requestAnitaionFrame์ ์ฌ์ฉํ ์ ์๋ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋ค๊ณ ํด๋, ๊ทธ๊ฒ์ DOM ๋ฆฌํ์ธํธ์ ๋งค์ฐ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋์ด ์๋๋ฐ, ์ด์์ ์ผ๋ก๋ ์ด๋น 60ํ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์, ์ด๋ค ์ฝ๋๊ฐ ์ผ๋ง๋ ์์ฃผ ์คํ๋์ด์ผํ๋์ง์ ๋ํ ์ ์ด๊ฐ ์ด๋ ต๋ค.
๋ฉฐ์น ์ ๋ด ์น๊ตฌ๊ฐ ๋์๊ฒ ๋ฌผ์๋ค.
ํ์ด๋จธ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํด?
์์งํ ๋งํ๋ฉด ๋๋ ๊ทธ ๊ณ ํต์ ์ฆ์ ๋ ์ฌ๋ ธ๋ค... ์ด ์ ๊ณ์์ ์ผํ ๋์, ๋๋ถ๋ถ์ ์ํฉ์ ๊ฐ์ธ์ ์ธ ๊ฒฝํ๊ณผ ์ฐ๊ด์ํฌ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์ด๋ฆฌ๊ณ ์ด๋ฆฌ์์๋ ๋์, ๋ด๊ฐ ์ซ์ดํ๋ ํ ๋จ์๊ฐ ๋์๊ฒ ์ด๋ ๊ฒ ๋งํ์ต๋๋ค.
์ฝ๋๋ฅผ ์คํํ ํ์ด๋จธ๋ฅผ ์ค์ ํ์ง ๋ง. ๋์ ์ด๋ค ๋ณํ๊ฐ์์ ๋ ๋งํ๊ณ ๋ฐ์ํด์ผํ๋์ง ๋ค์ด์ผํด (listen)
๋๋ ์๊ฒ ์ต๋๋คํ๊ณ ๊ทธ ๋ฐฉ์ ๋ ๋ฌ๋ค. ๊ทธ๊ฐ ๋งํ ๊ฒ์ ์ฆ์ ์์ด ๋ฒ๋ ธ๋ค. ๋ด๊ฐ ๊ทธ ๋จ์๋ฅผ ์ข์ํ์ง ์๋๋ค๋ ๊ฒ์ ์๊ธฐ ๋๋ฌธ์ ...
๋๋ ์ฌ๋ฌ๋ถ๋ค์ด ํ์ด๋จธ ์์ด ์๊ณ๋ฅผ ๊ตฌํํ ์ ์๋ค๊ณ ์๊ฐํ๋ค.
ํ์ด๋จธ๋ ๋๋ถ๋ถ์ ๋ฌผ๊ฑด๋ค ์ฒ๋ผ ๋จ์ฉ๋๊ณ ์๋ค. ์ด๋ค ์ฝ๋ ๋ฒ ์ด์ค๋ฅผ ๋ณผ๋, ์ด๋ค ํ๋ก๊ทธ๋งน ์ธ์ด์ ๋ฌธ๋ฒ์ด๋ ์ ํ์ฌํญ์ ๋ณด์ง ์๋๋ค. ๋์ ์ฝ๋๋ฅผ ์์ฑํ ๊ฐ๋ฐ์๊ฐ ์ด๋ป๊ฒ ์๊ฐํ๋ํ๋์ง ์ ์ ์๋ค.
๋คํ์ธ ์ ์ 99% ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค์ด ์ด๋ฏธ ํ์ด๋จธ ๋ณด๋ค ๋ ์ข์ ๊ฒ์ ์๊ณ ์์ผ๋ฉฐ, ๊ทธ๊ฒ๋ค์ ์ธ์ ์ฌ์ฉํด์ผํ๋์ง ์๊ณ ์๋ค.
window.onload = () => {
// see, here you waited for signal from the browser
};
interval์ ์์ ์ ๋ด๊ฐ ๋ง์ด ์ฐ๋ ๊ฒ์ด์๋ค. ์ ๊ธฐ์ ์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ํด์ผํ ๋ ๋ง๋ค setInterval()์ ์ฌ์ฉํ๊ณค ํ๋ค. ์ ๋์ํ์๋ค. ์ด๊ฒ์ด ์ง์ฅ์ผ๋ก ๋ณํ๊ธฐ ์ ๊น์ง๋...
์ผ๋จ interval์ ์ค์ ํ๋ฉด, interval์ ์ง์ฐ๊ฑฐ๋ ํ์ฌ ์ธ์ ์ด ๋๋ ๋๊น์ง interval์ ๊ณ์ ํ๋ก์ธ์ค๋ก ์กด์ฌํ ๊ฒ์ด๋ค.
setInterval์ ์ฝ๋๊ฐ ์ ํํ ๊ฐ๊ฒฉ์ผ๋ก ์ฝ ์คํ์ ์ ๋ฌ๋ ๊ฒ์ ๋ณด์ฅํ๋ค. ์ด๋ ๊ฐ interval ์ฌ์ด์ ์๊ฐ์ด ํญ์ ๋์ผํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. *
์ ๊น, ๊ทธ๊ฑด ๋ด ์ฝ๋๊ฐ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์คํ๋๋ค๋ ๋ป์ธ๊ฐ?
์๋. setInterval API๋ ํจ์๋ฅผ ์ฝ์คํ์ ์ ๊ณตํ ๊ฒ์ด๋ค. ํจ์์ ์คํ์ ์ฌ๋ฌ ๊ฐ์ง ์์ธ์ ๋ฌ๋ ค ์๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก๋ ํญ์ ์ฝ๊ฐ์ ์ง์ฐ์ด ์์ ๊ฒ์ด๋ค.
Javascript ์ฑ์ ๋ธ๋ผ์ฐ์ ๋ด์์ ์๋ํ๋ค. ์ด๋ setInterval์ ์ง์ฐ์ด ์๊ฐ์ ๋ฐ๋ผ ์ฆ๊ฐํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.(๋๋ ๋จ์ง ๋ณํํ ๋ฟ์ด๋ค). ์ด๋ฌํ ๋์์ ํ๋ ๋ช๊ฐ์ง ์ด์ ๊ฐ ์๋ค.
- ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ์ฅ์น์ ํ๋์จ์ด ์ ํ
- ์ฑ์ด ๋ธ๋ผ์ฐ์ ์ ๋นํ์ฑ ํญ์์ ์คํ๋๋๋ก ๋ฐฉ์น
- ์ต์ ํ๋์ง ์์ ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค
์ธ๊ธ๋ ๋ชจ๋ ๊ฒ์ ์๋ ์ด๋ฏธ์ง์ ์ค๋ช ๋ ์ํฉ์ ์ด๋ํ ์ ์๋ค.
**dummyMethod1()**์ ์คํ์ ์ ์ ์๋ ์ด์ ๋ก ์ธํด ์์๋ณด๋ค ์ค๋ ๊ฑธ๋ ธ๋ค. Javascript ์ด๋ฒคํธ ๋ฃจํ์ ํน์ฑ ๋๋ฌธ์ ์ฝ์คํ์ ๊ฑธ๋ ธ๋ค(got stuck). ์ฆ, ๋ค๋ฅธ ๋ฉ์๋๋ค์ ์คํ๋๊ธฐ ์ํด์ ๊ธฐ๋ค๋ ค์ผ ํ ๊ฒ์ด๋ค...
๋ด๊ฐ ๋งํ๋ ๊ฑฐ ๊ธฐ์ต๋? "์ง์ฅ์ผ๋ก ๋ณํ ๋๊น์ง ์ ๋๋ค"๊ณ ๋งํ๋ค.
์ด์ clockTimer ๋ฉ์๋๊ฐ ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ํต์ ํ ์ ์๋ interval ์์์ 3๋ฒ ์คํ๋ ๊ฒ์ด๋ค. (๋ ๋ง์ด ์คํ๋ ์ง๋). ์ด๋ฌํ ์ผ์ด ๋ฐ์๋๋ ์ด์ ๋ ํ์ด๋จธ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ setInterval์ ์ฝ ์คํ์ ๋ฌด์์ ์ ๋ฌํ๋์ง ์ ํ ์์ง ๋ชปํ๋ค. setInterval์ ์ ํด์ง ์๊ฐ์ ์ฝ์คํ์ ์ ๋ฌํ๋๊ฒ ๋์ด๋ค.
์ด์์ ์ธ ํ๊ฒฝ์์ setInterval์ ๊ฝค ๋ฉ์ง๊ฒ ๋ณด์ธ๋ค. ํ์ง๋ง ๋ธ๋ผ์ฐ์ ์ Javascript๋ฅผ ์ผ๋ํ๋ค๋ฉด ๋ณ๋ก ๋ฉ์ง์ง ์๋ค.
* ์ด์ ์ฌ๋ฌ๋ถ์ ๋ด๊ฐ ๊ฑฐ๊ธฐ์ ๋ฌด์์ ์๋ฏธํ๋์ง ์ ์ ์๋ค, (setInterval์ ๋น์ ์ ์ฝ๋๊ฐ ์ ํํ ๊ฐ๊ฒฉ์ผ๋ก ์ฝ์คํ์ ์ ๋ฌ๋จ์ ๋ณด์ฅํ๋ค). ์ค์ ์ฝ๋ ์คํ ์๊ฐ์ setInterval๊ณผ ์๋ฌด ๊ด๋ จ์ด ์๋ค.
์ฌ๊ท(recursion)์ ๋ด์ฉ๊ณผ Javascript์์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅผ ๊ฒฝ์ฐ, ์ง๊ธ์ด ์์๋ณด๊ธฐ์ ์๋ฒฝํ ์๊ฐ์ด๋ค: ์ฌ๊ท๋ ๋ฌด์์ธ๊ฐ?
** setTimeout๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ setInterval์ ํ๋ฒ๋ง ํธ์ถํ๋ ๊ฒ๊ณผ ๊ฐ๋ค **
setTimeout์ ์ฌ์ฉํ์ฌ ์ผ๋ถ ์ฝ๋์ ์คํ์ ๋ค๋ฅธ ์๊ฐ์ผ๋ก ์ฐ๊ธฐํ ์ ์๋ค. ํ์ง๋ง ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ฝ๋๋ฅผ ์คํํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํ ๊น? setInterval๋ถํฐ ์์ํ๋๋ฐ ์ด์ ๊ฐ ์์๋ค.
์ด ๊ฒฝ์ฐ ์ฌ๊ท setTimeout์ ์ฌ์ฉํ๋ผ. ์ ํํ ๊ฐ๊ฒฉ์ผ๋ก ๋น์ ์ ์ฝ๋๊ฐ ์คํ๋ ๊ฒ์ด๋ผ๊ณ ๋ ์ฌ์ ํ ๋ณด์ฅํ ์ ์๋ค.(๋ด๊ฐ setInterval์ ๋ํด ๊ธ์ ์ธ๋ ์ง์ ํ๋๊ณผ ๊ฐ์ ๋ฌธ์ ๋ก). ๊ทธ๋ฌ๋ ์ฝ์คํ์์ ๋์ผํ ๋ฉ์๋๊ฐ ์ฌ๋ฌ ๋ฒ ๋์ค๋ ์๋๋ฆฌ์ค๋ ์ ๋๋ก ์๊ธฐ์ง ์๋๋ค.
setTimeout๊ณผ ํจ๊ป ์ฌ๊ท ์์ ์ ๊ตฌํํ๋ฉด, ๋ ์ข์ setInterval์ ์ป์ ์ ์๋ค.
์ด ์๋๋ฆฌ์ค์์ clockTimer()๋ฅผ ์ฝ ์คํ์ ์ ๋ฌํ๊ธฐ ์ํ ๊ฒฐ์ ์ setTimeout์ผ๋ก ์ฒ๋ฆฌ๋์ง ์๋๋ค. (setInterval์ ๊ฒฝ์ฐ์ฒ๋ผ). ๋์ ์ ๋ฐ๋๋ค. ์ฌ๊ท setTimeout์ ๊ตฌํํ clockTimer ์์ฒด๋ ๋ค์ ํจ์์ ํธ์ถ์ ๋ด๋นํ๋ค. setTimeout์ ๋จ์ง ๋ค์ ์คํ์ ์ง์ฐ์ํค๊ธฐ ์ํด ์กด์ฌํ๋ค. ๋ฐ๋ผ์ ๊ฐ๊ฒฉ(interval)์ ์์ฑํ๋ค.
๊ทธ๋ฌํ ๋ฐฉ์์ผ๋ก ์ฐ๋ฆฌ๋ ๋ค์ ํธ์ถ ๋๋ ๋ ์ ๋งํ์๋ฉด, ์ฝ์คํ์ ๋ค์ ์คํํ ๋ฉ์๋๋ ํ์ฌ ๋ฉ์๋์ ์คํ ํ์ ์ ํํ 1000ms (์ด ์์์) ์ํ๋ ๊ฒ์ด๋ผ๊ณ ํ์ ํ๋ค.
์ฌ๊ท setTimeout์ ์ฌ์ฉํ๋ฉด ์ฐ๋ฆฌ์ ๋ฉ์๋๊ฐ ์์ ํ ์คํ๋ ๋๊น์ง, ๋ค๋ฅธ ์คํ์ด ๋ฐ์ํ์ง ์๋๋ค.
setInterval์ ์ฌ์ฉํ ๋๋ ๋ถ๋ช ํ ์ผ์ด๋ ์ ์๊ณ ์๋ง๋ ์ผ์ด๋ ๊ฒ์ด๋ค.
๋์ผ๋ก ๋๋ ์ด ๊ธ์ด setInterval์ด ๊ถ๊ทน์ ์ผ๋ก ๋์ ์ ํ์ด๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํ ๊ฒ์ด ์๋์๋ค๋ ์ ์ ์ง์ ํ๊ณ ์ถ๋ค. ์ฌ๋ฌ๋ถ์ด ์์์ผ ํ ๊ฒ์ setInterval์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ๊ฒ์ด๊ณ , ์ด๊ฒ์ ํฅํ ๋๋ฒ๊น ๊ณผ ์ ๋ฐ์ ์ธ ์์ฌ๊ฒฐ์ ์ ๋์์ด ๋ ๊ฒ์ด๋ค.