๐ ์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ, ์ ์ฌ๋จ
๋ฐ์ดํฐ ํ์
์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ
1. ๋ฐ์ดํฐ ํ์
Data Type
๋ฐ์ดํฐ ํ์
์ ์ข
๋ฅ
- ๊ธฐ๋ณธํ(์์ํ) Primitive Type
์ซ์ Number, ๋ฌธ์์ด String, ๋ถ๋ฆฌ์ธ boolean, NULL, Undefined
ES6) ์ฌ๋ณผ Symbol
- ์ฐธ์กฐํ Reference Type
๊ฐ์ฒด Object, ๋ฐฐ์ด Array, ํจ์ Function, ๋ ์ง Date, ์ ๊ทํํ์ RegExp
ES6) Map, WeakMap, Set, WeakSet ๋ฑ
๊ธฐ๋ณธํ์ ๊ฐ์ด ๋ด๊ธด ์ฃผ์๊ฐ์ ๋ฐ๋ก ๋ณต์ , ์ฐธ์กฐํ์ ๊ฐ์ด ๋ด๊ธด ์ฃผ์๊ฐ๋ค๋ก ์ด๋ฃจ์ด์ง ๋ฌถ์์ ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ฐ์ ๋ณต์ .
๋ฐ์ดํฐ ํ์
์ ๊ดํ ๋ฐฐ๊ฒฝ์ง์
- ํ๋์ ๋ฉ๋ชจ๋ฆฌ ์กฐ๊ฐ ๋นํธ bit, ๊ฐ ๋นํธ๋ ๊ณ ์ ํ ์๋ณ์ Unique identifier๋ฅผ ํตํด ์์น ํ์ธ ๊ฐ๋ฅ
- ๋นํธ๋ฅผ ๋ฌถ์ด ํ๋์ ๋จ์๋ก ์ฌ๊ฒจ ๋ฐ์ดํธ byte๊ฐ ํ์. 1byte = 8bit
- C/C++, Java ๋ฑ ์ ์ ํ์
์ ์ธ์ด๋ ๋ฐ์ดํฐ ํ์
๋ณ๋ก ๋ฉ๋ชจ๋ฆฌ ์์ญ์ 2, 4byte๋ก ๋๋์ด ์ ํจ
- Javascript์ ๊ฒฝ์ฐ ์ซ์๋ ์ ์ํ, ๋ถ๋์์ํ ๊ตฌ๋ถ์์ด 64bit, 8byte๋ฅผ ํ๋ณด
- ๋ชจ๋ ๋ฐ์ดํฐ๋ byte ๋จ์์ ์๋ณ์, ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ Memory Address๋ฅผ ํตํด ์๋ก ๊ตฌ๋ถ, ์ฐ๊ฒฐ ๊ฐ๋ฅ
- ๋ณ์ Variable : ๋ณํ ์ ์๋ ๋ฐ์ดํฐ
- ์๋ณ์ identifier : ๋ณ์๋ช
๋ณ์ ์ ์ธ๊ณผ ๋ฐ์ดํฐ ํ ๋น
// ๋ณ์ ์ ์ธ
var a;
// var๋ ์์ฐ๋ ๊ฒ์ด ์ข๋ค. let์ ๊ถ์ฅํ๋ค. ์ถํ์ ์
๋ฐ์ดํธ ์์
// ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๊ฐ ๋ด๊ธธ ์ ์๋ ๊ณต๊ฐ ๋๋ ๊ทธ๋ฆ
var a; // ๋ณ์ a ์ ์ธ
a = 'abc'; // ๋ณ์ a์ ๋ฐ์ดํฐ ํ ๋น
var a = 'abc'; // ๋ณ์ ์ ์ธ๊ณผ ํ ๋น์ ํ ๋ฌธ์ฅ์ผ๋ก ํํ
๋ณ์ a์ 'abc'๋ฅผ ํ ๋นํ๋ฉด, ๋ณ์์ ๊ฐ์๋ ๋ฐ์ดํฐ ์์ญ์ ์ ์ฅ๋ 'abc'์ ์ฃผ์๊ฐ์ด ์ ์ฅ๋๋ค.
Why? ๊ฐ๋ณ์ ์ด๊ธฐ์. ํจ์จ์ ์ผ๋ก ๋ฌธ์์ด ๋ฐ์ดํฐ์ ๋ณํ์ ์ฒ๋ฆฌํ๋ ค๋ฉด ๋ณ์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋์ ๊ณต๊ฐ์ ๋๋์ด ์ ์ฅํ๋ ๊ฒ์ด ์ต์ .
If a์ 'abc'๊ฐ ์๋ 'abcdef'๋ฅผ ์๋ก ํ ๋นํ ๊ฒฝ์ฐ, 'abc'๊ฐ ์์ ๋๋ ๊ฒ์ด ์๋, 'abcdef'๊ฐ ์๋ก ๋ณ๋์ ๊ณต๊ฐ์ ์ ์ฅ๋์ด ์ด ์ฃผ์๊ฐ์ด ์ ์ฅ๋๋ค.
Example 500๊ฐ์ ๋ณ์๋ฅผ ์์ฑํ์ฌ ๋ชจ๋ ๋ณ์์ ์ซ์ 5๋ฅผ ํ ๋นํ๋ ์ํฉ์ ์๊ฐํด๋ณด์. ์ฃผ์๊ฐ ์ฐธ์กฐ๊ฐ ์๋, ๋ณ์ ๊ณต๊ฐ๋ง๋ค 5๊ฐ ๋์
๋ ๊ฒฝ์ฐ ์ซ์ํ์ 8byte๊ฐ ํ์ํ๊ธฐ์ ์ด 4000(5008)byte๋ฅผ ์ฌ์ฉํ๋ค. ํ์ง๋ง 5๊ฐ ์ ์ฅ๋ ์ฃผ์๋ฅผ ์ฐธ์กฐํ ๊ฒฝ์ฐ 1008(5002+8)byte๋ง ์ฌ์ฉํ๋ฉด ๋๋ค. (์ฃผ์๊ฐ์ 2byte๋ก ๊ณ์ฐ)
- ๊ธฐ์กด ๋ฐ์ดํฐ๋ ์์ ์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ณ์๊ฐ ํ๋๋ ์๊ฒ ๋๋ฉด ๊ฐ๋น์ง ์ปฌ๋ ํฐ(Garbage Collector)์ ์๊ฑฐ ๋์์ด ๋๋ค
๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ
๋ถ๋ณ๊ฐ
- ๋ณ์ variable์ ์์ constant๋ฅผ ๊ตฌ๋ถํ๋ ์ฑ์ง์ '๋ณ๊ฒฝ๊ฐ๋ฅ์ฑ', ๊ทธ๊ฒ์ ๋์์ ๋ณ์ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ์ด๋ค. ํ ๋ฒ ๋ฐ์ดํฐ ํ ๋น์ด ์ด๋ค์ง ๋ณ์ ๊ณต๊ฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฅผ ์ฌํ ๋น์ ํ ์ ์๋์ง ์ฌ๋ถ๊ฐ ๊ด๊ฑด.
- ๋ถ๋ณ์ฑ ์ฌ๋ถ๋ฅผ ๊ตฌ๋ถํ ๋์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ ๋์์ ๋ฐ์ดํฐ ์์ญ ๋ฉ๋ชจ๋ฆฌ์ด๋ค.
// ๋ถ๋ณ์ฑ
var a = 'abc';
a = a + 'def';
var b = 5;
var c = 5;
b = 7;
// 5๊ฐ ์ฌ๋ผ์ง๋ ๊ฒ์ด ์๋, ์ซ์ 7์ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ ๊ฒ.
// ์ซ์, ๋ฌธ์์ด, Boolean, Null, Undefined, Symbol : ๋ถ๋ณ๊ฐ
// ํ ๋ฒ ๋ง๋ค์ด์ง ๊ฐ์ ๊ฐ๋น์ง ์ปฌ๋ ํ
์ ๋นํ์ง ์๋ ํ ์์ํ ๋ณํ์ง ์์.
๊ฐ๋ณ๊ฐ
- ์ฐธ์กฐํ ๋ฐ์ดํฐ์ ๊ธฐ๋ณธ์ ์ธ ์ฑ์ง์ ๊ฐ๋ณ๊ฐ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง *์ค์ ์ ๋ฐ๋ผ ๋ถ๊ฐํ ๊ฒฝ์ฐ๋ ์๊ณ , ์์ ๋ถ๋ณ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์
- *Object.defineProperty, Object.freeze ๋ฑ
// ์ฐธ์กฐํ ๋ฐ์ดํฐ์ ํ ๋น
var obj1 = {
a: 1,
b: 'bbb'
};
obj1.a = 2;
// ๊ธฐ๋ณธํ ๋ฐ์ดํฐ์์ ์ฐจ์ด๋ '๊ฐ์ฒด์ ๋ณ์(ํ๋กํผํฐ) ์์ญ'์ด ๋ณ๋๋ก ์กด์ฌ.
// ๊ฐ์ฒด๊ฐ ๋ณ๋ ํ ์ ํ ์์ญ์ ๋ณ์ ์์ญ, '๋ฐ์ดํฐ ์์ญ'์ ๊ธฐ์กด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๊ทธ๋๋ก ํ์ฉ.
// ๋ฐ์ดํฐ ์์ญ์ ์ ์ฅ๋ ๊ฐ์ ๋ชจ๋ ๋ถ๋ณ๊ฐ, ๋ณ์ ์์ญ์ ๊ธฐ์กด ๊ฐ์ฒด ๋ด๋ถ ๊ฐ๋ง ๋ณ๊ฒฝ๋๋ ๊ฒ.
์ค์ฒฉ ๊ฐ์ฒด Nested Object
// ์ค์ฒฉ๋ ์ฐธ์กฐํ ๋ฐ์ดํฐ(๊ฐ์ฒด)์ ํ๋กํผํฐ ํ ๋น
var obj = {
x: 3,
arr: [3,4,5]
};
obj.arr = 'str';
// ๋ฐฐ์ด์ ๊ฒฝ์ฐ ๋ณ์ ๊ณต๊ฐ ํ๋ณด & ๊ฐ๊ฐ ์ธ๋ฑ์ค๋ฅผ ๋ถ์ฌ
- ์ด๋ค ๋ฐ์ดํฐ์ ๋ํด ์์ ์ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ ๋ณ์์ ๊ฐ์ : ์ฐธ์กฐ์นด์ดํธ
- ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์๊ฑฐ ๋์์ด ๋จ
๋ณ์ ๋ณต์ฌ ๋น๊ต
// ๊ฐ์ฒด์ ํ๋กํผํฐ ๋ณ๊ฒฝ ์
var a = "10"
var b = a;
var obj1 = {c: 10, d: 'ddd'};
var obj2 = obj1;
- ๋ณ์๋ฅผ ๋ณต์ฌํ๋๊ณผ์ ์ ๊ธฐ๋ณธํ ๋ฐ์ดํฐ์ ์ฐธ์กฐํ ๋ฐ์ดํฐ ๋ชจ๋ ๊ฐ์ ์ฃผ์๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ๋๋ ์ ์์ ๋์ผ
- ๋ณต์ฌ ๊ณผ์ ์ ๋์ผํ์ง๋ง ๋ฐ์ดํฐ ํ ๋น ๊ณผ์ ์์ ์ฐจ์ด๊ฐ ์์. ๋ณ์ ๋ณต์ฌ ์ดํ ๋์์์ ํฐ ์ฐจ์ด.
// ์ ์ฝ๋ ์คํ ์ดํ ์ ์ฉ
b = 15;
obj.c = 20;
// ์ด ๊ฒฝ์ฐ, ์๋์ ๊ฐ์ด ํํํ ์ ์๋ค.
a !== b
obj1 === obj2
- ์๋ฐํ ๋งํ๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ ํ์
์ ์ฐธ์กฐํ ๋ฐ์ดํฐ์ผ ์ ๋ฐ์ ์๋ค. ๋ค๋ง, ๊ธฐ๋ณธํ์ ์ฃผ์๊ฐ์ ๋ณต์ฌํ๋ ๊ณผ์ ์ด ํ ๋ฒ๋ง ์ด๋ค์ง๊ณ , ์ฐธ์กฐํ์ ํ ๋จ๊ณ๋ฅผ ๋ ๊ฑฐ์น๊ฒ ๋๋ค๋ ์ฐจ์ด๊ฐ ์์.
// ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ณ๊ฒฝํ์ ๋
var a = 10;
var b = a;
var obj1 = {c: 10, d: 'ddd'};
var obj2 = obj1;
b = 15;
obj2 = {c: 20, d: 'ddd'};
// ์ด ๊ฒฝ์ฐ b์ ๊ฐ์ด obj2๋ ์๋ก์ด ๊ฐ์ฒด๊ฐ ํ ๋น๋์ด ์ฃผ์๊ฐ์ด ๋ณ๊ฒฝ๋จ.
- ์ฐธ์กฐํ ๋ฐ์ดํฐ๊ฐ '๊ฐ๋ณ๊ฐ'์ด๋ผ๊ณ ์ค๋ช
ํ ๋์ '๊ฐ๋ณ'์ ์ฐธ์กฐํ ๋ฐ์ดํฐ ์์ฒด๋ฅผ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ ๊ทธ ๋ด๋ถ์ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ ๋๋ง ์ฑ๋ฆฝ
๋ถ๋ณ ๊ฐ์ฒด Immutable Object
- ๋ด๋ถ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ ๋๋ง๋ค ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌํ ๋นํ๊ธฐ๋ก ๊ท์น์ ์ ํ๊ฑฐ๋, ์๋์ผ๋ก ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋๋ *๋๊ตฌ๋ฅผ ํ์ฉ
- *immutable.js, immer.js, immutability-helper ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ES6์ spread operator,Object.assign ๋ฉ์๋ ๋ฑ๋ ๊ฐ์ ๋ชฉ์ ์ผ๋ก ํ์ฉ
var user = {
name: 'Jaenam',
gender: 'male'
};
var changeName = func