๊ณต์‚ผ
article thumbnail


๐Ÿ“์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋™์ž‘ํ•˜๋ ค๋ฉด JS์—”์ง„์ด ํ•„์š”ํ•œ๋Œ€, ๋ธŒ๋ผ์šฐ์ € ๋‚ด์— ๋‚ด์žฅ๋˜์–ด ์žˆ๊ณ  node.js๋ฅผ ์„ค์น˜ํ•ด์„œ ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋•Œ! ๋™์ž‘ํ•˜๋Š” ์‹œ๊ฐ„์„ ๋Ÿฐํƒ€์ž„์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์ด ๋Ÿฐํƒ€์ž„ ๊ณผ์ •์—์„œ ์ฝ”๋“œ๋ฅผ ํ•œ์ค„ํ•œ์ค„ ์ฝ๊ณ  ๋ฒˆ์—ญํ•ด ์‹คํ–‰ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ผ๊ณ  ํ•œ๋‹ค.

 

์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ž€?

- ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ฝ์–ด ํ•œ์ค„์”ฉ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๋˜๋Š” ํ™˜๊ฒฝ์„ ๋งํ•œ๋‹ค.

- ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผ ํ•˜์ง€์•Š๊ณ ๋„ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. 

์‚ฌ์šฉ์–ธ์–ด : Python, Ruby, JavaScript ..

cf ) ์ปดํŒŒ์ผ๋Ÿฌ

- ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ•œ๋ฒˆ์— ์ปดํŒŒ์ผํ•˜์—ฌ ์ค‘๊ฐ„์–ธ์–ด ๋˜๋Š” ๊ธฐ๊ณ„์–ด๋กœ ๋ณ€ํ™˜ํ›„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ

์‚ฌ์šฉ์–ธ์–ด : C, C++, JAVA ...

 

๐Ÿ“์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ž€?

  • ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋Ÿฐํƒ€์ž„์‹œ ํ•œ์ค„ํ•œ์ค„ ๋ฒˆ์—ญํ•ด์ค€๋‹ค.
  • ์ ˆ์ฐจ์ง€ํ–ฅ๊ณผ ๊ฐ์ฒด์ง€ํ–ฅ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ์ด๋‹ค.

 

๊ฐ์ฒด์ง€ํ–ฅ์ด๋ž€?

- ํ”„๋กœ๊ทธ๋žจ์ž‘์„ฑ์‹œ "๊ฐ์ฒด"๋ผ๋Š” ๋‹จ์œ„๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ƒ๊ฐํ•˜๋ฉฐ, ๋ฐ์ดํ„ฐ์™€ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ•จ๊ป˜ ๋ฌถ์–ด ํ‘œํ˜„ํ•œ๋‹ค.

- ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ฌถ์—ฌ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’๋‹ค. 

๋Œ€ํ‘œ์  ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด : JAVA, C++, Python

 

์ ˆ์ฐจ์ง€ํ–ฅ์ด๋ž€?

- ํ”„๋กœ๊ทธ๋žจ์„ ์ผ๋ จ์˜ ์ ˆ์ฐจ๋‚˜ ๋‹จ๊ณ„๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰๋˜๋„๋ก ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

๋Œ€ํ‘œ์  ์ ˆ์ฐจ์ง€ํ–ฅ ์–ธ์–ด : C, Pascal

 

์Šค๋ ˆ๋“œ๋ž€?

- ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์˜ ๋‹จ์œ„๋กœ, ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. 

- ๊ฐ๊ฐ์˜ ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋ฉด์„œ, ๋ณ„๋„์˜ ์‹คํ–‰ ํ๋ฆ„์„ ๊ฐ–๊ณ  ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค. 

- ํ”„๋กœ์„ธ์Šค๋‚ด์—์„œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘์—…๋˜๋Š” ๋‹ค์ค‘์Šค๋ ˆ๋“œ(multithreading) ๊ณผ ํ•˜๋‚˜์˜ ์‹คํ–‰ํ๋ฆ„์„ ๊ฐ–๋Š” ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ(Single Thread) ๊ฐ€ ์žˆ๋‹ค.

 

