JS ๊ฐœ๋… ์ •๋ฆฌ

FeRo ํŽ˜๋กœยท2022๋…„ 7์›” 1์ผ
2
post-thumbnail

๐Ÿค JavaScript์˜ ์ž๋ฃŒํ˜•๊ณผ JavaScript๋งŒ์˜ ํŠน์„ฑ์€ ๋ฌด์—‡์ผ๊นŒ ?

  • ๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด
  • JavaScript ํ˜•๋ณ€ํ™˜
  • ==, ===
  • ๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด์˜ ๋ฌธ์ œ์ ์€ ๋ฌด์—‡์ด๊ณ  ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋ฌด์—‡์ด ์žˆ์„์ง€ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”.
  • undefined์™€ null์˜ ๋ฏธ์„ธํ•œ ์ฐจ์ด๋“ค์„ ๋น„๊ตํ•ด๋ณด์„ธ์š”.

๋Š์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด

C์–ธ์–ด๋Š” ๋Š์Šจํ•œ ํƒ€์ž…์˜ ์–ธ์–ด์ผ๊นŒ? ์•„๋‹ˆ๋‹ค. C์–ธ์–ด๋Š” int num = ... ์ฒ˜๋Ÿผ ์„ ์–ธ์„ ํ•˜๋Š”๋ฐ, num ๋ณ€์ˆ˜์—๋Š” ์ˆซ์ž, ๊ทธ ์ค‘์—์„œ๋„ ์ •์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ผ๊ณ  ๋ชป์„ ๋ฐ•์•„๋‘”๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— '๊ฐ•๋ ฅํ•œ ํƒ€์ž…(Strong typing)'์ด๋ผ๊ณ  ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ JavaScript๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. const num = ...; ์ด๋ผ๊ณ  num ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” String, Object๋ฅผ ๋น„๋กฏํ•œ ๋ชจ๋“  ํƒ€์ž…๋“ค์ด ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  Sementic์ ์ธ ๋ถ€๋ถ„์—์„œ ๋งž์ง€ ์•Š์ง€๋งŒ ์—”์ง„์˜ ๊ด€์ ์—์„œ๋Š” ์ „ํ˜€ ๋ฌธ์ œ ๋  ๊ฒƒ์ด ์—†๋‹ค. ๊ทธ๋ž˜์„œ '๋Š์Šจํ•œ ํƒ€์ž…(Loosely typed)'์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋™์  ์–ธ์–ด์™€ ์ •์  ์–ธ์–ด๋ผ๋Š” ๊ฒƒ๋„ ์ด๋Ÿฐ ์˜๋ฏธ์—์„œ ์ดํ•ด๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ •์ ์–ธ์–ด์ธ C๋Š” ์ฝ”๋“œ์— ์ง€์ •๋œ ์ž๋ฃŒํ˜•์„ ์ปดํŒŒ์ผ ์‹œ์— ๊ฒฐ์ •์„ ํ•˜๋Š”๋ฐ ์ด๋•Œ ์ฝ”๋“œ์— ์ง€์ •๋œ ์ž๋ฃŒํ˜•๊ณผ ๋‹ค๋ฅธ ์ž๋ฃŒ๊ฐ€ ๋“ค์–ด์™€ ์žˆ์œผ๋ฉด C์—์„œ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ทธ ์—๋Ÿฌ, Compile Error๋ฅผ ๋งˆ์ฃผํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ๋™์ ์–ธ์–ด๋Š” ์ปดํŒŒ์ผ ์‹œ ์ž๋ฃŒํ˜•์„ ์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ  ์‹คํ–‰ ์‹œ์— ๊ฒฐ์ •์„ ํ•œ๋‹ค. Run Time ๋•Œ ์‹๋ณ„์ž๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ ์ž๋ฃŒํ˜•์ด ์ •ํ•ด์ง„๋‹ค.

Q. ๊ทธ๋Ÿผ ์œ ์—ฐํ•œ ๋™์ ์–ธ์–ด๊ฐ€ ๋” ์ข‹์€๊ฒŒ ์•„๋‹๊นŒ?

