[JavaScript] setTimeout๊ณผ setInterval
์ถ์ฒ :: ์ค์ผ์ค๋ง: setTimeout๊ณผ setInterval
์ผ์ ์๊ฐ์ด ์ง๋ ํ์ ์ํ๋ ํจ์๋ฅผ ์์ฝ ์คํ(ํธ์ถ)ํ ์ ์๊ฒ ํ๋ ๊ฒ์ "ํธ์ถ ์ค์ผ์ค๋ง(scheduling a call)"์ด๋ผ ํ๋ค. ํธ์ถ ์ค์ผ์ค๋ง์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์๋ค.
-
setTimeout
:: ์ผ์ ์๊ฐ์ด ์ง๋ ํ์ ํจ์๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ. -
setInterval
:: ์ผ์ ์๊ฐ ๊ฐ๊ฒฉ์ ๋๊ณ ํจ์๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ.์๋ฐ์คํฌ๋ฆฝํธ ๋ช ์ธ์์
setTimeout
๊ณผsetInterval
๊ฐ ๋ช ์๋์ด ์์ง ์๋ค. ํ์ง๋ง ์์ค์ ๋์์๋ ๋ชจ๋ ๋ธ๋ผ์ฐ์ , Node.js๋ฅผ ํฌํจํ ์๋ฐ์คํฌ๋ฆฝํธ ํธ์คํธ ํ๊ฒฝ ๋๋ถ๋ถ ์ด์ ์ ์ฌํ ๋ฉ์๋์ ๋ด๋ถ ์ค์ผ์ค๋ฌ๋ฅผ ์ง์ํ๋ค.
setTimeout
๋ฌธ๋ฒ ::
let timerId = setTimeout(func|code, [delay], [arg1], [arg2], ...)
๋งค๊ฐ๋ณ์ ::
func|code
์คํํ๊ณ ์ ํ๋ ์ฝ๋. ํจ์ ๋๋ ๋ฌธ์์ด ํํ์ด๋ค. ๋๊ฐ๋ ์ด ์๋ฆฌ์ ํจ์๊ฐ ๋ค์ด๊ฐ๋ค. ํ์ ํธํ์ฑ์ ์ํด ๋ฌธ์์ด๋ ๋ฐ์ ์ ์๊ฒ ํด๋์์ผ๋, ์ถ์ฒํ์ง๋ ์๋๋ค.
delay
์คํ ์ ๋๊ธฐ ์๊ฐ(์ง์ฐ ๊ฐ๊ฒฉ)์ผ๋ก, ๋จ์๋ ๋ฐ๋ฆฌ์ด(millisecond, 100๋ฐ๋ฆฌ์ด = 1์ด)์ด๋ค. ๊ธฐ๋ณธ๊ฐ์ 0.
arg1
, arg2
...
ํจ์์ ์ ๋ฌํ ์ธ์๋ค๋ก, IE9 ์ดํ์์ ์ง์ํ์ง ์๋๋ค.
์์ ::
์๋ ์ฝ๋๋ฅผ ์คํํ๋ฉด 1์ด ํ sayHi()
๊ฐ ํธ์ถ๋๋ค.
function sayHi() {
alert('Hello');
}
setTimeout(sayHi, 1000);
์๋์ ๊ฐ์ด ํจ์์ ์ธ์๋ฅผ ๋๊ฒจ ์ค ์ ์๋ค.
function sayHi(phrase, who) {
alert(phrase + ', ' + who);
}
setTimeout(sayHi, 1000, 'Hello', 'John'); // Hello, John
setTimeout
์ ์ฒซ ๋ฒ์งธ ์ธ์๊ฐ ๋ฌธ์์ด์ด๋ฉด, ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด ๋ฌธ์์ด์ ์ด์ฉํด ํจ์๋ฅผ ๋ง๋ ๋ค.
setTImeout('alert("Hello")', 1000);
ํ์ง๋ง ๋ฌธ์์ด ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์ถ์ฒํ์ง ์๋๋ค. ์๋์ ๊ฐ์ด ์ฌ์ฉํ์.
setTimeout(function() { alert('Hello') }, 1000);
// ๋๋ ํ์ดํํจ์
setTimeout(() => alert('Hello'), 1000);
โ๏ธํจ์๋ฅผ ์คํํ์ง ๋ง๊ณ ๋๊ธฐ์.
์ด๋ณด๊ฐ๋ฐ์๋
setTimeout
์ ํจ์๋ฅผ ๋๊ธธ ๋, ํจ์ ๋ค์()
์ ๋ถ์ด๋ ์ค์๋ฅผ ํ๋ค.// ์๋ชป๋ ์ฝ๋ setTimeout(sayHi(), 1000);
setTimeout
์ ํจ์์ ์ฐธ์กฐ๊ฐ์ ๋ฐ๋๋ค. ๊ทธ๋ฐ๋ฐsayHi()
๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ฉด ํจ์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ ๋ฌ๋์ด ๋ฒ๋ฆฐ๋ค.sayHi()
์๋ ๋ฐํ๋ฌธ์ด ์๊ธฐ ๋๋ฌธ์ ์คํ ๊ฒฐ๊ณผ๋undefined
์ผ๋ก ๋์จ๋ค.setTimeout
์ ์ค์ผ์ค๋งํ ๋์์ ์ฐพ์ง ๋ชปํด, ์ํ๋ ๋๋ก ์ฝ๋๊ฐ ๋์ํ์ง ์๋๋ค.
clearTimeout์ผ๋ก ์ค์ผ์ค๋ง ์ทจ์ํ๊ธฐ
setTimeout
์ ํธ์ถํ๋ฉด "ํ์ด๋จธ ์๋ณ์(timer identifier)"๊ฐ ๋ฐํ๋๋ค. ์ค์ผ์ค๋ง์ ์ทจ์ํ๊ณ ์ถ์ ๋ ์๋ณ์(์๋ ์์์์ timerId
)๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
let timerId = setTImeout(() => alert('์๋ฌด๋ฐ ์ผ๋ ์ผ์ด๋์ง ์๋๋ค.'), 1000);
alert(timerId); // ํ์ด๋จธ ์๋ณ์
clearTimeout(timerId);
alert(timerId); // ์ ํ์ด๋จธ ์๋ณ์์ ๋์ผํจ.(์ทจ์ ํ์๋ ์๋ณ์์ ๊ฐ์ null์ด ๋์ง ์๋๋ค.)
์์๋ฅผ ์คํํ๋ฉด alert
์ฐฝ์ด 2๊ฐ ๋จ๋๋ฐ, ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ํ์ด๋จธ ์๋ณ์๊ฐ ์ซ์๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
๋ค๋ฅธ ํธ์คํธ ํ๊ฒฝ์์ ํ์ด๋จธ ์๋ณ์๊ฐ ์ซ์ํ ์ด์ธ์ ์๋ฃํ์ผ ์๋ ์๋ค. Node.js์์๋ setTimeout
์ ์คํํ๋ฉด ํ์ด๋จธ ๊ฐ์ฒด๊ฐ ๋ฐํ๋๋ค.
์ค์ผ์ค๋ง์ ๊ดํ ๋ช ์ธ๋ ๋ฐ๋ก ์กด์ฌํ์ง ์๋๋ค. ๋ช ์ธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํธ์คํธ ํ๊ฒฝ๋ง๋ค ์ฝ๊ฐ์ ์ฐจ์ด๊ฐ ์์ ์ ๋ฐ์ ์๋ค.
์ฐธ๊ณ ๋ก ๋ธ๋ผ์ฐ์ ๋ HTML5์ timers section์ ์ค์ํ๊ณ ์๋ค.
setInterval
setInterval
๋ฉ์๋๋ setTimeout
๊ณผ ๋์ผํ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ค.
let timerId = setInterval(func|code, [delay], [arg1], [arg2], ...)
์ธ์ ์ญ์ ๋์ผํ๋, setTimeout
์ด ํจ์๋ฅผ ๋จ ํ๋ฒ๋ง ์คํํ๋ ๊ฒ๊ณผ ๋ฌ๋ฆฌ, setInterval
์ ํจ์๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํํ๋ค.
ํจ์ ํธ์ถ์ ์ค๋จํ๋ ค๋ฉด clearInterval(timerId)
์ ์ฌ์ฉํ๋ค.
์๋ ์์ ๋ฅผ ์คํํ๋ฉด ๋ฉ์ธ์ง๊ฐ 2์ด ๊ฐ๊ฒฉ์ผ๋ก ๋ณด์ฌ์ง๋ค๊ฐ 5์ด ์ดํ์๋ ๋ ์ด์ ๋ฉ์ธ์ง๊ฐ ๋ณด์ด์ง ์๋๋ค.
// 2์ด ๊ฐ๊ฒฉ์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด์ฌ์ค
let timerId = setInterval(() => alert('tick'), 2000);
// 5์ด ํ์ ์ ์ง
setTimeout(() => { clearInterval(timerId); alert('stop'); }, 5000);
โ๏ธ
alert
์ฐฝ์ด ๋ ์๋๋ผ๋ ํ์ด๋จธ๋ ๋ฉ์ถ์ง ์๋๋ค.ํฌ๋กฌ๊ณผ ํ์ด์ดํญ์ค๋ฅผ ํฌํจํ ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ๋
alert / confirm / prompt
์ฐฝ์ด ๋ ์๋ ๋์์๋ ๋ด๋ถ ํ์ด๋จธ๋ฅผ ๋ฉ์ถ์ง ์๋๋ค.์ ์์ ๋ค์ ์คํํ๊ณ ์ฒซ ๋ฒ์งธ
alert
์ฐฝ์ด ๋ด์ ๋ ๋ช ์ด๊ฐ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ์ฐฝ์ ๋ซ์ผ๋ฉด, ๋ ๋ฒ์งธalert
์ฐฝ์ด ๋ฐ๋ก ๋ํ๋๋ ๊ฒ์ ๋ณด๊ณ ์ด๋ฅผ ํ์ธ ํ ์ ์๋ค. ๋ช ์ํ ์ง์ฐ ์๊ฐ 2์ด๋ณด๋คalert
์ฐฝ ๊ฐ๊ฒฉ์ด ์งง์์ง๋ค.
์ค์ฒฉ setTimeout
๋ฌด์ธ๊ฐ๋ฅผ ์ผ์ ๊ฐ๊ฒฉ์ ๋๊ณ ์คํํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋ค.
ํ๋๋ setInterval
์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ ์๋ ์์์ ๊ฐ์ด ์ค์ฒฉ setTimeout
์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค.
/* setInterval์ ์ด์ฉํ์ง ์๊ณ ์๋์ ๊ฐ์ด ์ค์ฒฉ setTimeout์ ์ฌ์ฉํจ */
// let timerId = setInterval(() => alert('tick'), 2000);
let timerId = setTimeout(function tick() {
alert('tick');
timerId = setTimeout(tick, 2000); // (*)
}, 2000);
// 2์ด๋ง๋ค ๋ฐ์
setTimeout
์ (*)
๋ก ํ์ํ ์ค์ ์คํ์ด ์ข
๋ฃ๋๋ฉด ๋ค์ ํธ์ถ์ ์ค์ผ์ค๋งํ๋ค.
์ค์ฒฉ setTimeout
์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ setInterval
์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ณด๋ค ์ ์ฐํ๋ค. ํธ์ถ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ํธ์ถ์ ์ํ๋ ๋ฐฉ์์ผ๋ก ์กฐ์ ํด ์ค์ผ์ค๋ง ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
5์ด๊ฐ๊ฒฉ์ผ๋ก ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด ๋ฐ์ดํฐ๋ฅผ ์ป๊ณ ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์๋ฒ๊ฐ ๊ณผ๋ถํ์ํ๋ผ๋ฉด ์์ฒญ ๊ฐ๊ฒฉ์ 10์ด, 20์ด, 40์ด ๋ฑ์ผ๋ก ์ฆ๊ฐ์์ผ์ฃผ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ค. ์๋๋ ์ด๋ฅผ ๊ตฌํํ ์์ฌ ์ฝ๋์ด๋ค.
let delay = 5000;
let timerId = setTimeout(function request() {
// .. ์์ฒญ ๋ณด๋ด๊ธฐ ..
if(/* ์๋ฒ ๊ณผ๋ถํ๋ก ์ธํ ์์ฒญ ์คํจ */) {
// ์์ฒญ ๊ฐ๊ฒฉ์ ๋๋ฆฐ๋ค.
delay *= 2;
}
timerId = setTimeout(request, delay);
}, delay);
CPU ์๋ชจ๊ฐ ๋ง์ ์์
์ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํํ๋ ๊ฒฝ์ฐ์๋ setTimeout
์ ์ฌ๊ท ์คํํ๋ ๋ฐฉ๋ฒ์ด ์ ์ฉํ๋ค. ์์
์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ฐ๋ผ ๋ค์ ์์
์ ์ ๋์ ์ผ๋ก ๊ณํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ค์ฒฉ
setTimeout
์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ์ง์ฐ๊ฐ๊ฒฉ์ ๋ณด์ฅํ๋,setInterval
์ ์ด๋ฅผ ๋ณด์ฅํ์ง ์๋๋ค.
์๋ ๋ ์์๋ฅผ ๋น๊ตํด๋ณด์. ์ฒซ๋ฒ์งธ๋ setInterval
์ ์ด์ฉํ์๋ค.
let i = 1;
setInterval(function() {
func(i++);
}, 100);
๋ ๋ฒ์งธ ์์์์ ์ค์ฒฉsetTimeout
์ ์ด์ฉํ๋ค.
let i = 1;
setTimeout(function run() {
func(i++);
setTimeout(run, 100);
}, 100);
setInerval
์ ์ด์ฉํ ์์์์ , ๋ด๋ถ ์ค์ผ์ค๋ฌ๊ฐ func(i++)
๋ฅผ 100๋ฐ๋ฆฌ์ด๋ง๋ค ์คํํ๋ค.

