๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

JavaScript

[๋‚ด๋ณด๋‚ด๋ฒˆ] JavaScript - Explaining Value vs. Reference in Javascript

GitHub์— ์žˆ๋Š” 33 Concepts Every JavaScript Developer Should Know ๋ผ๋Š” ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋‚ด์šฉ ์ค‘ ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ์€ ์•„ํ‹ฐํด์„ ๋‚ด๊ฐ€ ์ •๋ฆฌํ•  ๊ฒธ ๊ธฐ์–ตํ•  ๊ฒธ ์ž‘์„ฑํ•˜๋Š” ๋ฒˆ์—ญ๊ธ€์ด๋‹ค. 33๊ฐ€์ง€ ์ค‘ ์„ธ ๋ฒˆ์งธ์ธ ๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜•(Value Types and Reference Types)์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด๋‹ค.

โ€ป ๋‚ด๋ณด๋‚ด๋ฒˆ(๋‚ด๊ฐ€ ๋ณด๋ ค๊ณ  ๋‚ด๊ฐ€ ๋ฒˆ์—ญํ•œ): ์˜์–ด ์ „๊ณต์ž๋„ ํ•ด์™ธ ์œ ํ•™ํŒŒ๋„ ์•„๋‹ˆ๊ธฐ์— ๋ฒˆ์—ญ์—๋Š” ์˜์—ญ, ์˜ค์—ญ, ๊ตฌ๊ธ€ ๋ฒˆ์—ญ์ด ๋ฌด์ˆ˜ํžˆ ๋งŽ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜คํƒ€๋„ ๋งŽ์„ ์ˆ˜ ์žˆ๋‹ค. ์ •ํ™•ํ•œ ๋‚ด์šฉ์€ ์›๋ฌธ์„ ์ง์ ‘ ์‚ดํŽด๋ณด๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ •๋ณด๋“ค์„ ๋” ์ฐพ์•„๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.
(ํ•˜์ง€๋งŒ ๋Œ“๊ธ€ ํ”ผ๋“œ๋ฐฑ๋„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค๐Ÿ˜ƒ )

์ด๋ฒˆ์— ๊ณ ๋ฅธ ์•„ํ‹ฐํด์€ Arnav Aggarwal ๋‹˜์ด ์ž‘์„ฑํ•˜์‹  Explaining Value vs. Reference in Javascript ์ด๋‹ค. ์ค‘๊ฐ„์ค‘๊ฐ„ ์˜ˆ์ œ๋“ค์ด ๊ฐœ๋… ์žก๊ธฐ ์•„์ฃผ ์ข‹์•˜๋‹ค. ๋‚ด์šฉ ์ค‘๊ฐ„์ค‘๊ฐ„๐Ÿค”์ด ์•„์ด์ฝ˜์ด ๋ณด์ธ๋‹ค๋ฉด ๋ณธ๋ฌธ์— ๋‚˜์™€ ์žˆ์ง€ ์•Š์€ ๋ฒˆ์—ญํ•˜๋ฉฐ ์ถ”๊ฐ€ํ•œ ๋ง์ด๋‹ค.
(Primitive type์€ ๊ธฐ๋ณธํ˜•์œผ๋กœ primitive value๋Š” ์›์‹œ ๊ฐ’์œผ๋กœ ๋ฒˆ์—ญํ•˜์˜€๋‹ค.)

 

Medium

 

codeburst.io


์ด ์•„ํ‹ฐํด์€ ๋‚˜์˜ ์˜จ๋ผ์ธ ์ฝ”์Šค์ธ Step Up Your JS: A Comprehensive Guid to Intermediate JavaScript์—์„œ ๋ฐœ์ทŒํ–ˆ๋‹ค. ์ด๊ณณ์—์„œ ์ž์œ ๋กญ๊ฒŒ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ฝ”๋“œ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ์™€ ์˜จ๋ผ์ธ ํ€ด์ฆˆ๋ฅผ ๋ณด๋ผ. 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” 5๊ฐœ์˜ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…: Boolean, null, undefined, String, Number๊ฐ€ ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋“ค์„ ๊ธฐ๋ณธํ˜•์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” 3๊ฐœ์˜ ์ฐธ์กฐ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…: Array, Function, Object๊ฐ€ ์žˆ๋‹ค. ์ด๋“ค์€ ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ๋ชจ๋‘ ๊ฐ์ฒด์ด๊ณ , ๊ทธ๋ž˜์„œ ์ด์นญํ•˜์—ฌ ๊ฐ์ฒด๋ผ๊ณ  ํ•œ๋‹ค. 

