๐ Call by Value, Call by reference, Call by sharing
CS ๊ณต๋ถ๋ฅผ ํ๋ฉฐ Call by Value, Call by Reference์ ๋ํด์ ๋ฐฐ์ฐ๊ณ ์๋๋ฐ, ํท๊ฐ๋ฆฌ๋ ๊ธ๋ค์ด ๋ง์๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก JS์์๋ Call by reference, Call by sharing ๋ ์ฉ์ด๋ณด๋ค Call by Value ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ง๋ค. ๋ค์ ์์๋ฅผ ๋ค์ด๋ณด์.
// ์์๊ฐ ๋ณ๊ฒฝ์๋
function foo(argument){
argument = 10;
console.log(argument) // 10
}
// ์ดํดํ๊ธฐ ์ฝ๊ฒ ์์ฑํ ํจ์
function foo(){
let argument = 5;
argument = 10;
console.log(argument) // 10
}
let argument = 5;
foo(argument);
console.log(argument); // 5
์์๊ฐ(Primitive type: string boolean number null undefined)์ ์ฃผ์ ๋์ ๊ฐ ์์ฒด๋ฅผ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ํจ์๋ก ์ ๋ฌํ argument์ ์ค์ ๋ก ํจ์์์ ๋ฐ์ argument์ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ด ๋๋ค. ๋๋ฌธ์ ์ฒซ๋ฒ์งธ ํจ์ ๋ด๋ถ์ argument console.log๋ 10์ด๋๊ณ , ํจ์ ๋ฐ์์์ argument console.log๋ 5๊ฐ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด, ์์๊ฐ(Primitive type)์ด ์๋ ๊ฐ์ฒด(Object)์ ์์ฑ์ ๋ณ๊ฒฝํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
// ๊ฐ์ฒดํ์
์ ์์ฑ ๋ณ๊ฒฝ
function foo(argument){
argument.a = 5
console.log(argument) // { a : 5 }
}
// ์ดํดํ๊ธฐ ์ฝ๊ฒ ์์ฑํ ํจ์
function foo(){
let arguments = argument
argument.a = 10
console.log(arguments) // { a : 5 }
}
let argument = {a: 5}
foo(argument)
console.log(argument) // { a : 5 }
๊ฐ์ฒดํ์
์ ์ธ์๋ ์ฃผ์๊ฐ์ ๊ฐ๋ ์๋ก์ด ๋ณ์๊ฐ ๋๋๋ฐ, ์ด๋๋ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๋ค ๋ฐ๋ผ์ ํจ์๋ด๋ถ์ argument๊ฐ ๋ฐ๋๋ฉด ํจ์ ์ธ๋ถ์ argument๋ ๊ฐ์ด ๋ฐ๋๋ค. ์ฆ ํจ์ ๋ด๋ถ์ ๊ฐ๊ณผ ์ธ๋ถ์ ๊ฐ์ด ํจ์ ๋ด๋ถ์ ๊ฐ์ผ๋ก ๋ฐ๋๋ค. ๊ทธ๋ผ ๋ง์ง๋ง์ผ๋ก ๋ค์์ ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ฌ๊น?
function foo(argument){
argument = 5;
console.log(argument) // ?
}
let argument = {a: 10}
foo(argument)
console.log(argument) // ?
์ฝ๋์ ํ๋ฆ์ ์ดํด๋ณด๋ฉด ์ด๋๋ ํจ์๋ก ๋์ด๊ฐ๋ argument๋ ๊ฐ์ฒด, ํจ์ ๋ด๋ถ์์ argument๋ ์์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๋ค. ์ด๋๋ ์์ฑ์ ์์ ํ๊ฒ์ด ์๋ ๊ฐ ์ ์ฒด๋ฅผ ๋ฐ๊พธ๋๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํจ์๋ด๋ถ๋ 5, ํจ์์ธ๋ถ๋ {a : 10}๋ก ๋์ค๊ฒ๋๋ค.
๋ง์ฝ, c, c++์ ๊ฐ์ด call by reference๊ฐ ์กด์ฌํ๋ ์ธ์ด๋ผ๋ฉด ๊ฐ์ด ํจ์ ์ธ๋ถ์ ๊ฐ๋ 5๋ก ๋ฐ๋์์ ๊ฒ์ด๋ค. (๋์ call by sharing์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋๋ฐ ์ด๋ ์ ์ ๋ช
์นญ์ด ์๋๋ผ๋ ๋ง๋ ์์ด ์ฌ์ฉํ์ง ์์๋ค.)
์ง๊ธ๊น์ง์ ๋ด์ฉ์ ํ ๋๋ก ์ ๋ฆฌํ๋ฉด ๊ฐ์ฒด์ ์์ฑ์ ์์ ํ ๋๋ ์ฐธ์กฐ ๊ด๊ณ์ง๋ง ๊ฐ ์์ฒด๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ ๊ทธ ๊ด๊ณ๊ฐ ๊นจ์ง๋ค๋ผ๊ณ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์๋ค. ๋, ํจ์ ๋ด์์ ์์๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ๊ฐ์ ๋ฐ๋์ง ์์ง๋ง, ํจ์ ๋ด์์ ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ ๊ฐ์ด ๋ฐ๋๋ค.
๋๊ธ