setInterval
์ ์ฌ์ฉํ๋ฉด func
ํธ์ถ ์ฌ์ด์ ์ง์ฐ ๊ฐ๊ฒฉ์ด ์ค์ ๋ช
์ํ ๊ฐ๊ฒฉ(100ms)๋ณด๋ค ์งง์์ง๋ค.
func
์ ์คํํ๋๋ฐ "์๋ชจ๋๋" ์๊ฐ์ด ์ง์ฐ ๊ฐ๊ฒฉ์ ํฌํจ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฐ ์ผ์ด ๋ฐ์ํ๋ค. ์ง๊ทนํ ์ ์์ ์ธ ๋์์ด๋ผ ํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ func
์ ์คํํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๋ช
์์ ์ง์ฐ ๊ฐ๊ฒฉ๋ณด๋ค ๊ธธ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ด๋ฐ ๊ฒฝ์ฐ ์์ง์ด func
์ ์คํ์ด ์ข
๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ค๋ค. func
์ ์คํ์ด ์ข
๋ฃ๋๋ฉด ์์ง์ ์ค์ผ์ค๋ฌ๋ฅผ ํ์ธํ๊ณ , ์ด๋ ์ง์ฐ ์๊ฐ์ด ์ง๋ฌ์ผ๋ฉด ๋ค์ ํธ์ถ์ ๋ฐ๋ก ์์ํ๋ค.
ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด delay
๋ฐ๋ฆฌ์ด๋ณด๋ค ๊ธธ๋ฉด, ๋ชจ๋ ํจ์๊ฐ ์ผ ์์ด ๊ณ์ ์ฐ์ ํธ์ถ๋๋ค.
์ด์ ๋ฐํด ์ค์ฒฉ, setTimeout
์ ์ด์ฉํ๋ฉด ์๋์ ๊ฐ์ด ์คํํ๋ฆ์ด ์ด์ด์ง๋ค.