๊ธฐ๋ณธํ˜•

๊ธฐ๋ณธํ˜•์ด ๋ณ€์ˆ˜์— ํ• ๋‹น๋œ ๊ฒฝ์šฐ, ์šฐ๋ฆฌ๋Š” ๊ทธ ๋ณ€์ˆ˜๊ฐ€ ์›์‹œ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

var x = 10;
var y = 'abc';
var z = null;

x๋Š” 10์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. y๋Š” 'abc'๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด ๊ฐœ๋…์„ ๊ตณํžˆ๊ธฐ ์œ„ํ•ด์„œ, ์ด ๋ณ€์ˆ˜๋“ค๊ณผ ๊ฐ๊ฐ์˜ ๊ฐ’์ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์— ์ด๋ฏธ์ง€๋ฅผ ์œ ์ง€(maintain)ํ•  ๊ฒƒ์ด๋‹ค. 

์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋“ค์„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ๋•Œ '='๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ’์„ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜๋กœ ๋ณต์‚ฌํ•œ๋‹ค. ๊ทธ๋“ค์€ ๊ฐ’์œผ๋กœ ๋ณต์‚ฌ๊ฐ€ ๋œ๋‹ค. 

var x = 10;
var y = 'abc';

var a = x;
var b = y;

console.log(x, y, a, b); // -> 10, 'abc', 10, 'abc'

a์™€ x ๋ชจ๋‘ 10์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. b์™€ y ๋ชจ๋‘ 'abc'๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ทธ๋“ค์€ ๊ฐ’ ์ž์ฒด๊ฐ€ ๋ณต์‚ฌ๋œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๊ฐœ์ด๋‹ค. 

ํ•˜๋‚˜์˜ ๊ฐ’์ด ๋ฐ”๋€๋‹ค๊ณ  ๋‹ค๋ฅธ ๊ฒƒ๋„ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค. (๐Ÿค”:x๊ฐ€ ๋ฐ”๋€๋‹ค๊ณ  a๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜, b๊ฐ€ ๋ฐ”๋€๋‹ค๊ณ  y๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์Œ.) ๋ณ€์ˆ˜๋Š” ์„œ๋กœ์— ๋Œ€ํ•ด ์•„๋ฌด๋Ÿฐ ๊ด€๊ณ„๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ผ. 

var x = 10;
var y = 'abc';

var a = x;
var b = y;

a = 5;
b = 'def';

console.log(x, y, a, b); // -> 10, 'abc', 5, 'def'

๊ฐ์ฒด

ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๋‚˜์™€ ํ•จ๊ป˜ ์ฐธ๊ณ  ์ฝ์–ด๋ณด์ž. ์ผ๋‹จ ๋‹ค ์ฝ์–ด๋ณด๋ฉด ์‰ฝ๊ฒŒ ๋Š๊ปด์งˆ ๊ฒƒ์ด๋‹ค.

์›์‹œ ๊ฐ’์ด ์•„๋‹Œ ๊ฐ’์ด ํ• ๋‹น๋œ ๋ณ€์ˆ˜๋Š” ํ•ด๋‹น ๊ฐ’์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์ œ๊ณต๋  ๊ฒƒ์ด๋‹ค. ๊ทธ ์ฐธ์กฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ์ฒด์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋ณ€์ˆ˜๋Š” ์‹ค์ œ๋กœ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋Š” ์•Š๋‹ค. 

๊ฐ์ฒด๋Š” ์ปดํ“จํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์˜ ์–ด๋–ค ์žฅ์†Œ์— ์ƒ์„ฑ์ด ๋œ๋‹ค. arr = []๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐฐ์—ด์„ ํ•˜๋‚˜ ์ƒ์„ฑํ•œ ๊ฒƒ์ด๋‹ค. ๋ณ€์ˆ˜ arr๊ฐ€ ๋ฐ›๋Š” ๊ฒƒ์€ ์ฃผ์†Œ ์ฆ‰ ๋ฐฐ์—ด์˜ ์œ„์น˜์ด๋‹ค. 

