๐พ ์์ ํ์ (primitive type)
- ๋ณ์์ ํ ๋น์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ ์์ฒด๊ฐ ์ ์ฅ๋๋ค.
- ์์ ๊ฐ์ ๊ฐ๋ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๋ฉด ์์ ๊ฐ ์์ฒด๊ฐ ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค. (pass-by-value)
โ ์๋ณธ์ ๋ณ๊ฒฝํด๋ ๋ณต์ฌ๋ณธ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค. - ์์ ๊ฐ์ Immutable value(๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๊ฐ). ์ฆ, ํ ๋ฒ ์์ฑ๋ ์์ ์๋ฃํ์ ์ฝ๊ธฐ ์ ์ฉ(read only) ๊ฐ์ด๋ค.
โ ๋ณ์์ ๋ค๋ฅธ ๊ฐ์ ์ฌํ ๋น์ ์๋ก์ด ์์๊ฐ์ด ์์ฑ๋๋ฉฐ, ๋ณ์๊ฐ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐธ์กฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด์ ์ฌ์ฉํ์ง ์๋ ๊ฐ์ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์์ ์ญ์ ๋๋ค. (JavaScript์ ๊ฐ๋น์ง ์ฝ๋ ํฐ(garbage collector) ์๋)
๐พ ๊ฐ์ฒด ํ์ (object/reference type)
- ๋ณ์์ ํ ๋น์ ์ ์ฅ ๊ณต๊ฐ์ ์ฐธ์กฐํ ์ ์๋ ์ฃผ์๊ฐ(address)์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ๋๋ค.
โ ์ด๋ ์ฐธ์กฐ ์๋ฃํ์ ์ ์ฅํ๋ ๊ณต๊ฐ์ ํ(heap)์ด๋ผ๊ณ ํ๋ค. - ์ฐธ์กฐ ๊ฐ์ ๊ฐ๋ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๋ฉด ์ฃผ์๊ฐ์ด ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ค. (Pass-by-reference)
โ ๊ฐ์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ์๋ณธ์ ๋ณ๊ฒฝํ๋ฉด ๋ณต์ฌ๋ณธ๋ ์ํฅ์ ๋ฐ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ ๋ณ์๋ ๊ฐ์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๊ณ ์์ ๋ฟ ๊ฐ ์์ฒด๊ฐ ๋ณต์ฌ๋์๋ค๊ณ ํ ์ ์๋ค. - ์ฐธ์กฐ ๊ฐ์ Mutable value(๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฐ)
๐พ MORE ๐ฅณ
1. ๋ฌธ์์ด์ immutableํ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์์ฑ๋ ๋ฌธ์์ด์ ์ผ๋ถ ๋ฌธ์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
โข ๋ฌธ์์ด์ ํ ๋ฒ ์์ฑ๋๋ฉด, ๋ณ๊ฒฝํ ์ ์๋ค.
let str = "Hello";
str = "JavaScript";
โ ์ฒซ๋ฒ์งธ ๊ตฌ๋ฌธ์ด ์คํ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์ ๋ฌธ์์ด "Hello"๊ฐ ์์ฑ๋๊ณ ์๋ณ์ str์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑ๋ ๋ฌธ์์ด "Hello"์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๋๋ฒ์งธ ๊ตฌ๋ฌธ์ด ์คํ๋๋ฉด ์ด์ ์ ์์ฑ๋ ๋ฌธ์์ด "Hello"๋ฅผ ์์ ํ๋ ๊ฒ์ด ์๋๋ผ ์๋ก์ด ๋ฌธ์์ด "JavaScript"๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์์ฑํ๊ณ ์๋ณ์ str์ ์ด๊ฒ์ ๊ฐ๋ฆฌํจ๋ค. ์ด๋ ๋ฌธ์์ด "Hello"์ "JavaScript"๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ์ ์กด์ฌํ๊ณ ์๋ค. ๋ณ์ str์ ๋ฌธ์์ด "Hello"๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค๊ฐ ๋ฌธ์์ด "JavaScript"๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ณ๊ฒฝ๋์์ ๋ฟ์ด๋ค.
โข ๋ฌธ์์ด์ ๋ฐฐ์ด์ฒ๋ผ ์ธ๋ฑ์ค๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋ ์ ์ฌ๋ฐฐ์ด์ด๋ค.
let str = "JavaScript";
for (let i = 0; i < str.length; i++) {
console.log(str[i]);
}
str[6] = 's';
console.log(str); // JavaScript
โ str[6] = 's'
์ฒ๋ผ ์ด๋ฏธ ์์ฑ๋ ๋ฌธ์์ ์ผ๋ถ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. (read only ๊ฐ์ด๋ฉฐ, immutable ํ๋ค.)
โข ์๋ก์ด ๋ฌธ์์ด์ ์ฌํ ๋น ํ๋ ๊ฒ์ ๊ฐ๋ฅํ๋ค.
let str = "JavaScript";
console.log(str) // JavaScript
str = "Hello, world";
console.log(str) // Hello, world
str = str.toUpperCase();
console.log(str) // HELLO, WORLD
2. Pass-by-reference์ Pass-by-value
โข Pass-by-reference
๊ฐ์ฒด ํ์ ์ ๊ฐ์ฒด์ ๋ชจ๋ ์ฐ์ฐ์ด ์ค์ ๊ฐ์ด ์๋ ์ฐธ์กฐ๊ฐ์ผ๋ก ์ฒ๋ฆฌ๋๋ค. ๊ฐ์ฒด ํ์ ์ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝ, ์ถ๊ฐ, ์ญ์ ๊ฐ ๊ฐ๋ฅํ mutableํ ๊ฐ์ด๋ค. ๋์ ์ผ๋ก ๋ณํํ ์ ์์ผ๋ฏ๋ก ์ด๋ ์ ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํด์ผ ํ๋์ง ์์ธกํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฐํ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ๊ณ ๋ฉ๋ชจ๋ฆฌ์ ํ ์์ญ(Heap Segment)์ ์ ์ฅ๋๋ค.
๋ณ์ a์ b๋ฅผ ํ ๋น์ ๊ฐ์ฒด๋ ๋ณต์ฌ๋์ง ์๊ณ , ์ฐธ์กฐ(Reference) ๋ฐฉ์์ผ๋ก ์ ๋ฌ๋๋ค.
// Pass-by-reference
let obj = { num: 100 }
let copy = obj;
console.log(obj.num, copy.num) // 100 100
console.log(obj === copy) // true
copy.num = 200;
console.log(obj.num, copy.num) // 200 200
console.log(obj === copy) // true
โ ๋ณ์ obj๋ ๊ฐ์ฒด ์์ฒด๊ฐ ์๋ ์์ฑ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ์ ์ ์ฅํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ณ์ copy์๋ ๊ฐ์ ์ฐธ์กฐ๊ฐ์ด ์ ์ฅ๋๋ค. ๋ฐ๋ผ์ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด์ num ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ณ์ obj, copy ๋ชจ๋ ๋ณ๊ฒฝ๋ ๊ฐ์ ์ฐธ์กฐํ๊ฒ ๋๋ค.
let obj = { num: 100 };
let obj2 = { num: 100 };
console.log (obj === obj2) // false
โ obj์ obj2๋ ๋ด์ฉ์ ๊ฐ์ง๋ง ๋ณ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฐธ์กฐ๊ฐ์ ํ ๋นํ๊ธฐ ๋๋ฌธ์ ๋ ๋ณ์์ ์ฐธ์กฐ๊ฐ์ ๊ฐ์ง ์๋ค.
โข Pass-by-value
์์ ํ์ ์ ๊ฐ(value)์ผ๋ก ์ ๋ฌ๋๋ค. ์ฆ, ๋ณต์ฌ๋์ด ์ ๋ฌ๋๋ฉฐ ์ด๋ฅผ pass-by-value(๊ฐ์ ์ํ ์ ๋ฌ)๋ผ ํ๋ค.
// Pass-by-value
let a = 1;
let b = a;
console.log(a, b); // 1 1
console.log(a === b); // true
a = 10;
console.log(a, b); // 10 1
console.log(a === b); // false
โ ๋ณ์ a๋ ์์ ํ์ ์ธ ์ซ์ ํ์ 1์ ์ ์ฅํ๊ณ ์์ผ๋ฉฐ, ์์ ํ์ ์ ๊ฐ์ด ๋ณต์ฌ๋์ด ๋ณ์์ ์ ์ฅ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ณ์ b์ ๋ณ์ a๋ฅผ ํ ๋นํ ๊ฒฝ์ฐ, ๋ณ์ a์ ๊ฐ 1์ด ๋ณต์ฌ๋์ด ๋ณ์ b์ ์ ์ฅ๋๋ค.
์๋ฃ์ถ์ฒ: poiemaweb
โ๏ธ ๊ณต๋ถํ๋ฉฐ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค. ์๋ชป๋ ์ ๋ณด๋ ๋ ๊ณต์ ํ ๋ด์ฉ์ด ์์ผ๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์!
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐
'Frontend Dev > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ํดํธ ๋งค๊ฐ๋ณ์์ ๋๋จธ์ง ๋งค๊ฐ๋ณ์ (with arguments ๊ฐ์ฒด) (0) | 2023.05.07 |
---|---|
ํจ์์ ๋งค๊ฐ๋ณ์(parameter)์ ์ธ์(argument ์ ๋ฌ์ธ์) (0) | 2023.05.07 |
์๋ฐ์คํฌ๋ฆฝํธ์ ์๋ฃํ (data type) (0) | 2023.05.02 |
์๋ฐ์คํฌ๋ฆฝํธ ES6 ํ์ดํ ํจ์ ๊ธฐ๋ณธ (0) | 2023.05.02 |
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐํ(return)๋ฌธ ์ฌ์ฉํ๊ธฐ (0) | 2023.04.23 |