์ค์ฒฉ setTimeout
์ ์ฌ์ฉํ๋ฉด ๋ช
์ํ ์ง์ฐ(์ฌ๊ธฐ์๋ 100ms)์ด ๋ณด์ฅ๋๋ค.
์ด๋ ๊ฒ ์ง์ฐ ๊ฐ๊ฒฉ์ด ๋ณด์ฅ๋๋ ์ด์ ๋ ์ด์ ํจ์์ ์คํ์ด ์ข ๋ฃ๋ ์ดํ์ ๋ค์ ํจ์ ํธ์ถ์ ๋ํ ๊ณํ์ด ์ธ์์ง๊ธฐ ๋๋ฌธ์ด๋ค.
โ๏ธ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ setInterval / setTimeout
setInterval
์ด๋setTimeout
์ ํจ์๋ฅผ ๋๊ธธ ๋, ํจ์์ ๋ํ ๋ด๋ถ ์ฐธ์กฐ๊ฐ ์๋กญ๊ฒ ๋ง๋ค์ด์ง๊ณ ์ฐธ์กฐ ์ ๋ณด๊ฐ ์ค์ผ์ค๋ฌ์ ์ ์ฅ๋๋ค. ๋ฐ๋ผ์ ํด๋น ํจ์๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ด ์์ด๋setInterval / setTimeout
์ ๋๊ธด ํจ์๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๋์์ด ๋์ง ์๋๋ค.// ์ค์ผ์ค๋ฌ๊ฐ ํจ์๋ฅผ ํธ์ถํ ๋๊น์ง ํจ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋๋ค. setTimeout(function() {...}, 100);
setInterval
์ ๋๊ฒจ์ฃผ๋ ํจ์๋clearInterval
์ด ํธ์ถ๋๊ธฐ ์ ๊น์ง ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋๋ค.๊ทธ๋ฐ๋ฐ ์ด๋ฐ ๋์ ๋ฐฉ์์๋ ๋ถ์์ฉ์ด ํ๋ ์๋ค. ํจ์๊ฐ ์ธ๋ถ ๋ ์์ปฌ ํ๊ฒฝ์ ์ฐธ์กฐํ๊ณ ์์ผ๋ฉด ํด๋น ํจ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๋ ๋์, ์ธ๋ถ ๋ณ์ ์ญ์ ๋ฉ๋ชจ๋ฆฌ์ ๋จ์์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ค์ ํจ์๊ฐ ์ฐจ์งํ์ด์ผ ํ๋ ๊ณต๊ฐ๋ณด๋ค ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์ฌ์ฉ๋๋ค. ์ด๋ฐ ๋ถ์์ฉ์ ๋ฐฉ์งํ๋ ค๋ฉด ์ค์ผ์ค๋งํ ํ์๊ฐ ์์ด์ง ํจ์๋ ์๋ฌด๋ฆฌ ์๋๋ผ๋ ์ทจ์ํด์ผ ํ๋ค.
์ถ๊ฐ ๋ด์ฉ
์๋ฐ์คํฌ๋ฆฝํธ ํ์ด๋ฐ ์ด๋ฒคํธ
1. delay์ ๋ํ์ฌ
์ธ๋ป ๋ณด๊ธฐ์๋ setInterval
๊ณผ setTimeout
ํจ์๋ ๋งค์ฐ ์ ์ฌํ ์ ์ด ๋ง๋ค. ๋ค๋ฅธ์ ์ด๋ผ ํ๋ฉด ๋ฐ๋ณต์คํ์ ํ๋๋, ํ ๋ฒ ์คํํ๋๋์ ์ ๋๋ก ๋ณด์ผ ์๋ ์๋ค ํ์ง๋ง ์ ๋ง ๋ค๋ฅธ ์ ์ ์ง์ฐ์๊ฐ(Delay)๊ณผ ๊ฐ ํจ์์ ์ฒ๋ฆฌ ๋ฐฉ์์ด๋ค.
1.1) setInterval
Real delay for setInterval is actually less than given. If the execution is impossible, it is queued. If the browser is busy, and the execution is already queued, setInterval skips it.
[์ถ์ฒ] Javascript Tutorial - Understanding timers: setTimeout and setInterval
์ค๋ช
ํ์๋ฉด setInterval
ํจ์์ ์ค์ ์ง์ฐ์๊ฐ์ ๊ฐ๋ฐ์๊ฐ ์ค ์๊ฐ๋ณด๋ค ์ค์ ์ ์ผ๋ก ์ ๋ค๋ ๋ป์ด๋ค. ๋ํ ์คํํ ์ ์๋ ์ํ๋ผ๋ฉด ํ์ ์ ์ฅ๋๋ค. ๋ํ ๋ง์ฝ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฒ๋ฆฌํ ์ ์๋ ์ํ(๋ฐ์ ์ํ)์ด๊ณ , ์ด๋ฏธ ํ์ ์ ์ฅ๋ ๊ฒ์ด ์๋ค๋ฉด setInterval
์ ๋ฌด์ํ๋ค.
๋ค์ ๋งํด์ setInterval
์ ์ง์ ๋ ์๊ฐ ๊ฐ๊ฒฉ๋งํผ ๋ฌด์กฐ๊ฑด ์ง์ ๋ ์ฝ๋๋ฅผ ํธ์ถํ๊ณ ์ ํ๋ค. ํ์ง๋ง ์ง์ ๋ ์๊ฐ ๊ฐ๊ฒฉ์ ๋๋ฌํ์์๋ ๋ถ๊ตฌํ๊ณ ์ง์ ๋ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ์ํ๋ผ๋ฉด setInterval
์ ์ด๋ฒคํธ๋ฅผ ํ(queue)์ ์ ์ฅํ๋ค.
์ฌ๊ธฐ์ ํ(queue)๋ฅผ ์กฐ๊ธ ๋ ์์ธํ ์์๋ณด์. setInterval
์์ ํ์ ํฌ๊ธฐ๋ 1์ด๋ค. ํ๋์ ์คํ๋ง์ ์ ์ฅํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ ์ ์ฅ๋ ๊ฒ์ด ์๋ค๋ฉด ์คํํด์ผํ ์๊ฐ ๊ฐ๊ฒฉ๊ณผ๋ ๊ด๊ณ ์์ด ์คํ ๊ฐ๋ฅํ ์ํ์ผ ๋, ์ฆ์ ํ์์ ์ด๋ฒคํธ๋ฅผ ๊บผ๋ด ์คํํ๊ฒ ๋์ด ์๋ค.
ํ์ง๋ง ์กฐ๊ธ ๋ ๊ผฌ์์ ์๊ฐํด๋ณด์. ์ ํด์ง ์๊ฐ์ 100ms๋ผ๊ณ ๊ฐ์ . ๊ทธ๋ฌ๋ฉด setInterval
์ด ์ฒ์ ์คํํ ๋๋ 100ms์๊ฐ๋์์ ์ง์ ๋ ์ฝ๋(A)๋ฅผ ์คํํ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ 200ms๋ผ๋ ์๊ฐ๋๊ฐ ๋๋ฉด ๋ค์ ํ๋ฒ ์ง์ ๋ ์ฝ๋(B)๋ฅผ ์คํํ๋ ค ํ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด์ ์ฝ๋(A) ์ง์ฐ ๋ฑ์ ์ด์ ๋ก ์คํํ ์ ์๋ ์ํ๋ผ๋ฉด setInterval
์ ํ์ฌ ์คํํ ์ฝ๋(B)๋ฅผ ํ์ ์ ์ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ 300ms๋ผ๋ ์๊ฐ๋๊ฐ ๋์ด ๋ค์ ์ง์ ๋ ์ฝ๋(C)๋ฅผ ์คํํ๋ ค ํ๋ค. ํ์ง๋ง ์ด์ ์ฝ๋(A๊ฐ ์์ง ๋๋์ง ์์ ์ํ์์ ํ์ ์ด๋ฏธ ์คํํ ์ฝ๋(B)๊ฐ ์ ์ ๋์ด ์๋ค๋ฉด setInterval
์ ํ์ฌ ์คํํ ์ฝ๋(C)๋ฅผ ๋ฌด์ํ๋ค.
setInterval
์ ์ ํด์ง ์๊ฐ ๊ฐ๊ฒฉ๋ด์์ ์ง์ ๋ ์ฝ๋๊ฐ ์คํ๋๋ ๊ฒฝ์ฐ ๊น๋ํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ ํจ์์ด๋ค.
ํ์ง๋ง ์ง์ ๋ ์ฝ๋๊ฐ ์ง์ฐ๋์ด ๋ค์ ์ด๋ฒคํธ ๋ฐ์์ํค๊ธฐ๊น์ง ์ํฅ์ ๋ผ์น๋ ๊ฒฝ์ฐ "๋ฌด์ ๋นํ๋ ์ด๋ฒคํธ"๊ฐ ์๊ธธ ์ผ๋ ค๊ฐ ์๋ค.
1.2) setTimeout
setTimeout
ํจ์๋ ๋จ ํ๋ฒ ์ง์ ๋ ์ฝ๋๋ฅผ ์คํํ์ง๋ง ์ฌ๊ทํธ์ถ ๋ฑ์ ๋ฐฉ๋ฒ์ ์ด์ฉํด์ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถํ ์ ์๋ค.
setTimeout
ํจ์๋ ์ง์ ๋ ์๊ฐ๋งํผ์ ๊ธฐ๋ค๋ฆฐ ํ ์ง์ ๋ ์ฝ๋๋ฅผ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์ ํธ์ถํ๋ ์๊ธฐ๋ ์ง์ ๋ ์ฝ๋ ๋ด์์ ์ ์๊ฐ ๊ฐ๋ฅํ๋ค.
function foo() {
// process..
loop = setTimeout(function() { foo() }, 1000);
}
var loop = setTimeout(function() { foo() }, 1000);
์ ์ฝ๋๋ ์ง์ ๋ ์ฝ๋(process์ฃผ์์ฒ๋ฆฌ๋ ๊ฒ) ์ดํ์ ๋ค์ setTimeout
์ผ๋ก ์ฌ๊ทํธ์ถ์ ํ๊ณ ์๋ค. ์ด๋ ๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ๋ค๋ฉด setInterval
์์ ๋ดค๋ ์ด๋ฒคํธ๊ฐ ๋ฌด์๋นํ ์ผ์ ์๋ค.
์๋ฅผ ๋ค์ด, setTimeout
์ ์คํํ๋ฉด ์ฒ์ ์ง์ ๋ ๊ฐ๊ฒฉ๋งํผ ๊ธฐ๋ค๋ฆฐ ํ ์ง์ ๋ ์ฝ๋๋ฅผ ์คํํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ง์ ๋ ์ฝ๋๊ฐ ๋๋ ์์ ์์ ๋ค์ setTimeout
ํจ์๋ฅผ ํธ์ถํ๋ค. ๊ทธ๋ฌ๋ฉด ์ง์ ๋ ์ฝ๋๊ฐ ์ง์ฐ๋๋๋ผ๋ ๋ชจ๋ ์ฒ๋ฆฌ๊ฐ ๋๋ ๋ค์ setTimeout
์ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ์ด๋ฒคํธ๊ฐ ์ค์ฒฉ๋ ์ผ์ ์์ ๊ฒ์ด๋ค. (ajax ๋ฑ์ ๋น๋๊ธฐ์ ์ฝ๋๊ฐ ์๋ค๋ฉด ์ฝ๋ฐฑํจ์์ฒ๋ผ ๋ง๋ค์ด์ผ ํ ํ์๋ ์๋ค.)
๋๊ธฐ์๊ฐ์ด 0์ธ setTimeout
setTimeout(func, 0)
์ด๋ setTimeout(func)
์ ์ฌ์ฉํ๋ฉด setTimeout
์ ๋๊ธฐ์ฌ๊ฐ์ 0์ผ๋ก ์ค์ ํ ์ ์๋ค. ์ด๋ ๊ฒ ๋๊ธฐ ์๊ฐ์ 0์ผ๋ก ์ค์ ํ๋ฉด func
์ ๊ฐ๋ฅํ ๋นจ๋ฆฌ ์คํํ ์ ์๋ค. ๋ค๋ง, ์ด๋ ์ค์ผ์ค๋ฌ๋ ํ์ฌ ์คํ์ค์ธ ์คํฌ๋ฆฝํธ์ ์ฒ๋ฆฌ๊ฐ ์ข
๋ฃ๋ ์ดํ์ ์ค์ผ์ค๋งํ ํจ์๋ฅผ ์คํํ๋ค.
์ด๋ฐ ํน์ง์ ์ด์ฉํ๋ฉด ํ์ฌ ์คํฌ๋ฆฝํธ์ ์คํ์ด ์ข ๋ฃ๋ "์งํ์" ์ํ๋ ํจ์๋ฅผ ์คํ๋ ์ ์๊ฒ ํด์ค๋ค.
์๋ ์์๋ฅผ ์คํํ๋ฉด ์ผ๋ฟ์ฐฝ์ "Hello"์ "World"๊ฐ ์ด์ด์ ์ถ๋ ฅ๋๋ค.
setTimeout(() => alert('World'));
alert('Hello');
์ ์์์์ ์ฒซ ๋ฒ์งธ ์ค์ "'0๋ฐ๋ฆฌ์ด ํ์ ํจ์ ํธ์ถํ๊ธฐ'๋ผ๋ ํ ์ผ์ ๊ณํํ์ ๊ธฐ๋ก"ํด์ฃผ๋ ์ญํ ์ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ค์ผ์ค๋ฌ๋ ํ์ฌ ์คํฌ๋ฆฝํธ(alertํจ์)์ ์คํ์ด ์ข
๋ฃ๋๊ณ ๋์์ผ "๊ณํํ์ ์ด๋ค ํ ์ผ์ด ์ ํ ์๋์ง ํ์ธ"ํ๋ฏ๋ก, "Hello"
๊ฐ ๋จผ์ , "World"
์ ๊ทธ ๋ค์ ์ถ๋ ฅ๋๋ค.
๋๊ธฐ์๊ฐ์ด 0์ธ setTimeout์ ํ์ฉํ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์์ ์ฌ๋ก๋ Event loop: microtasks and macrotasks์์ ์์ธํ ๋ค๋ฃฌ๋ค.
โ๏ธ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์ค์ ๋๊ธฐ ์๊ฐ์ 0์ด ์๋๋ค.
๋ธ๋ผ์ฐ์ ๋ HTML5ํ์ค์์ ์ ํ ์ค์ฒฉ ํ์ด๋จธ ์คํ ๊ฐ๊ฒฌ ๊ด๋ จ ์ ์ฝ์ฌํญ์ ์ค์ํ๋ค. ํด๋น ํ์ค์ "๋ค์ฏ ๋ฒ์งธ ์ค์ฒฉ ํ์ด๋จธ ์ดํ์ ๋๊ธฐ ์๊ฐ์ ์ต์ 4๋ฐ๋ฆฌ์ด ์ด์์ ๊ฐ์ ํด์ผ ํ๋ค."๋ผ๋ ์ฌํญ์ด ๋ช ์๋์ด ์๋ค.
์์๋ฅผ ํตํด ์ด ์ ์ฝ์ฌํญ์ ์ดํดํด๋ณด์. ์์์ ์ฐ์ธ
setTimeout
์ ์ง์ฐ์์ด ํจ์ run์ ๋ค์ ํธ์ถํ ์ ์๊ฒ ์ค์ผ์ค๋ง ๋์ด์๋ค. ๋ฐฐ์ดtimes
์๋ ์ค์ ์ง์ฐ ๊ฐ๊ฒฉ์ ๋ํ ์ ๋ณด๊ฐ ๊ธฐ๋ก๋๋๋ก ํด๋์๋ค. ๋ฐฐ์ด times์ ์ด๋ค ๊ฐ์ด ์ ์ฅ๋๋์ง ์์๋ณด์.let start = Date.now(); let times = []; setTimeout(function run() { // ์ด์ ํธ์ถ์ด ๋๋ ์์ ๊ณผ ํ์ฌ ํธ์ถ์ด ์์๋ ์์ ์ ์์ฐจ๋ฅผ ๊ธฐ๋ก. times.push(Date.now() - start); // ์ง์ฐ ๊ฐ๊ฒฉ์ด 100ms๋ฅผ ๋์ด๊ฐ๋ฉด, array๋ฅผ ์ผ๋ฟ์ฐฝ์ ๋์์ค. if(start + 100 < Date.now()) alert(times); // ์ง์ฐ ๊ฐ๊ฒฉ์ด 100ms๋ฅผ ๋์ด๊ฐ์ง ์์ผ๋ฉด ์ฌ์ค์ผ์ค๋งํจ. else setTimeout(run); }); // ์ถ๋ ฅ์ฐฝ ์์: // 1,1,1,1,5,10,14,19,23,29,33,39,42,47,52,56,61,67,72,77,83,88,93,96,102
์ด๊ธฐ ํ์ด๋จธ๋ค์(์คํ์ ์ ํ ๊ฒ์ฒ๋ผ) ์ง์ฐ ์์ด ๋ฐ๋ก ์คํ๋๋ค. ๊ทธ๋ฐ๋ฐ ๋ค์ฏ๋ฒ ์งธ ์ค์ฒฉ ํ์ด๋จธ ์ดํ์ ์ง์ฐ ๊ฐ๊ฒฉ์ด 4๋ฐ๋ฆฌ์ด ์ด์์ด ๋์ด
5,10,14,19..
์ ๊ฐ์ ๊ฐ์ด ์ ์ฅ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.์ด๋ฐ ์ ์ฝ ์ฌํญ์
setTimeout
๋ฟ๋ง ์๋๋ผsetInterval
์๋ ์ ์ฉ๋๋ค.setInterval(f)
๋ ์ฒ์ ๋ช ๋ฒ์ ํจ์f
๋ฅผ ์ง์ฐ์์ด ์คํํ์ง๋ง, ๋์ค์ ์ง์ฐ ๊ฐ๊ฒฉ์ 4๋ฐ๋ฆฌ์ด ์ด์์ผ๋ก ๋๋ ค๋ฒ๋ฆฐ๋ค.์ด๋ ์ค๋์ ๋ถํฐ ์๋ ์ ์ฝ์ธ๋ฐ, ๊ตฌ์ ์คํฌ๋ฆฝํธ ์ค ์ผ๋ถ๋ ์์ง ์ด ์ ์ฝ์ ์์กดํ๋ ๊ฒฝ์ฐ๊ฐ ์์ด์ ์คํ๋ ์ด ์ ์ฝ์ฌํญ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ช ์ํ๊ณ ์๋ค
ํํธ, ์๋ฒ์ธก์ ์ด๋ฐ ์ ์ฝ์ด ์๋ค. Node.js์ process.nextTick๊ณผ setImmediate๋ฅผ ์ด์ฉํ๋ฉด ๋น๋๊ธฐ ์์ ์ ์ง์ฐ ์์ด ์คํํ ์ ์๋ค. ์์์ ์ธ๊ธ๋ ์ ์ฝ์ ๋ธ๋ผ์ฐ์ ์ ํ์ ๋๋ค.
์์ฝ
setInterval(func, delay, ..args)
๊ณผsetTimeout(func, delay, ..args)
์delay
๋ฐ๋ฆฌ์ด ํ์func
์ ๊ท์น์ ์ผ๋ก, ๋๋ ํ๋ฒ ์คํํ๋๋ก ํด์ค๋ค.setInterval / setTimeout
์ ํธ์ถํ๊ณ ๋ฐํ๋ฐ์ ๊ฐ์clearInterval / clearTimeout
์ ๋๊ฒจ์ฃผ๋ฉด ์ค์ผ์ค๋ง์ ์ทจ์ํ ์ ์๋ค.- ์ค์ฒฉ
setTimeout
์ ์ฌ์ฉํ๋ฉดsetInterval
์ ์ฌ์ฉํ ๊ฒ๋ณด๋ค ์ ์ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ์ง์ฐ๊ฐ๊ฒฉ์ด ๋ณด์ฅ๋๋ ๊ฒ ๋ํ ์ด์ ์ด๋ค. - ๋๊ธฐ์๊ฐ์ด 0์ธ setTimeout(
setTimeout(func, 0)
์ด๋setTimeout(func)
)์ ์ฌ์ฉํ๋ฉด "ํ์ฌ ์คํฌ๋ฆฝํธ์ ์คํ์ด ์๋ฃ๋ ํ์ ๊ฐ๋ฅํ ๋น ๋ฅด๊ฒ" ์ํ๋ ํจ์๋ฅผ ํธ์ถํ ์ ์๋ค. - ์ง์ฐ์์ด ์ค์ฒฉ
setTimeout
์์ 5ํ ์ด์ ํธ์ถํ๊ฑฐ๋ ์ง์ฐ์๋setInterval
์์ ํธ์ถ์ด 5ํ์ด์ ์งํ๋๋ฉด, 4๋ฐ๋ฆฌ์ด ์ด์์ ์ง์ฐ ๊ฐ๊ฒฉ์ ๊ฐ์ ์ ์ผ๋ก ๋ํด์ค๋ค. ์ด๋ ๋ธ๋ผ์ฐ์ ์์๋ง ์ ์ฉ๋๋ ์ฌํญ์ด๋ฉฐ, ํ์ ํธํ์ฑ์ ์ํด ์ ์ง๋๊ณ ์๋ค.
๋ชจ๋ ์ค์ผ์ค๋ง ๋ฉ์๋๊ฐ ๋ช ์ํ ์ง์ฐ ๊ฐ๊ฒฉ์ ๋ณด์ฅํ์ง ์๋๋ค๋ ์ ์ ์ ์ํด์ผ ํ๋ค.
์๋์ ๊ฐ์ ์ํฉ์์ ๋ธ๋ผ์ฐ์ ๋ด ํ์ด๋จธ๊ฐ ๋๋ ค์ง๋ฉด ์ง์ฐ ๊ฐ๊ฒฉ์ด ๋ณด์ฅ๋์ง ์๋๋ค.
- CPU๊ฐ ๊ณผ๋ถํ ์ํ์ธ ๊ฒฝ์ฐ
- ๋ธ๋ผ์ฐ์ ํญ์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ชจ๋์ธ ๊ฒฝ์ฐ
- ๋ ธํธ๋ถ์ด ๋ฐฐํฐ๋ฆฌ์ ์์กดํด์ ๊ตฌ๋์ค์ธ ๊ฒฝ์ฐ
์ด๋ฐ ์ํฉ์์ ํ์ด๋จธ์ ์ต์ ์ง์ฐ ์๊ฐ์ 300๋ฐ๋ฆฌ์ด์์ ์ฌํ๋ฉด 1000๋ฐ๋ฆฌ์ด๊น์ง ๋์ด๋๋ค. ์ฐ์ฅ ์๊ฐ์ ๋ธ๋ผ์ฐ์ ๋ ๊ตฌ๋์ค์ธ ์ด์์ฒด์ ์ ์ฑ๋ฅ ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
๊ณผ์
์ผ์ด๊ฐ๊ฒฉ์ผ๋ก ์ซ์ ์ถ๋ ฅํ๊ธฐ
from
์ ๋ช
์ํ ์ซ์๋ถํฐ to
์ ๋ช
์ํ ์ซ์๊น์ง ์ถ๋ ฅํด์ฃผ๋ ํจ์ printNumbers(from, to)
๋ฅผ ๋ง๋ค์ด๋ณด์. ์ซ์๋ ์ผ ์ด ๊ฐ๊ฒฉ์ผ๋ก ์ถ๋ ฅ๋์ด์ผ ํ๋ค.
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํด ๋ง๋ค์ด์ผ ํ๋ค.
setInterval
์ ์ด์ฉํ ๋ฐฉ๋ฒ- ์ค์ฒฉ
setTimeout
์ ์ด์ฉํ ๋ฐฉ๋ฒ
ํด๋ต :
setInterval
์ ์ด์ฉํ ๋ฐฉ๋ฒ
setInterval
function printNumbers(from, to) {
let current = from;
let timerId = setInterval(function() {
alert(current);
if(current === to) {
clearInterval(timerId);
}
current++;
}, 1000);
}
// usage:
printNumbers(5, 10);
- ์ค์ฒฉ
setTimeout
์ ์ด์ฉํ ๋ฐฉ๋ฒ
function printNumbers(from, to) {
let current = from;
setTimeout(function go() {
alert(current);
if(current < to) {
setTimeout(go, 1000);
}
current++;
}, 1000);
}
// usage:
printNumbers(5, 10);
๋ ๋ฐฉ๋ฒ ๋ชจ๋์์ ์ต์ด ํธ์ถ ์ด์ ์(์ฒซ ๋ฒ์งธ ์ผ๋ฟ ์ฐฝ์ด ๋จ๊ธฐ ์ ์)1000ms
์ ์ง์ฐ ๊ฐ๊ฒฉ์ ๋์๋ค๋ ์ ์ ์ฃผ๋ชฉํ๊ธธ ๋ฐ๋๋ค.
์ด๊ธฐ ์ง์ฐ์๊ฐ ์์ด ํจ์๋ฅผ ๋ฐ๋ก ์คํํ๋ ค๋ฉด ์๋์ ๊ฐ์ด ๋ณ๋์ ์ค์์ ํจ์๋ฅผ ํธ์ถํด์ค์ผ ํ๋ค.
function printNumbers(from, to) {
let current = from;
function go() {
alert(current);
if(current === to) {
clearInterval(timerId);
}
current++;
}
go();
let timerId = setInterval(go, 1000);
}
printNumbers(5, 10);
setTimeout์ ๋ฌด์์ ๋ณด์ฌ์ค๊น?
์๋ ์ฝ๋์์ setTimeout
์ ์ด์ฉํด ํธ์ถ์ ์ค์ผ์ค๋งํ๊ณ ์๋ค. ๊ทธ๋ฐ๋ฐ ๊ทธ ์๋ ์ฝ๋์์ ์คํ ์๊ฐ์ด 100ms์ด์ ๊ฑธ๋ฆฌ๋ ๋ฌด๊ฑฐ์ด ์์
์ ํ๊ณ ์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ setTimeout์ ๋๊ฒจ์ค ํจ์๋ ์ธ์ ์คํ๋ ๊น?
- ๋ฐ๋ณต๋ฌธ ์คํ ํ
- ๋ฐ๋ณต๋ฌธ ์คํ ์
- ๋ฐ๋ณต๋ฌธ์ด ์คํ๋๋ ์์
์ผ๋ฟ์ฐฝ์ ์ด๋ค ๊ฐ์ด ์ถ๋ ฅ๋ ๊น?
let i = 0;
setTImeout(() => alert(i), 100); // ?
// ์๋ ๋ฐ๋ณต๋ฌธ์ ๋ค ๋๋๋ฐ 100ms ์ด์์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค๊ณ ๊ฐ์ .
for(let j = 0; j < 10000000; j++) {
i++;
}
ํด๋ต :
setTimeout
์ ํ์ฌ ์คํ์ค์ธ ์ฝ๋์ ์คํ์ด ์ข
๋ฃ๋์์ ๋ ์คํ๋๋ค.
๋ฐ๋ณต๋ฌธ ์คํ์ด ์ข
๋ฃ๋๊ณ ๋ ํ i
๋ 10000000
์ด ๋๋ฏ๋ก, ์ผ๋ฟ ์ฐฝ์ 10000000
์ด ์ถ๋ ฅ๋๋ค.
let i = 0;
setTimeout(() => alert(i), 100); // 10000000์ด ์ถ๋ ฅ๋๋ค.
// assume that the time to execute this function is > 100ms
for(let j = 0; j < 10000000; j++) {
i++;
}