์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๊ณต๋ถํ๋ฉด์ ํญ์ ํท๊ฐ๋ฆฐ ๋ถ๋ถ์ด๋ค๐ฐ ์ด๋ฒ์ ํ์คํ ๋ค์ง๊ณ ๋์ด๊ฐ์
์ธ์๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ํจ์ ํธ์ถ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋๊ฐ์ง๋ก ๋๋๋ค.
Call By value ์ Call By Reference ์ด๋ค. ๊ทธ๋ฌ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ด๋ค ๋ฐฉ์์ผ๋ก ํจ์๋ฅผ ํธ์ถํ ๊น?
๋ฐ๋ก Call By Value์ด๋ค.
ํํ๋ค ์๋ชป ์๊ณ ์๋ ์ฌ์ค์ด ํ๊ฐ์ง ์๋ค. ๋ฐ๋ก ํจ์์ ๋งค๊ฐ๋ณ์๊ฐ ์์ํ์ (Primitive Type)์ธ ๊ฒฝ์ฐ์๋ Call By value์ด๊ณ ,
๋งค๊ฐ๋ณ์๊ฐ ๊ฐ์ฒดํํ๋ฉด Call By Reference ๋ก ๋์ํ๋ค๋ ๊ฒ์ด๋ค.
์ด๋ ์์ ํ ์๋ชป๋ ์ฌ์ค์ด๋ค.(๋๋ ์ด๋ ๊ฒ ์๊ณ ์์๋ค..)
Call By Value
- argument๋ก value(๊ฐ)์ด ๋์ด์จ๋ค. ์ด๋ ๋์ด์ฌ ๋๋ "๋ณต์ฌ๋ ๊ฐ"์ด ๋์ด์จ๋ค.
- caller(ํธ์ถํ๋ ์)๊ฐ ์ธ์๋ฅผ ๋ณต์ฌํด์ ๋๊ฒจ์คฌ๊ธฐ ๋๋ฌธ์ callee(ํธ์ถ๋ ์)์์ ๋ฐ์ ์ธ์๋ฅผ ์๋ฌด๋ฆฌ ์์ ํ๋๋ผ๋ caller๋ ์ํฅ๋ฐ์ง ์๋๋ค.
- ์ธ์๋ฅผ ๋๊ฒจ์ค ๋๋ง๋ค ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๊ณต๊ฐ์ ์ก์๋จน๋ ๋จ์ ์กด์ฌ.
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
- argument๋ก reference๊ฐ ๋์ด์จ๋ค. (reference : ๊ฐ์ ๋ํ ์ฐธ์กฐ ์ฃผ์, ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ด๊ณ ์๋ ๋ณ์)
- reference๋ฅผ ๋๊ธฐ๋ค ๋ณด๋ ํด๋น reference๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๋ณต์ฌํ์ง๋ ์๋๋ค.
- caller๋ ์ธ์๋ฅผ ๋ณต์ฌํด์ ๋๊ธด ๊ฒ์ด ์๋๋ผ ์ฐธ์กฐ๊ฐ์ ๋๊ฒผ๊ธฐ ๋๋ฌธ์ callee๊ฐ ๋ฐ์ ์ธ์๋ฅผ ์์ ํ๋ฉด caller๋ ์ํฅ์ ๋ฐ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ํ ๋น์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ผ๋, ์๋ณธ ๋ฐ์ดํฐ ๊ฐ์ ํผ์ํ ์ ์๋ค.
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
๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ ์ธํ๋ค. ๊ทธ๋ฆฌ๊ณ objCop
y์ 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
blueshw.github.io/2018/09/15/pass-by-reference/