๋‹ค๋ฅด๊ฒŒ ์ƒ๊ฐํ•ด ๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. C์–ธ์–ด์ฒ˜๋Ÿผ ์ •์  ์–ธ์–ด, ๊ฐ•๋ ฅํ•œ ํƒ€์ž…๋„ ์žฅ์ ์ด ์žˆ๋‹ค. ๋ฐ”๋กœ ํƒ€์ž…์˜ ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋ฉด์— ๋™์  ์–ธ์–ด๋Š” ์œ ์—ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ–‰ ๋„์ค‘์— ๋ณ€์ˆ˜์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํƒ€์ž…์ด ๋“ค์–ด๊ฐˆ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด Type Error๋ฅผ ๋งŒ๋‚˜๊ฒŒ ๋œ๋‹ค.

TypeScript๋„ JavaScript์™€ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‹ค๋ฅธ ์ ์ด ํƒ€์ž…์˜ ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ๊ทธ๋งŒํผ ๊ฐœ๋ฐœ์—์„œ ํƒ€์ž…์˜ ์•ˆ์ „์„ฑ์ด๋ž€ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๊ธฐ ๋•Œ๋ฌธ์— TypeScript๋กœ JavaScript์˜ ๋™์ ์ธ ๋ถ€๋ถ„์„ ๋ณด์™„ํ•ด ์ค€ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์˜คํžˆ๋ ค ์œ ์—ฐํ•œ ๋ถ€๋ถ„์ด JavaScript์˜ ํฐ ๋‹จ์ ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


JavaScript ํ˜•๋ณ€ํ™˜

ํ˜•๋ณ€ํ™˜์€ ๊ฐ™์€ ์ž๋ฃŒ'ํ˜•', ์ฆ‰ type์„ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. "1"์ฒ˜๋Ÿผ ๋ฌธ์ž์—ด๋กœ ์ˆซ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด parseInt(1)์„ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  Number(1)์„ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  1*1์„ ํ•ด์ฃผ์–ด๋„ ๋œ๋‹ค. ๊ทธ๋Ÿผ ์™œ ํ˜•๋ณ€ํ™˜์„ ํ•ด์ค„๊นŒ?

	const num1 = "1";
    const num2 = "2";
    let result = num1+num2; // '12'
    result = Number(num1)+Number(num2); // 3

์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ 1+2๋ฅผ ํ•˜๋ฉด 12๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ฆ‰ ํ˜•๋ณ€ํ™˜์„ ํ•˜์ง€ ์•Š์œผ๋ฉด String ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์„ ๋ถ™์—ฌ๋ฒ„๋ฆฌ๋Š” ๊ฒฐ๊ณผ๊ฐ€ result์— ํ• ๋‹น๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰ ์ค„์ฒ˜๋Ÿผ ํ˜• ๋ณ€ํ™˜์„ ํ•ด์ฃผ๊ณ  ์—ฐ์‚ฐ์„ ํ•ด์•ผ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” 3์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์œ„์ฒ˜๋Ÿผ ํ˜•๋ณ€ํ™˜์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ๋ช…์‹œ์  ํ˜•๋ณ€ํ™˜์ด๋ผ๊ณ  ํ•ด์ค€๋‹ค. Number์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์จ์„œ '๋ช…์‹œ'ํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ๋ถ€๋ฅธ๋‹ค.

Q. ๊ทธ๋Ÿผ ๋‹ค๋ฅธ ํ˜•๋ณ€ํ™˜๋„ ์žˆ๋‚˜?

์•”์‹œ์  ํ˜•๋ณ€ํ™˜์ด๋ผ๊ณ  ์žˆ๋‹ค.

	const num1 = 1;
    const num2 = "2";
    let result = num1+num2; // '12'

์œ„ ์ฝ”๋“œ์—์„œ num1์€ Number ํƒ€์ž…์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ String ํƒ€์ž…์ธ num2์™€ ๋”ํ•ด์ฃผ๋‹ˆ๊นŒ '12'๋ผ๋Š” String ํƒ€์ž… ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค. ์ด์ฒ˜๋Ÿผ ๋ช…์‹œ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•˜๋Š”๋ฐ๋„ ์ž๋™์œผ๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ฒƒ์„ ์•”์‹œ์  ํ˜•๋ณ€ํ™˜์ด๋ผ๊ณ  ํ•œ๋‹ค.


==, ===

