[JavaScript] ์Šค์ผ€์ค„๋ง setTimeout ๊ณผ setInterval

2020. 4. 10. 04:04ยท๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ปSTUDY/JavaScript

[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

setInterval์„ ์‚ฌ์šฉํ•˜๋ฉด func ํ˜ธ์ถœ ์‚ฌ์ด์˜ ์ง€์—ฐ ๊ฐ„๊ฒฉ์ด ์‹ค์ œ ๋ช…์‹œํ•œ ๊ฐ„๊ฒฉ(100ms)๋ณด๋‹ค ์งง์•„์ง„๋‹ค.

func์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ "์†Œ๋ชจ๋˜๋Š”" ์‹œ๊ฐ„์ด ์ง€์—ฐ ๊ฐ„๊ฒฉ์— ํฌํ•จ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ง€๊ทนํžˆ ์ •์ƒ์ ์ธ ๋™์ž‘์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ func์„ ์‹คํ–‰ํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๋ช…์‹œ์  ์ง€์—ฐ ๊ฐ„๊ฒฉ๋ณด๋‹ค ๊ธธ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

์ด๋Ÿฐ ๊ฒฝ์šฐ ์—”์ง„์ด func์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์ค€๋‹ค. func์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋ฉด ์—”์ง„์€ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ™•์ธํ•˜๊ณ , ์ด๋•Œ ์ง€์—ฐ ์‹œ๊ฐ„์ด ์ง€๋‚ฌ์œผ๋ฉด ๋‹ค์Œ ํ˜ธ์ถœ์„ ๋ฐ”๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด delay ๋ฐ€๋ฆฌ์ดˆ๋ณด๋‹ค ๊ธธ๋ฉด, ๋ชจ๋“  ํ•จ์ˆ˜๊ฐ€ ์‰ผ ์—†์ด ๊ณ„์† ์—ฐ์† ํ˜ธ์ถœ๋œ๋‹ค.

 

์ด์— ๋ฐ˜ํ•ด ์ค‘์ฒฉ, setTimeout์„ ์ด์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ํ๋ฆ„์ด ์ด์–ด์ง„๋‹ค.

 


์ค‘์ฒฉ 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)๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ์ˆซ์ž๋Š” ์ผ ์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

  1. setInterval์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•
  2. ์ค‘์ฒฉsetTimeout์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

ํ•ด๋‹ต :

  1. 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);

 

  1. ์ค‘์ฒฉ 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์— ๋„˜๊ฒจ์ค€ ํ•จ์ˆ˜๋Š” ์–ธ์ œ ์‹คํ–‰๋ ๊นŒ?

  1. ๋ฐ˜๋ณต๋ฌธ ์‹คํ–‰ ํ›„
  2. ๋ฐ˜๋ณต๋ฌธ ์‹คํ–‰ ์ „
  3. ๋ฐ˜๋ณต๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ์‹œ์ 

์–ผ๋Ÿฟ์ฐฝ์—” ์–ด๋–ค ๊ฐ’์ด ์ถœ๋ ฅ๋ ๊นŒ?

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++;
}

 

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋™์ผ์กฐ๊ฑด (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ปSTUDY/JavaScript' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [JavaScript] Call By Value
  • [JavaScript] JavaScript ์‚ฝ์ž…๋ฐฉ์‹๊ณผ ์œ„์น˜
  • [JavaScript] ๋ฌธ์„œ์˜ ๋กœ๋“œ์‹œ์  - onload / DOMContentLoaded
  • [JavaScript] return / break
jmjm
jmjm
  • jmjm
    /* jmjmjm */
    jmjm
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (129)
      • ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ปSTUDY (91)
        • HTML (9)
        • CSS (25)
        • SASS (4)
        • JavaScript (17)
        • jQuery (9)
        • Publishing (8)
        • Git (11)
        • React (6)
        • Vue (0)
        • ์›น์ ‘๊ทผ์„ฑ (1)
        • Gulp (1)
      • ๐ŸฃcodeLab (27)
      • ๐ŸŒˆetc (8)
      • ๐Ÿฅฐ ์ผ์ƒ (2)
      • ๐ŸŒŸ์ฝ์–ด๋ณด๊ธฐ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ปฌ๋ ‰์…˜
    ํ˜•์ œ์ธ์ ‘์ž display none
    HTML Form
    css ๊ฐ€์ƒ์„ ํƒ์ž
    sticky jsfiddle
    sass
    sticky codepen
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹ ๋ฌธ
    ํ˜•์ œ์ธ์ ‘์ž ์•ˆ๋˜๋Š” ์ด์œ 
    ์ ‘๊ทผ์„ฑ ์ฃผ์˜์‚ฌํ•ญ
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹๋ฌธ
    ์•„์ฝ”๋””์–ธ๋ฉ”๋‰ด
    javascript ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น
    javascript htmlcollection
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ slideup
    css flex
    javascript htmlcollection nodelist
    css ํ˜•์ œ์ธ์ ‘์ž ์•ˆ๋ผ์š”
    javascript nodelist
    sass compiler
    ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น ์ข…๋ฅ˜
    ์›น์ ‘๊ทผ์„ฑ
    react import export
    ํ˜•์ œ์ธ์ ‘์ž
    vscode ๋‹จ์ถ•ํ‚ค
    html collection
    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ตฌ์กฐ๋ถ„ํ•ดํ• ๋‹น
    CSS ์„ ํƒ์ž
    sticky ํ™œ์šฉ
    javascript ์ปฌ๋ ‰์…˜
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
jmjm
[JavaScript] ์Šค์ผ€์ค„๋ง setTimeout ๊ณผ setInterval
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”