๐Ÿ“’

Pass-by-reference vs Pass-by-value

Pass-by-value (๊ฐ’์— ์˜ํ•œ ์ „๋‹ฌ)

primitive type(์›์‹œ ํƒ€์ž…)์—์„œ๋Š” '๊ฐ’ ๊ทธ๋Œ€๋กœ' ์ €์žฅ / ํ• ๋‹น๋˜๊ณ  ๋ณต์‚ฌ๋˜์–ด ์ „๋‹ฌ๋œ๋‹ค.
primitive type์€ ๊ฐ’์ด ํ•œ๋ฒˆ ์ •ํ•ด์ง€๋ฉด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๊ณ  ๊ฐ’์€ ๋Ÿฐํƒ€์ž„์— ๋ฉ”๋ชจ๋ฆฌ์˜ ์Šคํƒ ์˜์—ญ์— ๊ณ ์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ ์œ ํ•˜๊ณ  ์ €์žฅ๋œ๋‹ค.
let x = 1;
JavaScript
๋ณต์‚ฌ
์œ„์™€ ๊ฐ™์ด Primitive type์„ ๊ฐ€์ง„ ๋ณ€์ˆ˜ x๋ฅผ num์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— =๋ฅผ ์‚ฌ์šฉํ•ด ํ• ๋‹นํ•˜๋ฉด, num์—๋Š” x์˜ ๊ฐ’์ด ๋ณต์‚ฌ(copy)๋œ๋‹ค.
JavaScript์—์„œ๋Š” ๋ชจ๋“  function arguments๋Š” ํ•ญ์ƒ passed-by-value์ด๋‹ค.
์ฆ‰, function argument์˜ ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋”๋ผ๋„ function ์™ธ๋ถ€์— ๋ณ€์ˆ˜์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

Pass-by-reference (์ฐธ์กฐ์— ์˜ํ•œ ์ „๋‹ฌ)

reference type์˜ ๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜์— ๊ฐ์ฒด๊ฐ€ ๊ทธ๋Œ€๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” '๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ'์ธ ๊ฐ์ฒด์— ๋Œ€ํ•œ '์ฐธ์กฐ ๊ฐ’'์ด ์ €์žฅ
๋”ฐ๋ผ์„œ ๋ณต์‚ฌํ•œ ์ดํ›„ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ด์ „์˜ ๊ฐ’์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋œ๋‹ค.
==(๋™๋“ฑ์—ฐ์‚ฐ์ž) ===(์ผ์น˜์—ฐ์‚ฐ์ž) ๋น„๊ต ๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š” ์›์‹œ ํƒ€์ž…๊ณผ ๋‹ฌ๋ฆฌ ๊ฐ์ฒด ๋น„๊ต์‹œ์—๋Š” ๋™์ผํ•˜๊ฒŒ ์ „๋‹ฌ
ํ•˜์ง€๋งŒ ๋ฌด์กฐ๊ฑด ์ฐธ์กฐ ํƒ€์ž…์„ ๋„˜๊ธด๋‹ค๊ณ  ํ•ด์„œ ์ „๋ถ€ passed by reference๋Š” ์•„๋‹ˆ๋‹ค.
function changeStuff(a, b, c) { a = a * 10; b.item = "changed"; // b๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ฃผ์†Œ์˜ item ๊ฐ’ ๋ณ€๊ฒฝ c = {item: "changed"}; // c์— ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ฃผ์†Œ ํ• ๋‹น } var num = 10; var obj1 = {item: "unchanged"}; var obj2 = {item: "unchanged"}; changeStuff(num, obj1, obj2); console.log(num); // 10 console.log(obj1.item); // changed console.log(obj2.item); // unchanged
JavaScript
๋ณต์‚ฌ
์œ„ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.
num ๋ณ€์ˆ˜๋Š” primitive type์œผ๋กœ function argument๋กœ ์ „๋‹ฌ ์‹œ passed by value๊ฐ€ ์ด๋ฃจ์–ด์กŒ๋‹ค. ๊ฐ’๋งŒ ๋ณต์‚ฌํ–ˆ์œผ๋ฏ€๋กœ ์™ธ๋ถ€ ๋ณ€์ˆ˜์ธ num์˜ ๊ฐ’์€ ๋ณ€ํ•จ์—†์ด 10์ด๋‹ค.
obj1 ๋Š” ๊ฐ์ฒด๋กœ passed by reference๊ฐ€ ์ด๋ฃจ์–ด์กŒ๋‹ค. ์ฃผ์†Œ๊ฐ’์ด ์ „๋‹ฌ๋˜์—ˆ์œผ๋ฏ€๋กœ b๋Š” obj1๊ณผ ๊ฐ™์€ ๊ณณ์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค. b.item์€ ๊ฒฐ๊ตญ obj1.item ์ด๋ฏ€๋กœ ๊ฐ์ฒด์— ๋ณ€ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋œ๋‹ค.
obj2๋„ ์ฃผ์†Œ๊ฐ’์ด ์ „๋‹ฌ๋˜์—ˆ์ง€๋งŒ c = {item: 'changed'}์—์„œ ์ฐธ์กฐํ•˜๋Š” ์œ„์น˜๊ฐ€ ์•„๋‹Œ ๋ณ€์ˆ˜์— ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด {item: 'changed'} ๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ obj2 ๊ฐ์ฒด์—๋Š” ๋ณ€ํ™”๊ฐ€ ์—†๋‹ค.
argument ์ž์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” argument์— ํ• ๋‹นํ•œ ๋ณ€์ˆ˜์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์ง€๋งŒ, ๋ณ€์ˆ˜์˜ ๋‚ด๋ถ€๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒŒ๋˜๋ฉด ์™ธ๋ถ€ ๋ณ€์ˆ˜์—๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒŒ ๋œ๋‹ค.

Reference