JavaScript์—์„œ๋Š” ===์ด ์žˆ๋‹ค. ์ฒ˜์Œ์— C๋ฅผ ํ•˜๋‹ค๊ฐ€ ๋„˜์–ด์™”์„ ๋•Œ ๋‹น์—ฐํžˆ ๊ฐ™๋‹ค๋Š” ์—ฐ์‚ฐ์ž๋Š” ==๊ฒ ์ง€ ํ–ˆ๋Š”๋ฐ, ๋‚ด๊ฐ€ ์˜๋„ํ•œ ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ ๋  ๋•Œ๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

	const num1 = '0';
    const num2 = 0;
	console.log(num1==num2); // true
	console.log(num1===num2); // false

๋ฌด์Šจ ์ฐจ์ด๊ธธ๋ž˜ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ถœ๋ ฅํ•ด ์ฃผ๋Š” ๊ฒƒ์ผ๊นŒ? ์—„๊ฒฉํ•œ ๋น„๊ต๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์—ฐํ•œ ๋น„๊ต๋ฅผ ํ•˜๋Š” ๊ฒƒ์˜ ์ฐจ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ==์€ ๊ฐ’์ด ๊ฐ™์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค. ํ•˜์ง€๋งŒ ===์€ ๊ฐ’๊ณผ ์ž๋ฃŒํ˜•์ด ๋ชจ๋‘ ๊ฐ™์•„์•ผ true๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ค€๋‹ค.


undefined์™€ null

NULL. C์–ธ์–ด๋ฅผ ํ•  ๋•Œ ๊ต‰์žฅํžˆ ์ž์ฃผ ๋ดค์—ˆ๊ณ , ๋ณ€์ˆ˜์— garbage value๊ฐ€ ํ• ๋‹น์ด ๋˜์ง€ ์•Š๊ฒŒ ํ•ด์ฃผ๊ณ  ๋ฌธ์žฅ์˜ ๋์„ ํŒ๋ณ„ํ•˜๊ฒŒ ํ•ด์ฃผ๋˜ ๊ณ ๋งˆ์šด ์นœ๊ตฌ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ JavaScript๋กœ ์˜ค๋‹ˆ undefined๋ผ๋Š” ํƒ€์ž…๋„ ์žˆ์—ˆ๋‹ค. ๋‘˜ ๋‹ค ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ค‘ ํ•˜๋‚˜์ด๊ณ  ํ•ด๋‹น ๋ณ€์ˆ˜์— ๊ฐ’์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ์ด ๋‘˜ ์ฐจ์ด๋Š” ๋ญ˜๊นŒ?

undefined๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด์ž ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, var ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ์—”์ง„์€ ์‹คํ–‰ ์ฝ˜ํ…์ŠคํŠธ ์ดˆ๊ธฐํ™” ๊ณผ์ •์—์„œ var์— undefined๋ฅผ ํ• ๋‹นํ•ด ์ค€๋‹ค. ๋งŒ์•ฝ ๋‹ค๋ฅธ ๊ฐ’์ด ํ• ๋‹น๋˜๊ธฐ ์ „์— ์ถœ๋ ฅ์„ ํ•˜๋ฉด undefined๋ผ๊ณ  ์ถœ๋ ฅ๋„ ๋œ๋‹ค.

์ด์— ๋ฐ˜ํ•ด null์€ ์ด ๋ณ€์ˆ˜๊ฐ€ ํ…… ๋น„์–ด์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ์‚ฌ์šฉ์„ ํ•œ๋‹ค. ์ฆ‰ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. undefined์™€๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฐœ๋…์ธ ๊ฒƒ์ด๋‹ค.

๐Ÿค JavaScript ๊ฐ์ฒด์™€ ๋ถˆ๋ณ€์„ฑ์ด๋ž€ ?

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ๋Š๋ƒ์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋Š” ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์˜ ์ฃผ์†Œ๋ฅผ ๋ฐ”๋กœ ๋ฐ›๋Š” ๊ฒƒ์ด๊ณ  ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” '๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š”' ์ฃผ์†Œ๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ€์ง„๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด ๋” ์ž˜ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ

๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ๋Š” ์ด๋ ‡๊ฒŒ 'abc'๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ 5004๋ฅผ ๊ฐ’์œผ๋กœ ๊ฐ€์ง„๋‹ค.

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ

์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ๋Š” ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜๋‹ค. ๋จผ์ € Object๋ผ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฃผ์†Œ 7103๋ถ€ํ„ฐ ๋ฏธ๋ฆฌ ํ™•๋ณดํ•ด ๋‘๊ณ  ๊ทธ ์ฃผ์†Œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ 5002์— ํ• ๋‹น์„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ฃผ์†Œ 5002๋ฅผ obj๊ฐ€ ๊ฐ’์œผ๋กœ ๊ฐ–๊ฒŒ ๋œ๋‹ค.
ํ”„๋กœํผํ‹ฐ๋“ค์˜ ๊ฐ’ ํ• ๋‹น์€ ๊ธฐ๋ณธํ˜• ๋ฐ์ดํ„ฐ์™€ ๊ฐ™๋‹ค. 1๊ณผ 'bbb'๊ฐ€ ์ €์žฅ๋œ ์ฃผ์†Œ๋ฅผ ์ฃผ์†Œ 7103๊ณผ 7104๊ฐ€ ๊ฐ–๊ฒŒ ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ obj๋ฅผ obj2์— ํ• ๋‹นํ•˜๊ณ  obj2์˜ b๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚จ ๋‹ค์Œ์— obj๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž.

	const obj = {
      a: 1,
      b: 'bbb',
    };
	const obj2 = obj;

	obj2.b = 2;
	console.log(obj);
	/*
    obj = {
      a: 1,
      b: 2,
    };
    */

obj์˜ b ํ”„๋กœํผํ‹ฐ๊ฐ€ 2๊ฐ€ ๋˜์—ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ? ๊ทธ๊ฒƒ์€ obj2๋„ obj์™€ ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๋‹ค. ๊ฐ™์€ ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— obj2์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” obj์˜ ์ถœ๋ ฅ์ด ์ €๋ ‡๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

Q. obj2์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œ์ผœ๋„ obj์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ•˜๊ฒŒ ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๋ถˆ๋ณ€ ๊ฐ์ฒด. ํ•œ ๋ฒˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋์„ ๋•Œ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ํ”ํžˆ๋“ค ๊นŠ์€ ๋ณต์‚ฌ๋ผ๊ณ  ํ•˜๋ฉด Spread ์—ฐ์‚ฐ์ž๋ฅผ ์ƒ๊ฐํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” Spread๊ฐ€ ๋จนํž๊นŒ?

	const obj1 = {
      a: 1,
      b: "bbb",
      c: {
        c1: "shallow"
      }
    };

	const obj2 = {
      ...obj1,
      d: "copy done!"
    };

	obj2.c.c1 = "I modified it"

	console.log(obj1.c.c1); // "I modified it"

๊นŠ์€ ๋ณต์‚ฌ๊ฐ€ ์•ˆ๋œ๋‹ค. ์ค‘์ฒฉ๋œ ๊ฐ์ฒด๋Š” ์—ฌ์ „ํžˆ ์–•์€ ๋ณต์‚ฌ๊ฐ€ ๋œ๋‹ค. ์ด๋Ÿด ๋• ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ์™„์ „ํžˆ ๋ณต์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?
๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” JSON ๋ฌธ์ž๋กœ obj1์„ ๋ณ€ํ™˜์‹œ์ผœ์„œ ๊ทธ JSON ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ํŒŒ์‹ฑํ•˜์—ฌ obj2์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒˆ๋กœ์šด obj2๋Š” ํŒŒ์‹ฑ๋œ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฐฉ๋ฒ•์€ ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™๋‹ค.

	const obj1 = {
      a: 1,
      b: "bbb",
      c: {
        c1: "shallow"
      }
    };

	const obj2 = JSON.parse(JSON.stringify(obj1));

	obj2.c.c1 = "I modified it"

	console.log(obj1.c.c1); // "shallow"

๐Ÿค ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ๋Š” ๋ฌด์—‡์ผ๊นŒ ?

์Šค์ฝ”ํ”„, ํ˜ธ์ด์ŠคํŒ…, ๊ทธ๋ฆฌ๊ณ  TDZ

