๐Ÿ“ŒLanguage/JavaScript

TIL) ์›์‹œ ์ž๋ฃŒํ˜•๊ณผ ์ฐธ์กฐ ์ž๋ฃŒํ˜•, ์ฐจ์ด์ , reference๋ž€?

hellohailie 2022. 5. 12. 12:58

 

<๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜>

์›์‹œ ์ž๋ฃŒํ˜•(primitive data type) = number, string, boolean, null, undefined ๊ณผ ๊ฐ™์€ ๊ณ ์ •๋œ ์ €์žฅ ๊ณต๊ฐ„์„  ์ฐจ์ง€ํ•˜๋Š” ๋ฐ์ดํ„ฐ

์ฐธ์กฐ ์ž๋ฃŒํ˜•(reference data type) = array, object, function

 

 

 

์›์‹œ ์ž๋ฃŒํ˜•์˜ ํŠน์ง•๊ณผ ์ข…๋ฅ˜

 

string, number, bigint, boolean, undefined, symbol, (null)

 

  • ๋ณต์‚ฌํ•œ๋‹ค๋ฉด ๊ฐ’์„ ๋ณต์‚ฌ
  • ์›์‹œ ์ž๋ฃŒํ˜•์˜ ๋ณด๊ด€ํ•จ์ธ ๋ณ€์ˆ˜์—๋Š” ํ•˜๋‚˜์˜ ์›์‹œ ์ž๋ฃŒํ˜•๋งŒ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. ์ผ์ •ํ•œ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜จ๋‹ค๊ณ  ์˜ˆ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์›์‹œ ์ž๋ฃŒํ˜•์ด ๋‹ด๊ธฐ๋Š” ๋ณด๊ด€ํ•จ์˜ ํฌ๊ธฐ๋Š” ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋ณ€์ˆ˜์—๋Š” ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ์™€๋Š” ๊ด€๊ณ„์—†์ด ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ด์„ ์ˆ˜ ์žˆ๋‹ค. ์›์‹œ ์ž๋ฃŒํ˜•์€ ๊ฐ’ ์ž์ฒด์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅ(immutable)ํ•˜์ง€๋งŒ, ๋ณ€์ˆ˜์— ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜๋Š” ์žˆ๋‹ค.

 

์ฐธ์กฐ ์ž๋ฃŒํ˜•์˜ ํŠน์ง•๊ณผ ์ข…๋ฅ˜

๋ฐฐ์—ด([])๊ณผ ๊ฐ์ฒด({}), ํ•จ์ˆ˜(function(){})

JavaScript์—์„œ ์›์‹œ ์ž๋ฃŒํ˜•์ด ์•„๋‹Œ ๋ชจ๋“  ๊ฒƒ์€ ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด๋‹ค. 

 

  • ๋ณต์‚ฌํ•œ๋‹ค๋ฉด ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌ
  • ์ฐธ์กฐ ์ž๋ฃŒํ˜•์—๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ธฐ๊ฒŒ ๋œ๋‹ค.
  • ๋ณ€์ˆ˜์—๋Š” ํŠน๋ณ„ํ•œ ๋ฐ์ดํ„ฐ ๋ณด๊ด€ํ•จ์„ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ฃผ์†Œ๊ฐ€ ๋‹ด๊ฒจ์žˆ๊ณ , ์ด ์ฃผ์†Œ๋ฅผ ๋”ฐ๋ผ๊ฐ€ ๋ณด๋ฉด ํŠน๋ณ„ํ•œ ๋ฐ์ดํ„ฐ ๋ณด๊ด€ํ•จ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ํŠน๋ณ„ํ•œ ๋ฐ์ดํ„ฐ ๋ณด๊ด€ํ•จ(heap)์—์„œ๋Š” ์ž๊ธฐ ๋งˆ์Œ๋Œ€๋กœ ์‚ฌ์ด์ฆˆ๋ฅผ ๋Š˜๋ ธ๋‹ค๊ฐ€ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. 
  • ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ธ ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋Š” ์›์‹œ ์ž๋ฃŒํ˜•๊ณผ ๋‹ฌ๋ฆฌ ์ €์žฅ ๊ณต๊ฐ„์ด ๊ณ„์† ๋Š˜์–ด๋‚œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด, ๊ทธ๋ฆฌ๊ณ  ํ•จ์ˆ˜๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ์ €์žฅ ๊ณต๊ฐ„์€ ํŠน๋ณ„ํ•œ ์ €์žฅ ๊ณต๊ฐ„(heap)์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋Š” ๋ณ„๋„๋กœ ๊ด€๋ฆฌ๋˜๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋‹ค๋ฃจ๋Š” ๋ณ€์ˆ˜์—๋Š” ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— reference data type์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

์ฐธ์กฐ ์ž๋ฃŒํ˜•์˜ ===(strict equality)๋Š” ์ฃผ์†Œ๊ฐ’์ด ๊ฐ™์€์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์ฐธ์กฐ ์ž๋ฃŒํ˜•์˜ ์ฃผ์†Œ๊ฐ’์€ ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จ์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