address๊ฐ€ ๊ฐ’์œผ๋กœ ์ „๋‹ฌ๋ฐ›๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. number๋‚˜ string๊ฐ™์ด ๋ง์ด๋‹ค. address๋Š” ์ฐธ์กฐ๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์˜ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ๋ฌธ์ž์—ด์ด ๋”ฐ์˜ดํ‘œ(''๋‚˜ "")๋กœ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ฃผ์†Œ๋Š” ํ™”์‚ดํ‘œ ๊ด„ํ˜ธ, <>๋กœ ํ‘œ์‹œ๋œ๋‹ค. 

์ฐธ์กฐํ˜• ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ณ  ์‚ฌ์šฉํ•  ๋•Œ ์ž‘์„ฑํ•˜๊ณ  ๋ณด๋Š” ๊ฒƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค: 

1) var arr = [];
2) arr.push(1);

์œ„์˜ ์ฒซ ๋ฒˆ์งธ์™€ ๋‘ ๋ฒˆ์งธ ์ค„์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ‘œํ˜„ํ•˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค: 

1. 

2. 

arr ๋ณ€์ˆ˜์— ๋‹ด๊ธด ๊ฐ’(value)๊ณผ ์ฃผ์†Œ(address)๋Š” ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋œ๋‹ค. arr๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•˜๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” arr์˜ ์œ„์น˜์— ๊ฐ€์„œ ๊ทธ๊ณณ์— ์ €์žฅ๋œ ์ •๋ณด๋กœ ์ž‘์—…ํ•œ๋‹ค. 

์ฐธ์กฐ์— ์˜ํ•œ ํ• ๋‹น

์ฐธ์กฐํ˜•์˜ ๊ฐ’, ์ฆ‰ ๊ฐ์ฒด๊ฐ€ '='๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋กœ ๋ณต์‚ฌ๋˜๋ฉด ํ•ด๋‹น ๊ฐ’์˜ ์ฃผ์†Œ๋Š” ๋งˆ์น˜ ์›์‹œ ๊ฐ’์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณต์‚ฌ๋˜์–ด ๋„˜์–ด๊ฐ„๋‹ค. ๊ฐ์ฒด๋Š” ๊ฐ’ ๋Œ€์‹  ์ฐธ์กฐ๋กœ ๋ณต์‚ฌ๋œ๋‹ค. 

var reference = [1];
var refCopy = reference;

์œ„์˜ ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณด์ธ๋‹ค. 

๊ฐ ๋ณ€์ˆ˜๋Š” ๋™์ผ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ์ฆ‰ reference, refCopy๋ฅผ ๋ณ€๊ฒฝํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค:

reference.push(2);
console.log(reference, refCopy); // -> [1, 2], [1, 2]

2๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ–ˆ๋‹ค. reference์™€ refCopy๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๊ฐ™์€ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค. 

์ฐธ์กฐ ์žฌํ• ๋‹น

์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ์žฌํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ์ด์ „ ์ฐธ์กฐ๊ฐ€ ๋Œ€์ฒด๋œ๋‹ค.

var obj = { first: 'reference' };

 ๋ฉ”๋ชจ๋ฆฌ ๋‚ด:

๋‘ ๋ฒˆ์งธ ๋ผ์ธ์„ ์ถ”๊ฐ€ํ•˜๋ฉด:

var obj = { first: 'reference' };
obj = { second: 'ref2' }

obj์— ์ €์žฅ๋œ ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๊ฐ์ฒด๋Š” ์—ฌ์ „ํžˆ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๊ณ  ๋‹ค์Œ ๊ฐœ์ฒด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. 

์œ„์˜ #234์™€ ๊ฐ™์ด ๋‚จ์•„์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์ด ์—†์œผ๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ•ด๋‹น ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ชจ๋“  ์ฐธ์กฐ๋ฅผ ์žƒ์—ˆ๊ณ , ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์—”์ง„์€ ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ, ๊ฐ์ฒด {first: 'reference'}๋Š” ๋” ์ด์ƒ ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์œ„ํ•ด ์—”์ง„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