cf) ํ”„๋กœ์„ธ์Šค

- ์‹คํ–‰์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์Šคํ„ด์Šค๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋œ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ํ™˜๊ฒฝ์„ ๋‚˜ํƒ€๋ƒ„.

- ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹น๋ฐ›์•„ ํ”„๋กœ๊ทธ๋žจ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ, ์‹คํ–‰์ƒํƒœ, ์‹œ์Šคํ…œ๋ฆฌ์†Œ์Šค ๋“ฑ์„ ํฌํ•จํ•œ๋‹ค. 

- ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋Š” ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉฐ, ๊ฐ๊ฐ์˜ ํ”„๋กœ์„ธ์Šค์—๋Š” ์šด์˜์ฒด์ œ์— ์˜ํ•ด ๋ถ„๋ฆฌ๋œ ์‹คํ–‰๊ณต๊ฐ„์—์„œ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์„ธ์Šค๊ฐ„์˜ ํ†ต์‹ ์ด ํ•„์š”ํ• ๋•Œ๋Š” ์šด์˜์ฒด์ œ๊ฐ€ ์ œ๊ณตํ•˜๋Š” IPC(Internet-process Communication)๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค.

 

์Šค๋ ˆ๋“œ๊ฐ€ ๋…๋ฆฝ์ ์ธ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์˜์—ญ์„ ํ•„์š”๋กœ ํ•˜๋Š” ์ด์œ 

- ๋…๋ฆฝ์„ฑ๊ณผ ์•ˆ์ •์„ฑ
๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๋…๋ฆฝ์ ์ธ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๋ฏ€๋กœ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์˜ ์ž‘์—…๊ณผ ์ƒํ˜ธ ๊ฐ„์„ญ ์—†์ด ์ž์‹ ์˜ ์Šคํƒ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์Šค๋ ˆ๋“œ ๊ฐ„ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ์ด ์†์ƒ๋˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

- ์ง€์—ญ ๋ณ€์ˆ˜ ๋ฐ ํ˜ธ์ถœ ์Šคํƒ
๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ๋งŒ์˜ ํ˜ธ์ถœ ์Šคํƒ(call stack)์„ ๊ฐ€์ง€๋ฉฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๊ด€๋ จ๋œ ์ง€์—ญ ๋ณ€์ˆ˜, ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฐ ๋ณต๊ท€ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋…๋ฆฝ๋œ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์™€ ํ˜ผ๋™๋˜์ง€ ์•Š๊ณ  ํ˜ธ์ถœ ์Šคํƒ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ์˜ ํ˜ธ์ถœ ์Šคํƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐ ๋ฐ˜ํ™˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ
์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๊ฐ ํ˜ธ์ถœ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์Šคํƒ ํ”„๋ ˆ์ž„์ด ์ƒ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค. ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉด ์žฌ๊ท€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๊ฐ ์Šค๋ ˆ๋“œ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ˜ธ์ถœ ์Šคํƒ์ด ๊ผฌ์ด๊ฑฐ๋‚˜ ์ƒํ˜ธ ๊ฐ„์„ญ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

- ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜(Thread-Local Variables)
์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ๋งŒ์˜ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์„œ, ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋…๋ฆฝ๋œ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ง€์›ํ•œ๋‹ค.

-์Šค๋ ˆ๋“œ ๊ฐ„ ํšจ์œจ์ ์ธ ๋™์‹œ์„ฑ ์ œ์–ด
๊ฐ ์Šค๋ ˆ๋“œ๋Š” ์ž์‹ ๋งŒ์˜ ์Šคํƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์Šค๋ ˆ๋“œ ๊ฐ„ ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜๊ธฐ ์‰ฝ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฎคํ…์Šค์™€ ๊ฐ™์€ ๋™๊ธฐํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ ์ ‘๊ทผ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.