JavaScript์—์„œ ์Šค์ฝ”ํ”„(Scope) ๋ผ๋Š” ๋ง์„ ๊ต‰์žฅํžˆ ์ž์ฃผ ์ ‘ํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ์Šค์ฝ”ํ”„๋Š” JavaScript์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค. ๊ทธ ์ด์œ ๋ฅผ ES3์˜ ๋‚ด์šฉ์—์„œ ์ฐพ์œผ๋ฉด 'Scope Chain์€ ์‹คํ–‰ ์ฝ˜ํ…์ŠคํŠธ์™€ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ ์‹๋ณ„์ž ํ•ด๊ฒฐ์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค'๋ผ๊ณ  ๋‚˜์™€์žˆ๋‹ค. ๋‹ค๋งŒ ES5์—์„œ๋Š” Scope chain์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด ๋‚ด์šฉ์„ ๋ณด๋ฉด ์Šค์ฝ”ํ”„๋ž€ ๋ฒ”์œ„(Scope)๋ฅผ ์ œํ•œํ•˜์—ฌ ์‹๋ณ„์ž๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹๋ณ„์ž ํ•ด๊ฒฐ์€ ๋˜ ๋ญ˜๊นŒ? ์‹๋ณ„์ž ํ•ด๊ฒฐ์€ ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์ฐพ๋Š” ๊ฒƒ์„ ๋งํ•˜๋Š”๋ฐ, ์ด๋•Œ ์Šค์ฝ”ํ”„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ ์Šค์ฝ”ํ”„๋Š” ์‹๋ณ„์ž ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.
์—”์ง„์ด function ํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด function ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๋‚ด๋ถ€ ํ”„๋กœํผํ‹ฐ์ธ [[Scope]]์— ์Šค์ฝ”ํ”„๋ฅผ ์„ค์ •ํ•˜๋Š”๋ฐ, ์ด๋•Œ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค. ์ดํ›„์— ์ด [[Scope]]๋Š” ์‹คํ–‰ ์ปจํƒ์ŠคํŠธ์˜ ์™ธ๋ถ€ ๋ ‰์‹œ์ปฌ ํ™˜๊ฒฝ ์ฐธ์กฐ์—๋„ ๋ฐ”์ธ๋”ฉ ๋œ๋‹ค.

์•ž์„œ 'function ํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.'๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ ์ด ๋ถ€๋ถ„์€ ํ˜ธ์ด์ŠคํŒ…๊ณผ๋„ ์—ฐ๊ฒฐ์ด ๋œ๋‹ค. ํ˜ธ์ด์ŠคํŒ…์€ ์šฉ์–ด๋ณด๋‹ค๋Š” ๊ฐœ๋…์œผ๋กœ ์ ‘๊ทผ์„ ํ•ด์•ผ ํ•œ๋‹ค. ๋ณ€์ˆ˜๋‚˜ ํ•จ์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๋Š” ์œ„์น˜ ์•ž์—์„œ ์‚ฌ์šฉ ๋ฐ ํ˜ธ์ถœ์„ ํ•˜๋Š” ๊ฐœ๋…์ธ๋ฐ ์ด๊ฒŒ ๋˜๋Š” ๊ฒƒ๊ณผ ์•ˆ ๋˜๋Š” ๊ฒƒ์ด ์žˆ๋‹ค.
ํ•จ์ˆ˜ ์„ ์–ธ์‹๊ณผ var ๋ณ€์ˆ˜๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•˜๊ณ  ํ•จ์ˆ˜ ํ‘œํ˜„์‹๊ณผ let, const ๋ณ€์ˆ˜๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์—ฌ๊ธฐ์„œ ํ•จ์ˆ˜ ์„ ์–ธ์‹๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋จผ์ € ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ๋‘˜ ์ฐจ์ด๋Š” ์ฝ”๋“œ๋กœ ํ™•์ธํ•˜๋Š” ๊ฒŒ ํ›จ์”ฌ ๋” ๋ช…ํ™•ํ•˜๋‹ค.

	func1(); // ๋‚˜ ์„ ์–ธ์‹์ž„.
	func2(); // Uncaught ReferenceError: func2 is not defined
	function func1() {
    	console.log("๋‚˜ ์„ ์–ธ์‹์ž„.");
    } ;
	const func2 = function(){
    	console.log("๋‚˜ ํ‘œํ˜„์‹์ž„.");
    };

