immutable value vs. mutable value
Table of contents
immutable value vs. mutable value
Primitive Type | Object Type |
---|---|
immutable value | mutable value |
๋ณ์์ ์ค์ ๊ฐ ์ ์ฅ | ๋ณ์์ ์ฐธ์กฐ ๊ฐ(๋ฉ๋ชจ๋ฆฌ ์ฃผ์) ์ ์ฅ |
Pass by value | Pass by reference |
immutable value
Primitive Type์ ๊ฐ์ ๋ถ๋ณ์ฑ์ ๊ฐ์ง immutable value์ด๊ธฐ ๋๋ฌธ์ ์ฌํ ๋น ๋ง์ด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๊ณ , pass-by-value๋ก ๊ฐ์ ๋ณต์ฌํ๋ค. ์ด๋ฌํ ํน์ง๋ค์ ํตํด ๊ฐ์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๋ค.
Primitive Type
์์ ํ์ ์ ๊ฐ, Primitive Type์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ(immutable value) ์ด๋ค.
๋ถ๋ณ์ฑ(immutability)
๋ณ์์ ์์ ๊ฐ์ ์ฌํ ๋นํ๋ฉด ์ด์ ์ ์ฐธ์กฐํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฒ๋ฆฌ๊ณ ์๋ก์ด ์์ ๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋๋ค.
๋ถ๋ณ์ฑ์ ๊ฐ๋ ๊ฐ์ ํ ๋นํ ๋ณ์๋ ์ฌํ ๋น ์ธ์ ๋ณ์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์ฌํ ๋นํ ์ ์๋ค๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๊ณ ๊ฐ์ด ์ ์ฅ๋์ด ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ง์ ์์ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋ฌธ์์ด๋ ์์ํ์ ์ด๋ฏ๋ก ๋ฌธ์์ด์ด ์์ฑ๋ ํ ๋ณ๊ฒฝํ ์ ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฌธ์์ด์ ์ ์ฌ ๋ฐฐ์ด์ด๋ฏ๋ก ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ๊ฐ ๋ฌธ์์ ์ ๊ทผํ ์ ์์ง๋ง ํ๋์ ๋ฌธ์์ด์ ๋ณ๊ฒฝํ๋ค๊ณ ํด์ ๋ฐ์๋์ง ์๊ณ ์๋ฌ๋ ๋ฐ์ํ์ง ์๋๋ค.
javascriptvar str = 'string';console.log(str[0]); // sstr[0] = 'm';console.log(str); // string
Pass by value (๊ฐ์ ์ํ ์ ๋ฌ)
Primitive Type์ ์๋ณธ์ ์์ ํ์ง ์๊ณ ๊ฐ์ ๋ณต์ฌํด์ ์ ๋ฌํ๋ค.
'๋ณ์'์ '์์๊ฐ์ ๊ฐ๋ ๋ณ์'๋ฅผ ํ ๋นํ ๋, 'ํ ๋น ๋ฐ๋ ๋ณ์'์ 'ํ ๋น๋๋ ๋ณ์'์ '์์๊ฐ ์์ฒด'๋ฅผ '๋ณต์ฌํด ์๋ก ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์'๋ฅผ ์ ๋ฌํ๋ค. ์์ ๊ฐ์ ๊ฐ๋ ๋ณ์๋ค์ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ๋ฆฌํจ๋ค.
์์ ์ค๋ช ์ ์๋์ ์ฝ๋์ ๋น๋ ์จ๋ณด๋ฉด,
copyNum
์originNum
๋ฅผ ํ ๋นํ ๋,copyNum
์originNum
์1
๋ฅผ '๋ณต์ฌํด ์๋ก ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์'๋ฅผ ์ ๋ฌํ๋ค.
var originNum = 1; // ์๋ณธvar copyNum = originNum; // ๋ณต์ฌ๋ณธcopyNum = 2; // ๋ณต์ฌํ ๋ณ์์ ๊ฐ์ ์ฌํ ๋น// originNum๊ณผ copyNum์ ์๋ก ๋ ๋ฆฝ์ ์ธ ๊ฐ์ด๋ฏ๋ก ์๋ณธ(originNum)์ ๋ณ๊ฒฝ๋์ง ์์๋ค.console.log(originNum); // 1console.log(copyNum); // 2
mutable value
Object Type์ ๊ฐ์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ mutable value์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ์ ์๊ณ , pass-by-referece๋ก ๊ฐ์ ๋ณต์ฌํ๋ค.
Object Type
๊ฐ์ฒด ํ์ ์ ๊ฐ, Object Type์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ(mutable value) ์ด๋ค.
Pass by Reference (์ฐธ์กฐ์ ์ํ ์ ๋ฌ)
๊ฐ์ฒด ๊ฐ์ ๋ณต์ฌ๋ฐ์ ๋ณ์๋ค์ ํ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋๋ค. ๋ณ์์ ๊ฐ์ฒด ๊ฐ์ ๊ฐ๋ ๋ณ์๋ฅผ ํ ๋นํ ๋ ํ ๋น๋๋ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ง ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค.
๊ฐ์ฒด ํ์
์ ์์ ํ์
๊ณผ๋ ๋ค๋ฅด๊ฒ ์ฌํ ๋น ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์ํฅ์ผ๋ก๋ ๊ฐ์ด ๋ณํ ์ ์๋ค.
๋ณต์ฌ ํ ๋ณ์์ ์๋ณธ ๋ณ์๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ๋ณต์ฌํ ๋ณ์์ ๊ฐ์ ์์ ํ๋ฉด ์๋ณธ์ ๊ฐ ๋ํ ๊ฐ์ด ๋ณ๊ฒฝ ๋๋ค.
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 ๋ถํฐ ์ง์ํ๋ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ์ฌ์ฉํด๋ ๋๋ค.
// ์๋ณธ ๋ฐฐ์ด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๋ผ๊ณ ํ๋ค.