์š”์•ฝ : ๋…๋ฆฝ์ ์ธ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ์ƒํ˜ธ ๊ฐ„์„ญ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ์Šค๋ ˆ๋“œ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋ฉฐ, ์Šค๋ ˆ๋“œ์˜ ์•ˆ์ •์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚จ๋‹ค. 

 

 

๐Ÿ“์Šค์ฝ”ํ”„๋ž€?

  • ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์š”ํ•œ ๋ฒ”์œ„, ์˜์—ญ์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•จ.
  • ์„ ์–ธ๋œ ์œ„์น˜์— ๋‹ค๋ผ ์œ ํšจ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋˜๋ฉฐ ์ฝ”๋“œ ๋ธ”๋ก { } ์•ˆ์—์„œ๋งŒ ์œ ํšจํ•˜๋‹ค.

๐Ÿ”ฅ ์žฅ์ ์œผ๋กœ๋Š” ์ด๋ฆ„์ถฉ๋Œ ๋ฐฉ์ง€, ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ๋“ฑ์ด ์žˆ๋‹ค.

์Šค์ฝ”ํ”„ ์ฒด์ธ์ด๋ž€?

์ค‘์ฒฉ๋œ ํ•จ์ˆ˜์—์„œ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๋ฅผ ์ฐพ์„๋•Œ, ๋‚ด๋ถ€ ์Šค์ฝ”ํ”„์—์„œ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ์™ธ๋ถ€ ์Šค์ฝ”ํ”„๋กœ ์ด๋™ํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ

 

๐Ÿ“๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„

// ๐Ÿ“ ์ „์—ญ ๋ณ€์ˆ˜, ์ „์—ญ ์Šค์ฝ”ํ”„, ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜, ๊ธ€๋กœ๋ฒŒ ์Šค์ฝ”ํ”„ ๋ผ๊ณ ํ•œ๋‹ค.
const text ='global'; 

{
// ๐Ÿ“ ์ง€์—ญ ๋ณ€์ˆ˜, ๋กœ์ปฌ ๋ณ€์ˆ˜, ์ง€์—ญ ์Šค์ฝ”ํ”„, ๋กœ์ปฌ ์Šค์ฝ”ํ”„
  const text = 'inside block1'; 
  {
    console.log(text)
  }
}

• ๋‹ต์€ 'inside block1' ์ด ๋œ๋‹ค. ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฒƒ์€ ์™ธ๋ถ€์— ์žˆ๋Š” ๊ฒƒ์— ์ ‘๊ทผ์ด ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์—. ๋งŒ์•ฝ inside block1 ๊ฐ’์ด ์—†๋‹ค๋ฉด ํ•œ ๋‹จ๊ณ„ ์œ„๋กœ ์ƒ์œ„ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ทผ์ ‘ํ•œ ๋ณ€์ˆ˜์— ์ ‘๊ทผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๐Ÿ“๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—”์ง„ ์ž์ฒด์—์„œ ์ œ๊ณตํ•ด์ฃผ๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋™์ž‘ํ•ด์ค€๋‹ค. ํ•˜์ง€๋งŒ ๋น„์šฉ์ด ๋ฐœ์ƒํ•œ๋‹ค.

๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜๋Š” ์•ฑ์ด ์ข…๋ฃŒ๋ ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฉ”๋ชจ๋ฆฌ์— ์œ ์ง€๋˜๊ณ , ๋ธ”๋ก์Šค์ฝ”ํ”„๋Š” ์—ญํ• ์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์†Œ๋ฉธ๋œ๋‹ค. ์ด๋•Œ ์ž๋™์œผ๋กœ ์†Œ๋ฉธ๋˜๋Š” ๊ฒƒ์„ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋ฉฐ, ๊ฐ€๊ธ‰์  ๊ธ€๋กœ๋ฒŒํ•˜๊ฒŒ ์“ฐ๋Š”๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค.

 

