๐๋ฉด์ ์ ์ํ CS์ง์์ ์ ๋ฆฌํ๋ฉด ์ฝ ๋ฐ์ด ๋ฒจ๋ฅ(Call by Value)์ ์ฝ ๋ฐ์ด ๋ ํผ๋ฐ์ค(Call by Reference)์ ๋ํด ์ ๋ฆฌํ๊ฒ ๋์๋ค.
"์ฝ ๋ฐ์ด ๋ฒจ๋ฅ(Call by Value)"์ "์ฝ ๋ฐ์ด ๋ ํผ๋ฐ์ค(Call by Reference)"๋ ํจ์๊ฐ ์ธ์๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉ๋๋ ๋ฐฉ์์ ๋ํ๋ธ๋ค.
ํ์ง๋ง ๋๊ฐ์ง๋ ์ด๋ฆ ์ฒ๋ผ ๊ฐ๊ณผ ์ฐธ์กฐ๋ฅผ ํธ์ถํ๋ ์ฐจ์ด๋ฅผ ๊ฐ์ง๋ค.
์ฝ๋ฐ์ด๋ฒจ๋ฅ(Call by Value)๋ ํจ์๊ฐ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๊ฐ์ ๋ณต์ฌํ์ฌ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค.
์ด๋, ์ ๋ฌ๋ ๊ฐ์ ๊ธฐ๋ณธํ, ์ฆ JS์ ์์ ํ์
(primitive type) ๋ฐ์ดํฐ์ธ ๊ฒฝ์ฐ์ ํด๋นํ๋ฉฐ, ๋ณ์๊ฐ ๊ฐ์ง ๊ฐ์ ๋ณต์ฌํ์ฌ ์ ๋ฌํ๋ฏ๋ก ํจ์ ๋ด์์ ๊ฐ์ ๋ณ๊ฒฝํด๋ ์๋ณธ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ๋ถ๋ณ์ฑ(Immutability)์ ์ ์งํ๋ ๋ฐ์ ์ฉ์ดํ๋ค.
function addOne(x) {
x += 1;
return x;
}
let num = 5;
console.log(addOne(num)); // 6
console.log(num); // 5
์ ์์์์ num ๋ณ์๊ฐ ๊ฐ์ง ๊ฐ์ addOne() ํจ์์ ์ธ์๋ก ์ ๋ฌํ๋ฉด, x๋ผ๋ ์๋ก์ด ๋ณ์์ ๊ฐ์ด ๋ณต์ฌ๋๋ค.
addOne() ํจ์ ๋ด์์ x ๊ฐ์ ๋ณ๊ฒฝํด๋ ์๋ณธ num ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
์ฅ์ : ๋ณต์ฌํ์ฌ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์์ ํ๋ค. ์๋์ ๊ฐ์ด ๋ณด์กด์ด ๋๋ค.
๋จ์ : ๋ณต์ฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ์ฉ๋์ด ๋์ด๋๋ค.
์ฝ๋ฐ์ด๋ ํผ๋ฐ์ค(Call by Reference)๋ ํจ์ ํธ์ถ ์ ์ธ์๋ก ์ ๋ฌ๋๋ ๋ณ์์ ์ฐธ์กฐ ๊ฐ์ ํจ์ ๋ด๋ถ๋ก ์ ๋ฌํ๋ ๋ฐฉ์์ด๋ค.
์ด ๋ฐฉ์์์๋ ํจ์ ๋ด์์ ์ธ์๋ก ์ ๋ฌ๋ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด, ํธ์ถํ ์ชฝ์์๋ ํด๋น ๋ณ์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค. ์ด๋ ์ธ์๋ก ์ ๋ฌ๋๋ ๊ฐ์ด ๋ณ์์ ์ฃผ์์ด๋ฏ๋ก, ํจ์ ๋ด์์ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ํด๋น ์ฃผ์์ ์ ์ฅ๋ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ด๋ค.
function addOne(arr) {
arr.push(1);
return arr;
}
let nums = [1, 2, 3];
let result = addOne(nums);
console.log(result); // ์ถ๋ ฅ: [1, 2, 3, 1]
console.log(nums); // ์ถ๋ ฅ: [1, 2, 3, 1] (์๋ณธ ๊ฐ๋ ํจ๊ป ๋ณ๊ฒฝ๋จ)
์์์์ addOne ํจ์์ nums ๋ณ์์ ์ฐธ์กฐ ๊ฐ์ ์ ๋ฌํ๋ฉด, arr ๋ณ์์๋ nums ๋ณ์์ ์ฐธ์กฐ ๊ฐ์ด ๋ณต์ฌ๋๋ค.
๋ฐ๋ผ์, ํจ์ ๋ด๋ถ์์ arr ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ์๋ณธ nums ๊ฐ๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ค.
์ฅ์ : ๋ณต์ฌํ์ง ์๊ณ ์ง์ ์ฐธ์กฐ๋ฅผ ํ๊ธฐ์ ๋น ๋ฅด๋ค.
๋จ์ : ์ง์ ์ฐธ์กฐ๋ฅผ ํ๊ธฐ์ ์๋ ๊ฐ์ด ์ํฅ์ ๋ฐ๋๋ค.(๋ฆฌ์คํฌ)
๐์๋ ๊ฐ์ด ์ํฅ์ ๋ฐ๋ ๋จ์ ์ ๋ณด์ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ฝ ๋ฐ์ด ๋ ํผ๋ฐ์ค๋ ์ฐธ์กฐ ํ์ ์ ์ ๋ฌํ๋ ๋ฐฉ์์ด๋ค. ์ฐธ์กฐ ํ์ ์ ๊ฒฝ์ฐ ๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ์ด ๋ณต์ฌ๋๋ฏ๋ก, ๊ฐ์ฒด ๋ด๋ถ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ์๋ณธ ๊ฐ์ฒด๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์๋ณธ์ ๋ถ๋ณ์ฑ์ ์งํฌ ์ ์๊ฒ๋๋ค. ๋ฐ์ดํฐ์ ์๋ณธ์ด ์์ ๋๋ ๋ถ์์ฌ๊ฐ ๋ฐํํ๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์ด์ ์ ํฌ์คํ ํ ์์๋ณต์ฌ ๊น์๋ณต์ฌ์์ ๊น์๋ณต์ฌ(deep copy)๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
๊น์๋ณต์ฌ(deep copy)๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ์์ ๋ ์๋ณธ์ ์ํฅ์ ์ฃผ์ง์๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์๋ค.
โ๋ฌผ๋ก ๋จ์ ์ ๋ณด์์ ์ํด ๋ณต์ฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํ๊ฒ ๋๊ณ , ์๋์ ์ฅ์ ์ ์์ด๋ฒ๋ฆด ์ ์๋ค.
๋ฐ๋ผ์ ๊น์ ๋ณต์ฌ์ ์ฝ๋ฐ์ด๋ ํผ๋ฐ์ค๋ฅผ ํจ๊ป ์ฌ์ฉํ ๋๋ ์ํฉ์ ๋ฐ๋ผ์ ์ ์ ํ ์ ํํด์ผ ํ ๊ฒ์ด๋ค.
์๋ณธ๋ณ๊ฒฝ์ ํด์ผํ๋ ์ธ์๋ผ๋ฉด ๊ทธ๋๋ก ๋์์ํค๊ณ , ๋ถ๋ณ์ฑ์ ์ง์ผ์ผ ํ๋ค๋ฉด ๊น์๋ณต์ฌ๋ฅผ ์ด์ฉํด์ ๋์์ํฌ ํ์์ฑ์ด ์๊ธธ ๊ฒ์ด๋ค.
์๋๋ ํจ์ ํธ์ถ ์ ์ธ์๋ก ์ ๋ฌ๋๋ ๋ณ์์ ์ฐธ์กฐ ๊ฐ์ ํจ์ ๋ด๋ถ๋ก ์ ๋ฌํ๋ ์ฐธ์กฐ ๊ฐ์ฒด๋ฅผ ๊น์๋ณต์ฌ๋ฅผ ํตํด ์ ๋ฌํ์ฌ, ์๋ณธ์ ๋ถ๋ณ์ฑ์ ์งํค๋ ์์์ด๋ค.
function changeName(obj) {
obj = JSON.parse(JSON.stringify(obj)); // ๊น์ ๋ณต์ฌ
obj.name = 'John';
return obj;
}
let person = { name: 'Jane', age: 25 };
let result = changeName(person);
console.log(result); // ์ถ๋ ฅ: { name: 'John', age: 25 }
console.log(person); // ์ถ๋ ฅ: { name: 'Jane', age: 25 } (์๋ณธ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์์)
์ฐธ๊ณ ์๋ฃ(์ถ์ฒ)
Velog -younoah ํฌ์คํ
'Call by value'์ 'Call by reference' (feet. ์๋ฐ์คํฌ๋ฆฝํธ)
Velog sinclebear ํฌ์คํ
[Javascript] Call by Value vs. Call by Reference์ ์์ ๋ณต์ฌ vs. ๊น์ ๋ณต์ฌ
Chat GPT ๊ฒ์๊ฒฐ๊ณผ [์ฝ ๋ฐ์ด ๋ ํผ๋ฐ์ค๋ฅผ ์ฌ์ฉํ์ ๋ ์๋ณธ์ ๋ถ๋ณ์ฑ์ ์งํค๊ธฐ ์ํ ๋ฐฉ๋ฒ]