jmjm 2021. 1. 29. 16:07

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ํ•ญ์ƒ ํ—ท๊ฐˆ๋ฆฐ ๋ถ€๋ถ„์ด๋‹ค๐Ÿ˜ฐ ์ด๋ฒˆ์—” ํ™•์‹คํžˆ ๋‹ค์ง€๊ณ  ๋„˜์–ด๊ฐ€์ž


์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์— ๋”ฐ๋ผ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

Call By value ์™€ Call By Reference ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๊นŒ?

๋ฐ”๋กœ Call By Value์ด๋‹ค.

ํ”ํžˆ๋“ค ์ž˜๋ชป ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ์‹ค์ด ํ•œ๊ฐ€์ง€ ์žˆ๋‹ค. ๋ฐ”๋กœ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์›์‹œํƒ€์ž…(Primitive Type)์ธ ๊ฒฝ์šฐ์—๋Š” Call By value์ด๊ณ ,

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๊ฐ์ฒดํ˜•ํƒœ๋ฉด Call By Reference ๋กœ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Š” ์™„์ „ํžˆ ์ž˜๋ชป๋œ ์‚ฌ์‹ค์ด๋‹ค.(๋‚˜๋„ ์ด๋ ‡๊ฒŒ ์•Œ๊ณ  ์žˆ์—ˆ๋‹ค..)

 

Call By Value

  1. argument๋กœ value(๊ฐ’)์ด ๋„˜์–ด์˜จ๋‹ค. ์ด๋•Œ ๋„˜์–ด์˜ฌ ๋•Œ๋Š” "๋ณต์‚ฌ๋œ ๊ฐ’"์ด ๋„˜์–ด์˜จ๋‹ค.
  1. caller(ํ˜ธ์ถœํ•˜๋Š” ์ž)๊ฐ€ ์ธ์ž๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋„˜๊ฒจ์คฌ๊ธฐ ๋•Œ๋ฌธ์— callee(ํ˜ธ์ถœ๋œ ์ž)์—์„œ ๋ฐ›์€ ์ธ์ž๋ฅผ ์•„๋ฌด๋ฆฌ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ caller๋Š” ์˜ํ–ฅ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
  1. ์ธ์ž๋ฅผ ๋„˜๊ฒจ์ค„ ๋•Œ๋งˆ๋‹ค ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฐ„์„ ์žก์•„๋จน๋Š” ๋‹จ์  ์กด์žฌ.
const p = 1;
function change(pri) { // callee
    pri = 10;
}
change(p); // caller
console.log(p);

p๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค. ์ด ๋•Œ 1์ด๋ผ๋Š” ๊ฐ’์€ ๋ณต์‚ฌ๋˜์–ด ์ธ์ž pri์—๊ฒŒ ํ• ๋‹น๋œ๋‹ค. p์™€ pri์˜ ๊ฐ’์€ ๊ฐ™์ง€๋งŒ ๋‘˜ ๋‹ค ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ฒŒ ๋˜์–ด ๋ณ„๊ฐœ์˜ ์กด์žฌ์ด๋‹ค.

์ฆ‰ ์ฒ˜์Œ ์„ ์–ธํ•œ p์™€ changeํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋œ ์ธ์ž๋Š” ๋ณ„๋„์˜ ๊ฐ’์œผ๋กœ ์กด์žฌํ•œ๋‹ค.

๋ณ€์ˆ˜ p(๊ฐ’์ด 1)์™€ changeํ•จ์ˆ˜์—์„œ ์ธ์ž๋กœ ๋„˜๊ฒจ์ง„ p(๊ฐ’์ด 10)๋Š” ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฐ’์ด ๋œ๋‹ค.

 

 

Call By Reference

  1. argument๋กœ reference๊ฐ€ ๋„˜์–ด์˜จ๋‹ค. (reference : ๊ฐ’์— ๋Œ€ํ•œ ์ฐธ์กฐ ์ฃผ์†Œ, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ณ€์ˆ˜)
  1. reference๋ฅผ ๋„˜๊ธฐ๋‹ค ๋ณด๋‹ˆ ํ•ด๋‹น reference๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ’์„ ๋ณต์‚ฌํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
  1. caller๋Š” ์ธ์ž๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋„˜๊ธด ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฐธ์กฐ๊ฐ’์„ ๋„˜๊ฒผ๊ธฐ ๋–„๋ฌธ์— callee๊ฐ€ ๋ฐ›์€ ์ธ์ž๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด caller๋„ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.
  1. ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ํ• ๋‹น์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์œผ๋‚˜, ์›๋ณธ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ํ›ผ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.
const me = {
  name : 'Jimmy'
};
function changeName(person) {
  person.name = 'Joo'
};
console.log(me); // { name : 'Jimmy' }
changeName(me);
console.log(me); // {name : 'Joo' }

๋งค๊ฐœ๋ณ€์ˆ˜ person์— ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ์ง„ me์˜ ์ฐธ์กฐ๊ฐ’์ด ์ „๋‹ฌ. ๋”ฐ๋ผ์„œ me์™€ person๋Š” ๊ฐ™์€ ์ฐธ์กฐ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