๐Ÿ“๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ

๋ชจ๋“  ์ฝ”๋“œ๋ธ”๋ก { } ์€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๋ผ๋Š” ๋‚ด๋ถ€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ๊ฒƒ์˜ ์—ญํ• ์€ ‘๊ฐ ๋ธ”๋ก๋งˆ๋‹ค ์–ด๋–ค ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด์žˆ๋Š”์ง€ ๋ถ€๋ชจ๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€?’ ๋“ฑ์„ ์ถ”์ ํ•œ๋‹ค.

 

๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด๋ž€  JavaScript์—”์ง„์ด ์‹๋ณ„์ž์™€ ํ•ด๋‹น ์‹๋ณ„์ž์˜ ๊ฐ’ ๋˜๋Š” ์ฐธ์กฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ด๋‹ค. 

const a = 1; // ์ „์—ญ ์Šค์ฝ”ํ”„
{
  const a = 2; // ๋ธ”๋ก ์Šค์ฝ”ํ”„ 1
   {
    const a = 3; // ๋ธ”๋ก ์Šค์ฝ”ํ”„ 2
   }
}

์™€ ๊ฐ™์ด ์ „์—ญ ์Šค์ฝ”ํ”„ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ์ด ๋งŒ๋“ค์–ด์ง€๋ฉด, ๋ธ”๋ก ์Šค์ฝ”ํ”„1, ๋ธ”๋ก์Šค์ฝ”ํ”„2 ๋กœ ์ด์–ด์ง€๋Š” ๊ฒƒ์„ ์Šค์ฝ”ํ”„ ์ฒด์ธ์ด๋ผ๊ณ  ํ•œ๋‹ค.

!!! ์ฝ”๋“œ๋ธ”๋Ÿญ ๋ฐ–์—์„œ ๋‚ด๋ถ€์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์ง€๋งŒ, ๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๊ฐ€ ๋ ‰์‹œ์ปฌํ™˜๊ฒฝ ์ฐธ์กฐ์™€ ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ํ†ตํ•ด ๋ถ€๋ชจ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค !!!

 

๐Ÿ“์‹คํ–‰ context ํ™˜๊ฒฝ

์‹คํ–‰ context๋Š” JavaScript์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ํ™˜๊ฒฝ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฝ”๋“œ ์‹คํ–‰์ค‘์— ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜๋“ฑ์˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค. 

 

์ฝ”๋“œ์˜ ์‹คํ–‰ ํ๋ฆ„๊ณผ ์‹๋ณ„์ž๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 

 

์š”์•ฝํ•ด. ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋Š” ์ฝ”๋“œ ๋ธ”๋ก์ด ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋‹ด์€ '์‹คํ–‰ ํ™˜๊ฒฝ'์„ ์˜๋ฏธํ•œ๋‹ค.

 

  • ๋ณ€์ˆ˜ ํ™˜๊ฒฝ(Variable Environment): ํ˜„์žฌ ์Šค์ฝ”ํ”„์˜ ๋ณ€์ˆ˜๋“ค๊ณผ ๊ทธ๋“ค์˜ ๊ฐ’ ๋˜๋Š” ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ์ด๊ณณ์—์„œ ๋ณ€์ˆ˜์˜ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ํ• ๋‹น ๋“ฑ์ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
  • ์™ธ๋ถ€ ํ™˜๊ฒฝ ์ฐธ์กฐ(Outer Environment Reference): ํ˜„์žฌ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์—ฐ๊ฒฐ๋œ ์™ธ๋ถ€(์ƒ์œ„) ์Šค์ฝ”ํ”„์˜ ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋งํฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์Šค์ฝ”ํ”„ ์ฒด์ธ์„ ํ˜•์„ฑํ•˜๋ฉฐ ๋ณ€์ˆ˜ ๊ฒ€์ƒ‰์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ํ™˜๊ฒฝ(Execution Context): ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜, ์ง€์—ญ ๋ณ€์ˆ˜, this ๊ฐ’ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ์˜์—ญ์ž…๋‹ˆ๋‹ค. ์ด ์˜์—ญ์—์„œ ์‹ค์ œ ์ฝ”๋“œ ์‹คํ–‰์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

 

 