func1์€ ํ•จ์ˆ˜ ์„ ์–ธ์‹์ด๋‹ค. functionํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋ฐ”๋กœ func1์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๋ฐ˜๋ฉด, func2๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ฑฐ๊ธฐ์— functionํ‚ค์›Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ function์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ• ๋‹นํ•ด์ฃผ๋Š”๋ฐ, ์ด ๋ฐฉ๋ฒ•์ด ํ•จ์ˆ˜ ํ‘œํ˜„์‹์ด๋‹ค. ํฐ ์ฐจ์ด๊ฐ€ ์—†์–ด ๋ณด์ด๋Š” ์ด ๋‘˜์˜ ์ฐจ์ด๋Š” ์•ž์„œ ๋งํ•œ ํ˜ธ์ด์ŠคํŒ…์ด๋ž€ ๊ฐœ๋…์—์„œ ์ฐจ์ด๊ฐ€ ๋‚œ๋‹ค.

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด func1๊ณผ func2๋ฅผ ๊ฐ๊ฐ ์„ ์–ธํ•˜๊ธฐ ์ „์— ํ˜ธ์ถœ์„ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ func1์€ ์ •์ƒ์ ์œผ๋กœ ํ˜ธ์ถœ์ด ๋˜๊ณ , func2๋Š” ์—๋Ÿฌ๋ฅผ ๋ฑ‰์–ด๋ƒˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” 'functionํ‚ค์›Œ๋“œ๋ฅผ ๋งŒ๋‚˜๋ฉด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.'๋ผ๋Š” ๋ง์— ๋‹ด๊ฒจ์žˆ๋‹ค.
JavaScript๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ค๋ฉด ์—”์ง„์€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋‘ ๋ฒˆ ํƒ์ƒ‰์„ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฒซ ๋ฒˆ์งธ ํƒ์ƒ‰ ๊ณผ์ •์—์„œ ํ•จ์ˆ˜ ์„ ์–ธ์‹์„ ์ฐพ์•„๋‚ธ๋‹ค. ๊ทธ๋ฆฌ๊ณ ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์‹๋ณ„์ž ํ•ด๊ฒฐ์„ ํ•œ๋‹ค.

{func1: function์˜ค๋ธŒ์ ํŠธ(์Šค์ฝ”ํ”„ ์„ค์ •)}

