ํ๋ก๊ทธ๋๋ฐ์ ๊ณต๋ถํ๋ค๋ฉด call by value, call by reference๋ฅผ ๋ค์ด๋ดค์ ๊ฒ์ด๋ฉฐ,๊ตฌ๊ธ์ ๊ฒ์ํด๋ณด๋ฉด ์ด ๋ ์ฉ์ด๋ฅผ ์ค๋ช ํด์ฃผ๋ ๋ง์ ์๋ฃ๋ค์ด ์กด์ฌํ๋ค. ๊ณต๋ถ๋ฅผ ํ๋ค๊ฐ ์ด ๋ ๊ฐ๋ ์ ๋ํด ๋ ์์ธํ๊ฒ ์์๋ณด๊ณ ์ถ์ด์ ํํผ์น๋ค๋ณด๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฌ์ค call by value๋ง ์กด์ฌํ๋ค๋ ํฅ๋ฏธ๋ก์ด ๊ธ๋ค์ ์ ํ๋ค. ์ฒ์์ ๊ธฐ์กด์ ์๊ณ ์๋ ๊ฐ๋ ๊ณผ ๋ค์์ด๋ ๋๋์ด๋ผ ํผ์กํ๊ฒ ๋๊ปด์ก์ง๋ง, ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฏ์ด๋ณด๋ฉฐ ๊ณต๋ถํ๊ณ ํด๋น ๋ด์ฉ์ ์ ๋ฆฌํ๋ค.
call by ๋ญ์๊ธฐ ํ๋ ๊ฒ์ย ํ๊ฐ ์ ๋ต(Evaluation Strategy) ์ค์ ํ๋์ด๋ค. ์๋๋ ํ๊ฐ ์ ๋ต์ ๋ํ ์ํคํผ๋์์ ์ ์์ด๋ค.
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ํจ์ ํธ์ถ์ ์๊ท๋จผํธ(argument)์ ์์๋ฅผ ์ธ์ ๊ฒฐ์ ํ๊ณ ํจ์์ ์ด๋ค ์ข ๋ฅ์ ๊ฐ์ ํต๊ณผ์ํฌ์ง ๊ฒฐ์ ํ๋ ๊ฒ
ํจ์ ์ธ์์ ๋ฌด์์ ๋์ง๋๋์ ๋ฐ๋ผ, ์ด๋ป๊ฒ ์คํ๋ ์ง์ ๋ํ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
๋ํ์ ์ธ ํธ์ถ ๋ฐฉ๋ฒ๋ค๋ก๋ call by value์ call by reference๊ฐ ์๋ค.
ํธ์ถ ๋ฐฉ๋ฒ๋ค์ ์ดํด๋ณด๊ธฐ ์ ์ parameter(๋งค๊ฐ๋ณ์)์ arguments(์ธ์)์ ๋ํด ์ง๊ณ ๋์ด๊ฐ์ผํ๋ค.
parameter๋ย ํจ์ ์ ์ธ๋ถ์ ์ ์๋๊ณ , arguments๋ย ํจ์ ํธ์ถ๋ถ์์ ์ฌ์ฉ๋๋ค.
์์๋ก ์ดํด๋ณด์
let a = 1;
let func = function(b) { // callee
b = b + 1;
}
func(a); // caller
console.log(a); // 1
๋ณ์ a๋ ์์ ํ์
์ธ ์ซ์ 1์ ์ ์ฅํ๊ณ ์๋ค. ๋ฐ๋ผ์ call by value
์ ํํ๋ก ์๋ํ๋ค. ๋ฐ๋ผ์ caller๊ฐ 1์ arguments๋ก ๋๊ฒจ์ค๋ ๊ทธ ๊ฐ์ ๋ณต์ฌ๋์ด ๋์ด์ค๊ธฐ ๋๋ฌธ์ callee ๋ด๋ถ์์ ์ด๋ ํ ์์
์ ์งํํด๋ ์ ํ ์ํฅ์ ๋ฐ์ง ์์์ ๊ฒฐ๊ณผ์ ์ผ๋ก a ๊ฐ์ ์๋ ๊ฐ์ธ 1์ด ์ฐํ๊ฒ ๋๋ค.
์์๋ก ์ดํด๋ณด์
let a = {};
let func = function(b) { // callee
b.a = 1;
}
func(a); // caller
console.log(a.a); // 1
๊ฐ์๊ธฐ call by sharing ์ด๋ผ๋ ๊ฐ๋ ์ด ํ์ด๋์๋ค. ์ฐ์ ์๋ ์์๋ถํฐ ์ดํด๋ณด์.
function update(num , ref1 , ref2){
num += num
ref1.name = 'updated!'
ref2 = { name : 'changed' }
}
let number = 1;
let object1 = { name : 'updated!'};
let object2 = { name : 'not updated'};
change(number,object1,object2)
console.log(number) // 1
console.log(object1) // {name: 'updated!'}
console.log(object2) // {name: 'not updated'}
number๋ ๋ณ๊ฒฝ๋์ง ์์๊ณ (call by value)
object1์ ๋ณ๊ฒฝ๋์๋ค (call by reference).
์์ ๋ ๊ฒฐ๊ณผ๋ ์ ์์ ์ด๋ค. ํ์ง๋ง object2๋ ๋ณ๊ฒฝ๋์ง ์์๋ค.
์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ๊น? ์ฌ์ค ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋ฌด์กฐ๊ฑด call by value๋ก ์๋ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ call by sharing์ด๋ ๊ฐ๋ ์ผ๋ก ์ค๋ช ํ๋ค.
๋์ํ๋ฅผ ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
object2๋ ๊ฐ์ฒด์ธ ์ฐธ์กฐ ํ์
์ด๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ธ 0x100๊ฐ ๋ด๊ฒจ์๋ค(๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์์๋ก ์ค์ ).
object2์ ๋ํ ์ฐธ์กฐ๊ฐ์ ๋ณต์ฌํ ref2๊ฐ ์๋ก ์์ฑ๋๋ค. ์ด๋๊น์ง๋ ์ฐธ์กฐ๋ ๊ฐ์ด object2์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค.
function update(num , ref1 , ref2)
๊ทธ ์ดํ์,
= ์ฐ์ฐ์๋ก ์ฐธ์กฐ๊ฐ์ ์ฌํ ๋นํ๊ธฐ ๋๋ฌธ์ ref2๋ ์๋ก์ด ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ธ 0x200์ ๊ฐ์ง๊ณ ์๋ค.
let object2 = { name : 'not updated'};
ps)
wiktionary์์ ์ ์ํ call by sharing
ํจ์์ ์ ๋ฌ๋ ์ธ์๊ฐ ํธ์ถ์์๊ฒ ํ์๋๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ๋ ์ ์์ง๋ง(call-by-value์ ๋ฌ๋ฆฌ) ์ธ์๋ก ์ ๋ฌ๋ ํน์ ๋ณ์์ ๋ํ ์ก์ธ์ค๊ฐ ์ ๊ณต๋์ง ์๋ ํ๊ฐ ์ ๋ต(call-by-reference์ ๋ฌ๋ฆฌ).
์ฐธ๊ณ ์๋ฃ
[Java Script] ์์ํ์ ๊ณผ ์ฐธ์กฐํ์ ๐
(์์์ฐ) call by value vs call by reference
์๋ฐ์คํฌ๋ฆฝํธ - Call by value/ Call by reference/ Call by sharing
call by sharing - Wiktionary