๐Ÿ“ํ˜ธ์ด์ŠคํŒ…

ํ˜ธ์ด์ŠคํŒ…์ด๋ž€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ์ „, ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜, ํด๋ž˜์Šค๋“ฑ์„ ๋Œ์–ด์˜ฌ๋ ค ์„ ์–ธ ๋จผ์ € ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

print();

function print() {
  console.log('hello');
}

ํ˜ธ์ด์ŠคํŒ… ๋•๋ถ„์— ์ด๋Ÿฐ์‹์œผ๋กœ ํ•จ์ˆ˜๋Š” ๋‚˜์ค‘์— ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ๋จผ์ € ํ˜ธ์ถœ์„ ํ•ด๋„ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ณ€์ˆ˜ (let, const)๋ฅผ ์„ ์–ธํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœํ•˜๋ฉด ์•ฑ์ด ์ฃฝ์–ด๋ฒ„๋ฆฐ๋‹ค.

๋ฌธ์ œ์˜ var๋Š” ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์„ ์–ธ์—†์ด ํ• ๋‹น ๊ฐ€๋Šฅ ๋ฐ ์žฌํ• ๋‹น, ์žฌ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋”ฐ๋ผ์„œ var๋Š” ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์— ์ข‹์ง€ ์•Š์•„ ๊ทผ๋ž˜์—๋Š” ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€์•Š๋Š”๋‹ค.

 

ํ˜ธ์ด์ŠคํŒ…์€ ์™œ ์‹คํ–‰๋˜๋Š” ๊ฑธ๊นŒ?

 

๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜ ์„ ์–ธ์˜ ๋ถ„๋ฆฌ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ฝ”๋“œ์‹คํ–‰์ „ ์Šค์ฝ”ํ”„ ๋‚ด์˜ ๋ชจ๋“  ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฐ๋‹ค.

์ด๋•Œ ์„ ์–ธ๋ถ€์™€ ํ• ๋‹น๋ถ€๊ฐ€ ๋ถ„๋ฆฌ๋˜๋ฉฐ, ์„ ์–ธ๋ถ€๋งŒ ์œ„๋กœ ๋Œ์–ด์˜ฌ๋ ค์ง€๊ฒŒ ๋œ๋‹ค.

 

(ํ•จ์ˆ˜ ์„ ์–ธ์‹์€ ํ˜ธ์ด์ŠคํŒ…๋˜์ง€๋งŒ, ํ•จ์ˆ˜์˜ ํ• ๋‹น์€ ํ˜ธ์ด์ŠคํŒ… ๋˜์ง€ ์•Š๋Š”๋‹ค.)

 

ํ•จ์ˆ˜ ์„ ์–ธ์‹

foo(); // "Hello from foo!"

function foo() {
    console.log("Hello from foo!");
}

 

ํ•จ์ˆ˜ ํ‘œํ˜„์‹

bar(); // TypeError: bar is not a function

var bar = function() {
    console.log("Hello from bar!");
};

 

๐Ÿ“์—„๊ฒฉ๋ชจ๋“œ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํŠน๋ณ„ํ•œ ์‹คํ–‰๋ชจ๋“œ๋กœ ์ผ๋ฐ˜์ ์ธ ์‹ค์ˆ˜๋‚˜ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋™์ž‘์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์ข€ ๋” ์ผ๊ด€๋œ ๋™์ž‘์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ชจ๋“œ

 

 