==์™€ ===

๋™๋“ฑ ์—ฐ์‚ฐ์ž ==์™€ ===๊ฐ€ ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜์— ์‚ฌ์šฉ๋  ๋•Œ, ๊ทธ๋“ค์€ ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•œ๋‹ค. ๋ณ€์ˆ˜๊ฐ€ ๋™์ผํ•œ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ฐธ์กฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉด, ๋น„๊ต์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋Š” true๊ฐ€ ๋œ๋‹ค. 

var arrRef = [’Hi!’];
var arrRef2 = arrRef;

console.log(arrRef === arrRef2); // -> true

๋งŒ์•ฝ ๊ทธ๋“ค์ด ๋ณ„๊ฐœ์˜ ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ, ๋™์ผํ•œ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜์—ฌ๋„ ๋น„๊ต์˜ ๊ฒฐ๊ณผ๋Š” false ์ผ ๊ฒƒ์ด๋‹ค. 

var arr1 = ['Hi!'];
var arr2 = ['Hi!'];

console.log(arr1 === arr2); // -> false

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

var arr1str = JSON.stringify(arr1);
var arr2str = JSON.stringify(arr2);

console.log(arr1str === arr2str); // true

๋‹ค๋ฅธ ์˜ต์…˜์€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉด์„œ ๊ฐ ์†์„ฑ์ด ๊ฐ™์€์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ผ ๊ฒƒ์ด๋‹ค. 

ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ „๋‹ฌ

์›์‹œ ๊ฐ’์„ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ๋•Œ, ํ•จ์ˆ˜๋Š” ์ž์‹ ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ฐ’์„ ๋ณต์‚ฌํ•œ๋‹ค. '='๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์‚ฌ์‹ค์ƒ ๋™์ผํ•˜๋‹ค. 

var hundred = 100;
var two = 2;

function multiply(x, y) {
    // PAUSE
    return x * y;
}

var twoHundred = multiply(hundred, two);

์œ„์˜ ์˜ˆ์ œ์—์„œ hundred์— 100์„ ์ฃผ์—ˆ๋‹ค. multiply๋กœ hundred๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ๋ณ€์ˆ˜ x๋Š” ๊ทธ ๊ฐ’ 100์„ ๋ฐ›๋Š”๋‹ค. '=' ํ• ๋‹น์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ’์ด ๋ณต์‚ฌ๋œ๋‹ค. ๋‹ค์‹œ, hundred์˜ ๊ฐ’์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ์—ฌ๊ธฐ multiply์˜ PAUSE ์ฃผ์„์—์„œ ๋ฉˆ์ถ”์—ˆ์„ ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€์— ๋Œ€ํ•œ ์Šค๋ƒ…์ƒท์ด ์žˆ๋‹ค. 

์ˆœ์ˆ˜ ํ•จ์ˆ˜

์™ธ๋ถ€ ์Šค์ฝ”ํ”„์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์›์‹œ ๊ฐ’๋งŒ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ณ  ์ฃผ๋ณ€ ์Šค์ฝ”ํ”„์—์„œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์— ์–ด๋–ค ๊ฒƒ๋„ ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™์œผ๋กœ ์ˆœ์ˆ˜ํ•˜๋‹ค. ๋‚ด๋ถ€์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜์ž๋งˆ์ž ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŠธ ๋œ๋‹ค. 

๊ทธ๋Ÿฌ๋‚˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๋Š” ์ฃผ๋ณ€ ์Šค์ฝ”ํ”„์˜ ์ƒํƒœ๋ฅผ ๋ณ€ํ˜•ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•œ ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐฐ์—ด์— ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ, ์ฃผ๋ณ€ ์Šค์ฝ”ํ”„์˜ ํ•ด๋‹น ๋ฐฐ์—ด์„ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜์—์„œ๋„ ํ•ด๋‹น ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ณ  ๋‚œ ํ›„์— ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์—์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ์œ ์ง€๋œ๋‹ค. ์ด๊ฒƒ์€ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์šด ์›์น˜ ์•Š๋Š” ๋ถ€์ž‘์šฉ์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

