/
๐Ÿ“™

immutable value vs. mutable value

JavaScript
Table of contents

immutable value vs. mutable value

Primitive TypeObject Type
immutable valuemutable value
๋ณ€์ˆ˜์— ์‹ค์ œ ๊ฐ’ ์ €์žฅ๋ณ€์ˆ˜์— ์ฐธ์กฐ ๊ฐ’(๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ) ์ €์žฅ
Pass by valuePass by reference

immutable value

Primitive Type์˜ ๊ฐ’์€ ๋ถˆ๋ณ€์„ฑ์„ ๊ฐ€์ง„ immutable value์ด๊ธฐ ๋•Œ๋ฌธ์— ์žฌํ• ๋‹น ๋งŒ์ด ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ณ , pass-by-value๋กœ ๊ฐ’์„ ๋ณต์‚ฌํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ง•๋“ค์„ ํ†ตํ•ด ๊ฐ’์˜ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

Primitive Type

์›์‹œ ํƒ€์ž…์˜ ๊ฐ’, Primitive Type์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’(immutable value) ์ด๋‹ค.

๋ถˆ๋ณ€์„ฑ(immutability)

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

๋ถˆ๋ณ€์„ฑ์„ ๊ฐ–๋Š” ๊ฐ’์„ ํ• ๋‹นํ•œ ๋ณ€์ˆ˜๋Š” ์žฌํ• ๋‹น ์™ธ์— ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.
๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด๊ณ  ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ๋Š” ๋ฌธ์ž์—ด๋„ ์›์‹œํƒ€์ž…์ด๋ฏ€๋กœ ๋ฌธ์ž์—ด์ด ์ƒ์„ฑ๋œ ํ›„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ฌธ์ž์—ด์€ ์œ ์‚ฌ ๋ฐฐ์—ด์ด๋ฏ€๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ ๋ฌธ์ž์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ˜์˜๋˜์ง€ ์•Š๊ณ  ์—๋Ÿฌ๋„ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

javascript
var str = 'string';
console.log(str[0]); // s
str[0] = 'm';
console.log(str); // string

Pass by value (๊ฐ’์— ์˜ํ•œ ์ „๋‹ฌ)

Primitive Type์€ ์›๋ณธ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์ „๋‹ฌํ•œ๋‹ค.

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

์œ„์˜ ์„ค๋ช…์„ ์•„๋ž˜์˜ ์ฝ”๋“œ์— ๋น—๋Œ€ ์จ๋ณด๋ฉด, copyNum์— originNum๋ฅผ ํ• ๋‹นํ•  ๋•Œ, copyNum์— originNum์˜ 1๋ฅผ '๋ณต์‚ฌํ•ด ์ƒˆ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ'๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.

javascript
var originNum = 1; // ์›๋ณธ
var copyNum = originNum; // ๋ณต์‚ฌ๋ณธ
copyNum = 2; // ๋ณต์‚ฌํ•œ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์žฌํ• ๋‹น
// originNum๊ณผ copyNum์€ ์„œ๋กœ ๋…๋ฆฝ์ ์ธ ๊ฐ’์ด๋ฏ€๋กœ ์›๋ณธ(originNum)์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค.
console.log(originNum); // 1
console.log(copyNum); // 2

mutable value

Object Type์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ mutable value์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ณ , pass-by-referece๋กœ ๊ฐ’์„ ๋ณต์‚ฌํ•œ๋‹ค.

Object Type

๊ฐ์ฒด ํƒ€์ž…์˜ ๊ฐ’, Object Type์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’(mutable value) ์ด๋‹ค.

Pass by Reference (์ฐธ์กฐ์— ์˜ํ•œ ์ „๋‹ฌ)

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

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

javascript
var originArr = [1, 2, 3, 4]; // ์›๋ณธ ๋ฐฐ์—ด
var copyArr = originArr; // ์›๋ณธ ๋ฐฐ์—ด ๋ณต์‚ฌ
// ๋ณต์‚ฌํ•œ ๋ฐฐ์—ด์—์„œ ๋งˆ์ง€๋ง‰ ์š”์†Œ ์ œ๊ฑฐ
copyArr.pop(); // 4
// ๋ณต์‚ฌํ•œ ๋ฐฐ์—ด๋งŒ์„ ์ˆ˜์ •ํ•˜์˜€๋Š”๋ฐ ์›๋ณธ ๋ฐฐ์—ด๋„ ๊ฐ™์ด ๋ณ€๊ฒฝ ๋˜์—ˆ๋‹ค.
console.log(originArr); // [1, 2, 3]
console.log(copyArr); // [1, 2, 3]

'๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’์ด ํ• ๋‹น ๋œ ๋ณ€์ˆ˜'๋ฅผ ์ˆ˜์ • ํ•˜๋ฉด, 'ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๋ณ€์ˆ˜'๋“ค์— ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ฐ’์„ ๋ณต์‚ฌ ํ• ๋•Œ ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€์ง„ ๊ฐ’ ์ž์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฐธ์กฐ๋งŒ์„ ์ „๋‹ฌํ•ด ๋ณต์‚ฌ ํ•˜๋Š” ๊ฒƒ์„ pass-by-reference๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋Ÿฐ ํŠน์„ฑ ๋•Œ๋ฌธ์— Object Type์„ ์ฐธ์กฐ ํƒ€์ž…(reference type)์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•œ๋‹ค.

๊ฐ์ฒด ํƒ€์ž…์˜ ๊ฐ’์„ ๋‹ค๋ฃฐ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ

์œ„์—์„œ ์‚ดํŽด ๋ณธ ๊ฒƒ ์ฒ˜๋Ÿผ reference type์„ ๋‹ค๋ฃฐ๋•Œ ์›๋ณธ์˜ ๊ฐ’๋„ ๊ฐ™์ด ๋ณ€๊ฒฝ ๋˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊นŠ์€ ๋ณต์‚ฌ(Deep copy)ํ•˜์—ฌ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

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

javascript
// ์›๋ณธ ๋ฐฐ์—ด
const originArr = [1, 2, 3, 4];
// ์›๋ณธ ๋ฐฐ์—ด ๋ณต์‚ฌ
let copyArr = [...originArr];
// ๋ณต์‚ฌํ•œ ๋ฐฐ์—ด์—์„œ ๋งˆ์ง€๋ง‰ ์š”์†Œ ์ œ๊ฑฐ
copyArr.pop(); // 4
// ์›๋ณธ ๋ฐฐ์—ด์— ์˜ํ–ฅ์ด ์—†๋‹ค.
console.log(originArr); // [1, 2, 3, 4]
console.log(copyArr); // [1, 2, 3]

๋˜ํ•œ ๊นŠ๊ณ  ๋ณต์žกํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ์—๋Š” ๋” ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค. (์˜ˆ: ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž ๋งŒ์œผ๋กœ๋Š” Shallow copy๋งŒ ์ด๋ฃจ์–ด ์ง„๋‹ค)

Shallow copy์™€ Deep copy

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

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

ํ€ด์ฆˆ

Q. deep copy์™€ pass by value์˜ ์—ฐ๊ด€์„ฑ

  • A.
    ์›์‹œ ๊ฐ’์€ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์ „๋‹ฌํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ pass by value๋ผ ํ•˜๋Š”๋ฐ ์ด๋•Œ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ deep copy๋ผ๊ณ  ํ•œ๋‹ค.
logo
Things I've Learned