๐Ÿ“์ด๋ฒคํŠธ ๋ฃจํ”„ โญ๏ธ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹จ์ผ ์Šค๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์–ธ์–ด๋กœ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ๋‹จ์ผ ์ฝœ ์Šคํƒ์„ ๊ฐ€์ง„๋‹ค. ์ด ๋ง์€ ์š”์ฒญ์ด ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋น„๋™๊ธฐ ์š”์ฒญ์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ ๋  ์ˆ˜ ์žˆ์„๊นŒ ? ๐Ÿคท๐Ÿป‍โ™€๏ธ

๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ์ธ ๋ธŒ๋ผ์šฐ์ €๋‚˜ Node.js๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„๊ณผ ๊ทธ ์‹คํ–‰ํ™˜๊ฒฝ์„ ์ƒํ˜ธ ์—ฐ๋™ ์‹œ์ผœ์ฃผ๋Š” ์žฅ์น˜๊ฐ€ ๋ฐ”๋กœ ์ด๋ฒคํŠธ ๋ฃจํ”„์ด๋‹ค. ๋”ฐ๋ผ์„œ, ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ์žˆ์ง€ ์•Š๊ณ  ๊ทธ ํ™˜๊ฒฝ์— ์†ํ•œ๋‹ค.

ํƒœ์Šคํฌ ํ์™€ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์€ 2๊ฐ€์ง€ ํ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ, ์ฝœ๋ฐฑํ•จ์ˆ˜ ๋“ฑ์˜ ํƒœ์Šคํฌ๊ฐ€ ๋‹ด๊ธฐ๋Š” ๊ณต๊ฐ„์ด๋‹ค. ํƒœ์Šคํฌ๊ฐ€ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ผ๋ฉด ๊ทธ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ํ์— ๋‹ด๊ธฐ๋ฉฐ ๋Œ€ํ‘œ์ ์œผ๋กœ๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.
  • ํƒœ์Šคํฌ ํ
    • setTimeout(), setInterval(), UI ๋ Œ๋”๋ง, requsetAnimationFrame()
  • ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ
    • Promise, MutationObserver

์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” 2๊ฐœ์˜ ํ๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์ฝœ ์Šคํƒ์ด ๋น„๊ฒŒ ๋˜๋ฉด, ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๊บผ๋‚ด์™€์„œ ์‹คํ–‰ํ•œ๋‹ค. ์ด ๋•Œ ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ€์ง€๊ณ  ๋•Œ๋ฌธ์— ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ „๋ถ€ ์‹คํ–‰ํ•˜๊ณ ๋‚˜์„œ ํƒœ์Šคํฌ ํ์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋“ค์„ ์‹คํ–‰ํ•œ๋‹ค. (๋‹จ, UI ๋ Œ๋”๋ง์ด ํƒœ์Šคํฌ ํ์— ์†ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ดํฌ๋กœํƒœ์Šคํฌ ํ์˜ ํƒœ์Šคํฌ๊ฐ€ ๋งŽ์œผ๋ฉด ๋ Œ๋”๋ง์ด ์ง€์—ฐ๋  ์ˆ˜ ์žˆ๋‹ค.)

console.log('์•ˆ๋…•');
setTimeout(() => console.log('ํ!),0);
Promise.resolve().then(() => console.log('๋งˆ์ดํฌ๋กœ ํ!));

์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ๊ฒฐ๊ณผ๋Š” ์ด์™€ ๊ฐ™๋‹ค.

์•ˆ๋…•
๋งˆ์ดํฌ๋กœ ํ!
ํ!

์ฒ˜์Œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋กœ๋“œ๋  ๋•Œ, ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ด๋ผ๋Š” ํƒœ์Šคํฌ๊ฐ€ ๋จผ์ € ํƒœ์Šคํฌ ํ์— ๋“ค์–ด๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ ๋‚˜์„œ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ํƒœ์Šคํฌ ํ์—์„œ ํ•ด๋‹น ํƒœ์Šคํฌ๋ฅผ ๊ฐ€์ ธ์™€ ์ฝœ ์Šคํƒ์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

profile

๊ณต์‚ผ

@g_three

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!