Array.map, Array.filter๋ฅผ ํฌํ•จํ•œ ๋งŽ์€ ๊ธฐ๋ณธ ๋ฐฐ์—ด ํ•จ์ˆ˜๋“ค์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ์ž‘์„ฑ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค์€ ๋ฐฐ์—ด ์ฐธ์กฐ๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•˜๊ณ  ์›๋ž˜ ํ•จ์ˆ˜ ๋Œ€์‹  ๋ณต์‚ฌํ•œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์€ ์›๋ณธ ํ•จ์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ฒŒ ํ•ด ์ฃผ๊ณ , ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์—๋„ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉฐ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. 

์ˆœ์ˆ˜ ํ•จ์ˆ˜์™€ ๋น„์ˆœ์ˆ˜(impure) ํ•จ์ˆ˜์˜ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž (๐Ÿค”: impure function์— ๋Œ€ํ•œ ์šฉ์–ด๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ ๊ด€๊ณ„๋กœ ๋น„์ˆœ์ˆ˜๋กœ ์ž‘์„ฑํ•จ.)

function changeAgeImpure(person) {
    person.age = 25;
    return person;
}

var alex = {
    name: 'Alex',
    age: 30
};

var changedAlex = changeAgeImpure(alex);

console.log(alex); // -> { name: 'Alex', age: 25 }
console.log(changedAlex); // -> { name: 'Alex', age: 25 }

์ด ๋น„์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ age ์†์„ฑ์„ 25๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค. ๋ฐ›์€ ์ฐธ์กฐ์— ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ณง๋ฐ”๋กœ alex ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค. person ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์ „๋‹ฌ๋ฐ›์€ ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์— ์ฃผ๋ชฉํ•˜๋ผ. alex์™€ alexChanged๋Š” ๋™์ผํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. person ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ํ•ด๋‹น ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ์ค‘๋ณต๋œ๋‹ค. 

์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ฅผ ์‚ดํŽด๋ณด์ž

function changeAgePure(person) {
    var newPersonObj = JSON.parse(JSON.stringify(person));
    newPersonObj.age = 25;
    return newPersonObj;
}

var alex = {
    name: 'Alex',
    age: 30
};

var alexChanged = changeAgePure(alex);

console.log(alex); // -> { name: 'Alex', age: 30 }
console.log(alexChanged); // -> { name: 'Alex', age: 25 }

์ด ํ•จ์ˆ˜์—์„œ JSON.stringify๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  JSON.parse๋กœ ๊ฐ์ฒด๋กœ ๋‹ค์‹œ ํŒŒ์‹ฑ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ์ €์žฅํ•˜์—ฌ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค. ๊ทธ๋ฐ–์—๋„ ์› ๊ฐ์ฒด๋ฅผ ๋ฃจํ”„๋ฅผ ๋Œ๋ฉด์„œ ๊ฐ ์†์„ฑ์„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋„ ์žˆ์ง€๋งŒ ์œ„์˜ ๋ฐฉ๋ฒ•์ด ์ œ์ผ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋Š” ์›๋ณธ๊ณผ ๊ฐ™์€ ์†์„ฑ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋Š” ๋ณ„๊ฐœ์˜ ๊ฐ์ฒด์ด๋‹ค. 

age ์†์„ฑ์„ ์ƒˆ๋กœ์šด ๊ฐ์ฒด์—์„œ ๋ณ€๊ฒฝํ•  ๋•Œ, ์›๋ณธ์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•˜๋‹ค. ์ž์‹ ์˜ ์Šค์ฝ”ํ”„ ๋ฐ–์— ์žˆ๋Š” ์–ด๋–ค ๊ฐ์ฑ„์—๋„ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†๋Š”๋ฐ ์‹ฌ์ง€์–ด ์ „๋‹ฌ๋ฐ›์€ ๊ฐ์ฒด์—๋„ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์—†๋‹ค. ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋Š” ๋ฐ˜ํ™˜๋˜๊ณ  ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์–ด์•ผ ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์— ์˜ํ•ด ์ˆ˜์ง‘๋˜์–ด ๊ฐ์ฒด๋Š” ๋” ์ด์ƒ ์Šค์ฝ”ํ”„์— ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. 