changeNameํ•จ์ˆ˜ ์•ˆ์—์„œ person.name์„ ๋ฐ”๊พธ๋ฉด me.name๋„ ๋ณ€ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฌด์กฐ๊ฑด Call By Value๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐํƒ€์ž…์œผ๋กœ ๋„˜๊ฒจ๋„ ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

์ฐธ์กฐ ํƒ€์ž…์„ ์ธ์ž๋กœ ๋„˜๊ธฐ๋ฉด ์ฐธ์กฐ ๊ฐ’์— ๋Œ€ํ•œ ๋ณต์‚ฌ๋ณธ์ด ๋„˜์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ ๊ฐœ๋…๊ณผ๋Š” ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

 

์žฌํ• ๋‹น (Reassingning of Reference Type) Call By Sharing

=== ์—ฐ์‚ฐ์ž๋กœ ์ฐธ์กฐ๊ฐ’์ด ๋™์ผํ•œ์ง€ ๋น„๊ตํ•ด๋ณด์ž.

let obj = { p1 : 10 };
let objCopy = obj;
console.log(obj === objCopy); // true
objCopy = { p2 : 100 };
console.log(obj === objCopy); // false

obj๋ผ๋Š” ๊ฐ์ฒด๋ฅผ ์„ ์–ธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  objCopy์— obj๋ฅผ ํ• ๋‹นํ•œ๋‹ค.

์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์ž„์˜์˜ ์ฃผ์†Œ๊ฐ’์œผ๋กœ ํ‘œํ˜„ํ•ด๋ณด์ž.

 

๋ณ€์ˆ˜๊ฐ’
obj<0x001>
objCopy<0x001>
์ฃผ์†Œ๊ฐ์ฒด
0x001{ p1 : 10 }

์ฒ˜์Œ ํ• ๋‹น๋œ a๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์€ <0x001>์ด๋‹ค.

changeํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ๋˜๋ฉด ์ธ์ž a๊ฐ€ ๋ณต์‚ฌ๋œ๋‹ค. ๋ณต์‚ฌ๋œ ๊ฐ์ฒด obj๋Š” a ๊ฐ์ฒด์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ–๋Š” ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค.

์ฆ‰, obj์™€ a ๋‘๊ฐ€์ง€ ๋ณ€์ˆ˜๊ฐ€ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋‹ค๋Š” ๋œป.

๊ทธ๋ž˜์„œ obj๊ฐ์ฒด์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ฐ์ฒด a์˜ ์†์„ฑ๋„ ๋ณ€๊ฒฝ๋œ๋‹ค.

์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด์ž.

log์— ์ฐํžˆ๋Š” ๊ฐ’์€ ๋ฐ”๋กœ { p1 : 1 } ์ด๋‹ค. ์œ„์—์„œ ๋ณด์•˜๋˜ ์žฌํ• ๋‹น์„ ๊ธฐ์–ตํ•˜๋ฉด์„œ ์ฃผ์†Œ๊ฐ’ ๋ณ€ํ™”๋ฅผ ์‚ดํŽด๋ณด์ž.

const a = { p1 : 1 };

๋ณ€์ˆ˜๊ฐ’
a<0x001>
์ฃผ์†Œ๊ฐ์ฒด
0x001{ p1 : 1 }

 

change(a) ํ˜ธ์ถœ, ์ธ์ž(์ฃผ์†Œ๊ฐ’)๊ฐ€ ๋ณต์‚ฌ.

๋ณ€์ˆ˜๊ฐ’
a<0x001>
obj<0x002>
์ฃผ์†Œ๊ฐ์ฒด
0x001{ p1: 1 }

 

change ํ•จ์ˆ˜ ๋‚ด์— obj = { p1 : 100 }

๋ณ€์ˆ˜๊ฐ’
a<0x001>
obj<0x002>
์ฃผ์†Œ๊ฐ์ฒด
0x001{ p1: 1 }
0x002{ p1 : 100 }

 

๋งˆ์ง€๋ง‰์œผ๋กœ console.log(a)์—์„œ { p1 : 1 }๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

์ฆ‰, ๊ฐ์ฒด๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค. ์ด์œ ๋Š” a ๊ฐ์ฒด๊ฐ€ ์—ฌ์ „ํžˆ <0x001>๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ.

 

 

์ •๋ฆฌ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ Call By value๋กœ ์ธ์ž๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.

Call By value๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์ „๋‹ฌํ•œ ์ธ์ž๊ฐ€ ๋ณต์‚ฌ๋จ์„ ๋œปํ•œ๋‹ค. ํ•˜๋‚˜๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณต!!์‚ฌ!!!!

์ธ์ž๊ฐ€ ๋ณต์‚ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์›์‹œํƒ€์ž…(primitive type)์˜ ๊ฒฝ์šฐ์—๋Š” ํ•จ์ˆ˜ ๋ฐ”๊นฅ์˜ ๋ณ€์ˆ˜์™€ ์„œ๋กœ ๋ณ„๊ฐœ๋กœ ๋™์ž‘ํ•œ๋‹ค.

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

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

 

 

Reference

kim6394.tistory.com/112

velog.io/@jimmyjoo/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%8F%89%EA%B0%80%EC%A0%84%EB%9E%B5-Call-By-Value-vs-Call-By-Reference-vs-Call-By-Sharing

blueshw.github.io/2018/09/15/pass-by-reference/