
๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋จ์ ์์ค๊ฐ ์์ฑ๋ ์์๋๋ก ์์ค๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ, ์ด๊ฒ์ '๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์'์ด๋ผ๊ณ ํฉ๋๋ค.
์ปคํผ์์ ์๋ฅผ ๋ค๊ฒ ์ต๋๋ค. ๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ A๋ผ๋ ์ฌ๋์ด ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ๋ฉด ๊ทธ ์ฃผ๋ฌธ์ ๋ฐ์์ ์ปคํผ๋ฅผ ๋ง๋ค๊ณ A์๊ฒ ๋๊ฒจ์ฃผ์ด์ผ ํ๋์ ๋์์ด ๋๋ฉ๋๋ค. ๋ฐ๋ฉด ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์์ A๋ผ๋ ์ฌ๋์ด ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ๋ฉด ๊ทธ ์ฃผ๋ฌธ์ ์ฃผ๋ฐฉ์ผ๋ก ๋๊ธฐ๊ณ , A์๊ฒ๋ ์ง๋๋ฒจ์ ์ฃผ๋ฉด์ ์ปคํผ๊ฐ ์์ฑ๋๋ฉด ์๋ ค ์ฃผ๊ฒ ๋ค๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๊ธฐํ๊ณ ์๋ B์ ์ฃผ๋ฌธ์ ๋ฐ๊ณ ์ง๋๋ฒจ์ ๊ฑด๋ค์ค๋๋ค. ๋ค๋ฅธ ์ฌ๋์ ์ฃผ๋ฌธ์ ๋ฐ๋ ๋์์ A์ ์ปคํผ๊ฐ ์์ฑ๋๋ฉด A์๊ฒ ์๋ ค ์ฃผ์ฃ .
function displayA(){
console.log("A");
}
function displayB(){
console.log("B");
}
function displayC(){
console.log("C");
}
displayA();
displayB();
displayC();
/*output
A
B
C
*/
์ ์์์๋ 3๊ฐ์ ํจ์๊ฐ ์๊ณ ์ด๋ค ํจ์๋ฅผ ์์๋๋ก ์คํํ๋ฉด ์ฝ์ ์ฐฝ์ A, B, C์ ์์ผ๋ก ํ์๋ฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ ๋ฒ์ ํ๋์ ์์ ๋ง ์ฒ๋ฆฌํ๋ ์ฑ๊ธ ์ค๋ ๋(single thread) ์ธ์ด์ ๋๋ค. ์ค๋ ๋(thread)๋ ํ๋ก์ธ์ค์์ ์์ ์ ์คํํ๋ ๋จ์๋ฅผ ๊ฐ๋ฆฌํค๋๋ฐ, ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง ์ฒ๋ฆฌํ๋ฉด '์ฑ๊ธ ์ค๋ ๋', ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, '๋ฉํฐ์ค๋ ๋'๋ผ๊ณ ํฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์๋ ํ ๋ฒ์ ํ๋์ฉ๋ง ์ฒ๋ฆฌํ๋ ์ฑ๊ธ ์ค๋ ๋ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ธ ๊ฐ์ง ํจ์ ์ค์์ ํน์ ํจ์๋ฅผ ์คํํ๋๋ฐ ์๊ฐ์ด ๋ ๊ฑธ๋ฆฐ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. setTimeout()ํจ์๋ฅผ ์ฌ์ฉํด์ ์คํ ์๊ฐ์ ๋ฆ์ถฐ ๋ณด๊ฒ ์ต๋๋ค.
function displayA(){
console.log("A");
}
function displayB(){
setTimeout(() => console.log("B"), 2000) ;
}
function displayC(){
console.log("C");
}
displayA();
displayB();
displayC();
/*output
A
C
B
*/
A์ C๋ฅผ ํ์ํ๋ ํจ์๋ ์ฆ์ ์คํ๋์ง๋ง, B๋ฅผ ํ์ํ๋ ํจ์๋ 2์ด ํ์ ์คํ๋๋๋ก ์์ฑํ์ต๋๋ค. ์ผ๋จ ์์ค๋ง ์ดํด๋ณด๋ฉด ์ฝ์ ์ฐฝ์ A๋ฅผ ํ์ํ๊ณ , 2์ด ํ์ B๋ฅผ ํ์ํ ํ ๋ค์ C๋ฅผ ํ์ํ ๊ฒ ์
๋๋ค. ํ์ง๋ง 2์ด๊ฐ ์๋๋ผ 30์ด๋ผ๋ฉด ์๊ฐ๋ฟ๋ง ์๋๋ผ ์์คํ
์์๋ ๋ง์ด ๋ญ๋น๋ฉ๋๋ค. ๊ทธ๋์ ์ค๊ฐ์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ์์ค๊ฐ ์๋ค๋ฉด ๋ณ๋๋ก ์ฒ๋ฆฌํ๊ณ , ๊ทธ ๋ค์์ ์๋ ์์ค๋ฅผ ๋จผ์ ์คํํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํจ์์ ์คํ ์๊ฐ์ ๋ฐ๋ผ ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ณ๋๋ก ์ฒ๋ฆฌํ๊ณ ์คํ์ด ๋๋ฌ์ ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
ํ๋ก๊ทธ๋จ์์๋ ์ฌ๋ฌ ๊ฐ์ ํจ์๋ฅผ ์์ฑํ๋๋ฐ, ์คํ ์๊ฐ์ด ๋ค๋ฅธ ํจ์๋ค์ ์ํ๋ ์ฒ๋ฆฌ ์์์ ๋ง๊ฒ ํ๋ก๊ทธ๋๋ฐํ๋ ๊ฒ์ '๋น๋๊ธฐ ์ฒ๋ฆฌ'๋ผ๊ณ ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์
์ด ์์ ๊ฒฝ์ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์์
์ ๋ฐ๋ก ์ฒ๋ฆฌํ๊ณ , ๋นจ๋ฆฌ ๋๋๋ ์์
์ ๋จผ์ ์ฒ๋ฆฌํฉ๋๋ค. ํ์ง๋ง ํ๋ก๊ทธ๋จ์ ๋ฐ๋ผ ์ด๋ฐ ์คํ ์์๋ฅผ ์กฐ์ ํด์ผ ํ ๋๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์๋ฒ์์ ์๋ฃ๋ฅผ ๊ฐ์ ธ์์ ํ๋ฉด์ ํ์ํ๋ค๋ฉด ์๋ฒ์์ ์๋ฃ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์๋ฌด๋ฆฌ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ ค๋ ์๋ฃ๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์ ๋ค์์ ํ๋ฉด์ ํ์ํ๋ ํจ์๋ฅผ ์คํํด์ผ ํฉ๋๋ค.
function displayB(callback){
setTimeout(() => {
console.log("B");
callback(),
}, 2000);
}
function displayC(){
console.log("C");
}
displayA();
displayB(displayC)
/*output
A
B
C
*/
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด displayC() ํจ์๋ displayB() ํจ์์ ์ด์ด์ ์คํํด์ผ ํ๋ฏ๋ก displayB(displayC)์ฒ๋ผ ์์ฑํ์ต๋๋ค. displayC()์๊ฒ ์ง๋๋ฒจ์ ์ฃผ๋ฉด์ displayB()๊ฐ ๋๋๋ฉด ์คํํ๋๋ก ํ๋ ๊ฑฐ์ฃ . displayB()๋ผ๋ ํจ์์ displayC() ํจ์๋ฅผ ์ธ์๋ก ์ฌ์ฉํ๋๋ฐ, ์ด๊ฒ์ '์ฝ๋ฐฑ(callback)ํจ์'๋ผ๊ณ ํฉ๋๋ค.
์์ ์์ ๋ฅผ ์ฝ์์ฐฝ์์ ํ์ธํ๋ฉด A๋ฅผ ํ์ํ๊ณ ์ ์ ๊ธฐ๋ค๋ ธ๋ค๊ฐ B์ C๋ฅผ ํ์ํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๋ ค๋ฉด ์ฝ๋ฐฑํจ์, ํ๋ก๋ฏธ์ค, (async, await) ํฌ๊ฒ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฝ๋ฐฑ ํจ์๋, ๋ค๋ฅธ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ ํจ์์ ๋๋ค.
-ํจ์ ์ด๋ฆ์ ์ฝ๋ฐฑ์ผ๋ก ์ฌ์ฉํ๊ธฐ
์ฝ๋ฐฑ์ผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ฌ์ฉ์๊ฐ ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ ํ 3์ด ํ์ ์ปคํผ๊ฐ ์ค๋น๋์๋ค๊ณ ์๋ ค ์ฃผ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
function order(coffee, callback) {
console.log(`${coffee} ์ฃผ๋ฌธ ์ ์`);
setTimeout(() =>{
callback(coffee);
}, 3000)
}
function display(result) {
console.log(`${result} ์ค๋น ์๋ฃ`);
}
order("์๋ฉ๋ฆฌ์นด๋
ธ", display)
/*output
์๋ฉ๋ฆฌ์นด๋
ธ ์ฃผ๋ฌธ ์ ์
์๋ฉ๋ฆฌ์นด๋
ธ ์ค๋น ์๋ฃ
*/
์ฝ๋ฐฑ์ ์ฌ์ฉํ๋ค๋ฉด ์ปคํผ๊ฐ ์ค๋น๋์๋ค๊ณ ํ์ํ๋ display() ํจ์๋ฅผ order() ํจ์์ ๋งค๊ฐ๋ณ์๋ก ๋๊ธฐ๋ฉด ๋ฉ๋๋ค.
-์ต๋ช
์ผ๋ก ์ฝ๋ฐฑ ํจ์ ์์ฑํ๊ธฐ
์ฝ๋ฐฑ ํจ์๋ฅผ ์ฌ์ฉํ ๋ ํจ์ ์ด๋ฆ๋ ์ฌ์ฉํ์ง๋ง, ํจ์ ์์ ์ง์ ์ต๋ช
ํจ์๋ก ์์ฑํ๊ธฐ๋ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด A๋ฅผ ํ์ํ ํ 1์ด๋ง๋ค B, C, D, stop! ์์๋ก ํ์ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
function displayLetter(){
console.log("A");
setTimeout(() => {
console.log("B")
setTimeout(() => {
console.log("C")
setTimeout(() => {
console.log("D")
setTimeout(() => {
console.log("stop!")
},1000)
}, 1000)
}, 1000)
}, 1000)
}
์ฝ๋ฐฑ ํจ์์ ๋ค๋ฅธ ์ฝ๋ฐฑ ํจ์๊ฐ ๊ณ์ ๋ค์ด๊ฐ๋ฉด ์์ค์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ณ , ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ๋๋ฒ๊น ํ๊ธฐ ์ด๋ ต์ต๋๋ค. ์ด๋ ๊ฒ ์ฝ๋ฐฑ์ด ๊ณ์ ๋ฐ๋ณต๋๋ ์ํ๋ฅผ '์ฝ๋ฐฑ ์ง์ฅ(callback hell)'์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๋ฏธ์ง ์ถ์ฒ- https://makeameme.org/meme/asynchronous-synchronous#google_vignette
์๋ฌธ ์ถ์ฒ- Do it! ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋๋ฐ์ ์ ์(์ด๋ฏธ์คํผ๋ธ๋ฆฌ์ฑ)