๋‘ ๋ฒˆ์งธ ํƒ์ƒ‰ ๊ณผ์ •์—์„œ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค. var๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์‹๋ณ„์ž๋ฅผ ํ•ด๊ฒฐํ•˜๋Š”๋ฐ, var๋Š” ์‹๋ณ„์ž๋ฅผ ์„ค์ •ํ•จ๊ณผ ๋™์‹œ์— undefined๋ฅผ ํ• ๋‹นํ•ด์ฃผ๊ณ , let๊ณผ const๋Š” ๋‹ค์Œ ๋‹จ๊ณ„์ธ ์ฝ”๋“œ ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ์œ„์น˜์— ์™€์„œ์•ผ ์‹๋ณ„์ž๊ฐ€ ํ•ด๊ฒฐ๋œ๋‹ค.

	console.log(num3);
	try{
      console.log(num1);
    } catch{
      console.log("num1์— ๋Œ€ํ•œ ์‹๋ณ„์ž๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
    }
	try{
      console.log(num2);
    } catch{
      console.log("num2์— ๋Œ€ํ•œ ์‹๋ณ„์ž๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
    }
	const num1 = 1;
	let num2 = 2;
	var num3 = 3;
	
	console.log(num1); // 1
	console.log(num2); // 2

์‹คํ–‰์„ ํ•ด๋ณด๋ฉด num3๋Š” ์ถœ๋ ฅ์ด ์ž˜ ๋˜์ง€๋งŒ num1, num2๋Š” catch๋ฌธ์ด ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰ ์‹๋ณ„์ž๊ฐ€ ํ•ด๊ฒฐ์ด ์•ˆ๋œ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ‘์— ์žˆ๋Š” ์ฝ˜์†” ์ถœ๋ ฅ์—์„œ๋Š” ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ์ด ๋œ๋‹ค. ์ด๋•Œ์„œ์•ผ ๋น„๋กœ์†Œ ์‹๋ณ„์ž๊ฐ€ ํ•ด๊ฒฐ์ด ๋œ ๊ฒƒ์ด๋‹ค.

Q. ๊ทธ๋Ÿผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ์–ธ์ œ ์‹๋ณ„์ž ํ•ด๊ฒฐ์ด ๋˜๋‚˜์š”?

ํ•จ์ˆ˜ ํ‘œํ˜„์‹์€ ์ฝ”๋“œ์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๋Š” ์œ„์น˜์— ๊ฐ€์„œ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ณผ์ •์—์„œ functionํ‚ค์›Œ๋“œ๋ฅผ ์‹๋ณ„ํ•˜๋ฉด ๊ทธ๋•Œ์„œ์•ผ function์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•ด์„œ ํ•ด๋‹น ๋ณ€์ˆ˜์— ์„ ์–ธํ•ด์ฃผ๊ณ , ์ด๋•Œ๋ฅผ ๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

์œ„์—์„œ ์„ค๋ช…ํ•œ ๋‚ด์šฉ์ฒ˜๋Ÿผ ํ˜ธ์ด์ŠคํŒ…์ด ์•ˆ๋˜๋Š” ์š”์†Œ๋“ค์€ ์„ ์–ธ๋˜๋Š” ์œ„์น˜ ์•ž์—์„œ ํ˜ธ์ถœ ๋ฐ ์‚ฌ์šฉ์„ ํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์œ„์น˜๋ฅผ TDZ(Temporary Dead Zone)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๐Ÿค ์‹ค์Šต ๊ณผ์ œ

  • ์ฝ˜์†”์— ์ฐํž b ๊ฐ’์„ ์˜ˆ์ƒํ•ด๋ณด๊ณ , ์–ด๋””์—์„œ ์„ ์–ธ๋œ โ€œbโ€๊ฐ€ ๋ช‡๋ฒˆ์งธ ๋ผ์ธ์—์„œ ํ˜ธ์ถœํ•œ console.log์— ์ฐํ˜”๋Š”์ง€, ์™œ ๊ทธ๋Ÿฐ์ง€ ์„ค๋ช…ํ•ด๋ณด์„ธ์š”.
    ์ฃผ์„์„ ํ’€์–ด๋ณด๊ณ  ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค๋ฉด ์™œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๋Š” ์ง€ ์„ค๋ช…ํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์„ธ์š”.
    let b = 1;
    
    function hi () {
    
      const a = 1;

      let b = 100;

      b++;

      console.log(a,b); // 1,101
    
    }
    
    //console.log(a);  // hiํ•จ์ˆ˜ ์•ˆ์— ์„ ์–ธ๋œ const๋ณ€์ˆ˜ a์—๋Š” ํ•จ์ˆ˜ ๋ฐ–์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
    
    console.log(b); // 1
    
    hi();
    
    console.log(b);  // 1
    
[์ฐธ๊ณ ์ž๋ฃŒ]

https://www.youtube.com/watch?v=NvuQ92iltHg

https://okayoon.tistory.com/entry/%EC%BD%94%EC%96%B4-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-%EA%B8%B0%EB%B3%B8%ED%98%95-%ED%83%80%EC%9E%85Primitive-Type%EA%B3%BC-%EC%B0%B8%EC%A1%B0%ED%98%95-%ED%83%80%EC%9E%85Reference-Type

https://stackoverflow.com/questions/61421873/object-copy-using-spread-operator-actually-shallow-or-deep

profile
์ฃผ๋จนํŽด๊ณ  ์ผ์–ด์„œ์„œ ์ฝ”๋”ฉํ•ด

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2022๋…„ 7์›” 1์ผ

๊ตฐ๋”๋”๊ธฐ ์—†๋Š” ์ •๋ฆฌ๋„ค์š”! ์งˆ๋‹ต์œผ๋กœ ์—ฐ์†๋œ ๋ฌธ์ œ๋ฅผ ๋‹ต๋ณ€ํ•ด์ฃผ์‹œ๋‹ˆ๊นŒ ์†์ด ๋‹ค ์‹œ์›ํ•ฉ๋‹ˆ๋‹ค๐Ÿ‘

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2022๋…„ 7์›” 1์ผ

๋„ํ‘œ ๋“ฑ์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ๋„ ์ž˜ํ•ด์ฃผ์‹œ๊ณ , ์ฝ”๋“œ ์˜ˆ์‹œ๊นŒ์ง€ ๋“ค์–ด์ฃผ์…”์„œ ์ดํ•ด๊ฐ€ ์‰ฝ๋„ค์š” :)

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