์Šค์Šค๋กœ ์ ๊ฒ€ํ•ด๋ณด๊ธฐ

๊ฐ’ vs. ์ฐธ์กฐ๋Š” ์ฝ”๋”ฉ ์ธํ„ฐ๋ทฐ์—์„œ ์ž์ฃผ ๋‚˜์˜ค๋Š” ๊ฐœ๋…์ด๋‹ค. ์—ฌ๊ธฐ์— ๋ฌด์—‡์ด ๋กœ๊ทธ ๋˜์–ด ์ถœ๋ ฅ๋˜๋Š”์ง€ ์Šค์Šค๋กœ ์ƒ๊ฐํ•ด๋ณด๋ผ. 

function changeAgeAndReference(person) {
    person.age = 25;
    person = {
        name: 'John',
        age: 50
    };
    
    return person;
}

var personObj1 = {
    name: 'Alex',
    age: 30
};

var personObj2 = changeAgeAndReference(personObj1);

console.log(personObj1); // -> ?
console.log(personObj2); // -> ?

ํ•จ์ˆ˜๋Š” ์ œ์ผ ๋จผ์ € ์ „๋‹ฌ๋ฐ›์€ ์›๋ณธ ๊ฐ์ฒด์˜ age ์†์„ฑ์„ ๋ณ€๊ฒฝํ•œ๋‹ค. ๊ทธ ํ›„ ๋ณ€์ˆ˜์— ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์žฌํ• ๋‹นํ•˜์—ฌ ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์—ฌ๊ธฐ ๋‘ ๊ฐ์ฒด๊ฐ€ ๋ฌด์—‡์„ ์ถœ๋ ฅํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ์ด๋‹ค. 

console.log(personObj1); // -> { name: 'Alex', age: 25 }
console.log(personObj2); // -> { name: 'John', age: 50 }

ํ•จ์ˆ˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•ด ํ•˜๋Š” ํ• ๋‹น์€ ๊ธฐ๋ณธ์ ์œผ๋กœ '='๋กœ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๋ผ. ํ•จ์ˆ˜ ๋‚ด์˜ person ๋ณ€์ˆ˜๋Š” personObj1์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒ˜์Œ์—๋Š” ํ•ด๋‹น ๊ฐ์ฒด์— ์ง์ ‘ ์ž‘์šฉํ•œ๋‹ค. (๐Ÿค”: person ๋ณ€์ˆ˜์—๋Š” personObj1์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ’์ด ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— person.age = 25์— ๋Œ€ํ•ด์„œ personObj1์— ์ง์ ‘ age ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ๋งํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.) person์— ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์žฌํ• ๋‹นํ•˜๋ฉด, person ๋ณ€์ˆ˜๋Š” ์›๋ณธ ๊ฐ์ฒด์— ๋Œ€ํ•ด ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค. 

์ด ์žฌํ• ๋‹น์€ personObj1์ด ์™ธ๋ถ€ ์Šค์ฝ”ํ”„์—์„œ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค. person์€ ์žฌ ํ• ๋‹น๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ์ฐธ์กฐ๋ฅผ ๊ฐ–์ง€ ์ด ์žฌํ• ๋‹น์œผ๋กœ personObj1์ด ๋ณ€๊ฒฝ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค.

์œ„ ๋ธ”๋ก์˜ ์ฝ”๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค: 

var personObj1 = {
    name: 'Alex',
    age: 30
};

var person = personObj1;
person.age = 25;

person = {
  name: 'john',
  age: 50
};

var personObj2 = person;

console.log(personObj1); // -> { name: 'Alex', age: 25 }
console.log(personObj2); // -> { name: 'John', age: '50' }

 ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€์˜ ํ•œ ๊ฐ€์ง€ ์ฐจ์ด์ ์€, person์€ ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋” ์ด์ƒ ์Šค์ฝ”ํ”„์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

๊ทธ๊ฒŒ ์ „๋ถ€์ด๋‹ค. ๊ฐ€์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ผ.