์›์‹œ์ž๋ฃŒํ˜•๊ณผ ์ฐธ์กฐ์ž๋ฃŒํ˜•์˜ ์ค‘์š”ํ•œ ์ฐจ์ด์ 

 

 

  • ์›์‹œ ํƒ€์ž… ๋ฐ์ดํ„ฐ๋Š” ๊ฐ ๋ณ€์ˆ˜ ๊ฐ„์˜ ์›์‹œ ํƒ€์ž… ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•  ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ๋ณต์‚ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค. 
  • ์ฐธ์กฐ ํƒ€์ž… ๋ฐ์ดํ„ฐ๋Š” ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌํ•œ ๋ฐ์ดํ„ฐ์—์„œ ์›์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ์ฃผ์†Œ์•ˆ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ ๋ฐ์ดํ„ฐ์—๋„ ์˜ํ–ฅ์ด ๊ฐ„๋‹ค. 

 

  • ์›์‹œ ์ž๋ฃŒํ˜•์ด ํ• ๋‹น๋  ๋•Œ์—๋Š” ๋ณ€์ˆ˜์— ๊ฐ’(value) ์ž์ฒด๊ฐ€ ๋‹ด๊ธฐ๊ณ , ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด ํ• ๋‹น๋  ๋•Œ๋Š” ๋ณด๊ด€ํ•จ์˜ ์ฃผ์†Œ(reference)๊ฐ€ ๋‹ด๊ธด๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ฐธ์กฐ ์ž๋ฃŒํ˜•์€ ๊ธฐ์กด์— ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ณด๊ด€ํ•จ์ด ์•„๋‹ˆ๋ผ, ๋™์ ์œผ๋กœ ํฌ๊ธฐ๊ฐ€ ๋ณ€ํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ณด๊ด€ํ•จ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 


let first = [10, 20, 30, 40];
let second = first;
second[0] = 5;

first์˜ 0๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ์žˆ๋Š” ์š”์†Œ๋Š” 5์ด๋‹ค. true

first์™€ second๋Š” ๊ฐ™์€ ์ฃผ์†Œ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์žˆ๋‹ค. true // ๋ฐฐ์—ด์€ ์ฐธ์กฐ์ž๋ฃŒํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

first์™€ second๋Š” ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด๋‹ค. true

first === second๋Š” true๋‹ค. true // second๋Š” first๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ฃผ์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

 


console.log([1,2,3] === [1,2,3]); // false

์ฐธ์กฐ ์ž๋ฃŒํ˜•์˜ ===(strict equality)๋Š” ์ฃผ์†Œ๊ฐ’์ด ๊ฐ™์€์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์ฐธ์กฐ ์ž๋ฃŒํ˜•์˜ ์ฃผ์†Œ๊ฐ’์€ ๋‹ค๋ฅด๋‹ค๊ณ  ํŒ๋‹จ์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

์ปดํ“จํ„ฐ๊ฐ€ ์œ„ ์ฝ”๋“œ๋ฅผ ์ฝ์œผ๋ฉด์„œ, ์ด๋ฏธ ๋‘ ๊ฐœ์˜ heap ์ €์žฅ ๊ณต๊ฐ„์˜ ์ฃผ์†Œ๋ฅผ ํ™•๋ณดํ•œ ๊ฒƒ์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค. ๋ฐฐ์—ด([])๊ณผ ๊ฐ์ฒด({}) ๋“ฑ ์ฐธ์กฐ ์ž๋ฃŒํ˜•์„ ์ฝ์„ ๋•Œ, ๋ฏธ๋ฆฌ ์ฃผ์†Œ๊ฐ’๊ณผ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์„ ์žก์•„๋‘”๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ [] === [] ๋„ true๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

 

 

 

์ปดํ“จํ„ฐ๊ณตํ•™์—์„œ์˜ reference๋ž€!?

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

 

๋ณ€์ˆ˜(variable)๋Š” ํ•˜๋‚˜์˜ ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ํ™•๋ณดํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์ž์ฒด ๋˜๋Š” ๊ทธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ™์ธ ์ด๋ฆ„์ด๋‹ค. 

๋ณ€์ˆ˜๋Š” ๊ฐ’์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒ์ง•์ ์ธ ์ด๋ฆ„์ด๋‹ค. ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‹๋ณ„์ž(identifier)๋ผ๊ณ ๋„ ํ•œ๋‹ค. 

๋ณ€์ˆ˜์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ํ• ๋‹น(assignment)/๋Œ€์ž…/์ €์žฅ์ด๋ผ๊ณ  ํ•˜๊ณ , ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์„ ์ฝ์–ด ๋“ค์ด๋Š” ๊ฒƒ์„ ์ฐธ์กฐ(reference)๋ผ๊ณ  ํ•œ๋‹ค. 

์‹๋ณ„์ž๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ๋‹ค. 

์ฐธ๊ณ ๋กœ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋“ฑ์˜ ์ด๋ฆ„์€ ๋ชจ๋‘ ์‹๋ณ„์ž๋‹ค!! ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์กด์žฌํ•˜๋Š” ์–ด๋–ค ๊ฐ’์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„์€ ๋ชจ๋‘  ์‹๋ณ„์ž๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.