๐ฆ javascript์์ ๊ฐ์ฒด๋?
1. ๊ฐ์
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด(Object)๋ ์ฌ๋ฌ ๊ฐ์ key-value ์์ผ๋ก ์ ์ฅํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ
- ๋์ ์ธ์ด์ธ JavaScript์ ํน์ฑ์ ๊ฐ์ฒด๋ ๋์ ์ผ๋ก ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ง
- ๊ฐ์ฒด๋ ์๋์ ๊ฐ์ด ์ค๊ดํธ
{}
๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑํ ์ ์๋ค
let obj = { a: 10, b: 20 };
- ์ ์์ ์์
a
์b
๋ key์ด๊ณ ,10
๊ณผ20
์ value - ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด๋
key
๊ฐ ๋ฌธ์์ด์ด์ด์ผ ํ๋ค๋ ์ ์ด ํน์ง์ด๋ฉฐ,value
๋ ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ด ๋ ์ ์์ - ๊ทธ๋ผ JavaScript์ ๊ฐ์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ์์์ ์ด๋ป๊ฒ ๊ด๋ฆฌ๋๋์ง, ๊ทธ๋ฆฌ๊ณ C/C++ ๊ตฌ์กฐ์ฒด๋ ํด๋์ค์๋ ์ด๋ป๊ฒ ๋ค๋ฅธ์ง ๊ถ๊ธํ๊ณ , ์ด ๋ฌธ์๋ฅผ ์์ฑํ๊ฒ ๋ ๊ฐ์ฅ ํฐ ๋๊ธฐ๋ถ์ฌ๊ฐ ๋์
2. ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
2.1 JavaScript ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ๊ฐ์ฒด๋ ํ(Heap) ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น
- ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ํฌ๊ธฐ๊ฐ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์, ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ํ์ํ ๊ฒฝ์ฐ
- ๊ฐ์ฒด์ ์ํ ํ๋กํผํฐ๋ ๋ฉ์๋๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ๊ฐ์ผ๋ก ์ ์ฅ๋จ
- ๊ฐ์ฒด ๋ด์ ์ ์ฅ๋ ๋ฐ์ดํฐ์ ์์น๋ ์ฐธ์กฐํ์ ์ผ ๊ฒฝ์ฐ ํ์์ ๋์ ์ผ๋ก ๊ด๋ฆฌ, ์์๊ฐ์ผ ๊ฒฝ์ฐ ์คํ์์ ๊ด๋ฆฌ
- ์๋ฐ์คํฌ๋ฆฝํธ ์์ง(V8์ ๊ฒฝ์ฐ)์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ hidden class์ property storage๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต์ ํํ์ฌ ๊ด๋ฆฌ
+----------------------+
| Hidden Class (Shape) |
| ID: Shape_1 |
| Properties: {a, b} |
| Offsets: {a: 0, b: 1} |
+----------------------+
↓
+-----------------+
| Property Storage |
| a: 10 |
| b: 20 |
+-----------------+
2.2 Hidden Classes์ Property Storage
- ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ๋์ ์ผ๋ก ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์, hidden class๋ผ๋ ๊ฐ๋ ์ด ๋ฑ์ฅํ๋ค๊ณ ํจ
- ๊ฐ์ฒด๊ฐ ์ฒ์ ๋ง๋ค์ด์ง ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ฐ์ฒด์ ํ๋กํผํฐ์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ hidden class๋ก ๊ด๋ฆฌํจ
- ์ด hidden class๋ ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ด๋ฉฐ, ๊ฐ ๊ฐ์ฒด๋ ๋ณ๋์ hidden class๋ฅผ ๊ฐ์ง ์ ์์
- ์ด๋ฌํ ๊ตฌ์กฐ ๋๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๊ฐ์ฒด์ ์์ฑ ์ ๊ทผ ์๋๋ฅผ ์ต์ ํ๋ฉฐ, ๊ฐ์ฒด์ ์์ฑ๋ค์ property storage๋ผ๊ณ ๋ถ๋ฆฌ๋ ์์ญ์ ์ ์ฅ๋์ด ํจ์จ์ ์ผ๋ก ์ ๊ทผํจ
2.3 ๊ฐ์ฒด์ ๋ฉ๋ชจ๋ฆฌ ์์
let obj = { a: 10, b: 20 };
์ ์ฝ๋์์ obj
๋ ํ๋ ํด๋์ค๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, a
์ b
๋ property storage์ ์ ์ฅ๋ฉ๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์ด ์ ๋ณด๋ฅผ ํตํด obj.a
๋๋ obj.b
๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋๋ก ์ต์ ํํจ
3. ๊ฐ์ฒด์ C/C++ ๊ตฌ์กฐ์ฒด์ ์ฐจ์ด
- ์๋ฐ์คํฌ๋ฆฝํธ์ ๊ฐ์ฒด๋ C/C++ ๊ตฌ์กฐ์ฒด์ ๋น์ทํ ์ ๋ ์์ง๋ง, ์ค์ํ ์ฐจ์ด์ ๋ค์ด ์กด์ฌ
- ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ๋์ ํ์ ์์คํ ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ์
3.1 ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- C/C++ ๊ตฌ์กฐ์ฒด: ๊ตฌ์กฐ์ฒด๋ ์คํ(Stack)์ ํ ๋น๋จ
- ๊ตฌ์กฐ์ฒด๋ ์ ์ ์ธ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง(Fixed Layout) ์ฆ, ๊ตฌ์กฐ์ฒด์ ๊ฐ ํ๋๋ ์ปดํ์ผ ํ์์ ๊ฒฐ์
- JavaScript ๊ฐ์ฒด: ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ํ(Heap)์ ํ ๋น๋๋ฉฐ, ๋์ ์ผ๋ก ํฌ๊ธฐ๊ฐ ๋ณํ ์ ์์
- ์ฆ, ๊ฐ์ฒด์ ์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ์ ์์ด ๊ตฌ์กฐ๊ฐ ๋ฐํ์์ ๋ณ๊ฒฝ
3.2 ์์ฑ ๊ด๋ฆฌ
- C/C++ ๊ตฌ์กฐ์ฒด: ๊ตฌ์กฐ์ฒด์์ ํ๋๋ ๊ณ ์ ๋ ์์์ ํ์ ์ผ๋ก ์กด์ฌ(Fixed Layout) ์ฆ, ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ๊ฐ ํ๋๊ฐ ์ฐจ์งํ๋ ํฌ๊ธฐ๊ฐ ์ ํํ๊ฒ ๊ฒฐ์ ๋จ
- JavaScript ๊ฐ์ฒด: ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ๋์ ์ผ๋ก ์์ฑ์ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ ์ ์๊ณ , ์์ฑ์ key-value ํ์์ผ๋ก ์ ์ฅ
- Hidden class์ property storage ๋ฐฉ์์ผ๋ก ์์ฑ๋ค์ด ๋์ ์ผ๋ก ๊ด๋ฆฌ
3.3 ํ์ ์์คํ
- C/C++ ๊ตฌ์กฐ์ฒด: ํ์ ์ด ์ ์ ์ด๋ฉฐ, ๊ตฌ์กฐ์ฒด์ ๊ฐ ํ๋๋ ๋ช ์์ ์ผ๋ก ํ์ ์ด ์ง์
- JavaScript ๊ฐ์ฒด: ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋์ ํ์ ์ธ์ด๋ก, ๊ฐ์ฒด์ ํ๋กํผํฐ ๊ฐ์ ๋ฐํ์์ ๊ฒฐ์ ๋จ
3.4 ๋ฉ๋ชจ๋ฆฌ ์์
C++์์ ๊ตฌ์กฐ์ฒด๋ ์๋์ ๊ฐ์ด ์ ์:
struct Point {
int x;
int y;
};
+------+------+
| x | y |
+------+------+
(๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ผ๋ก ๋ฐฐ์น๋จ)
- ๊ฒฐ๊ตญ ์ด ๋ ๊ฐ์ง๋ ํ๋ฉด์ ์ผ๋ก ์ ์ฌํ์ง๋ง, C++ ๊ตฌ์กฐ์ฒด๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ฌ์ฉํ๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ฌ์ฉํ๋ค๋ ์ ์์ ์ฐจ์ด๊ฐ ์์
4. ๊ฐ์ฒด์ C++ map์ ์ฐจ์ด
4.1 ์์ฑ ๊ด๋ฆฌ
- C++ map: map ๋ณ์ ์์ฒด๋ ์คํ์ ์ ์ฅ๋๊ณ , map์์ ์ํด์๋ node๋ค์ ํ์ ์ ์ฅ๋จ
- ๋ ๋ค key-value ํํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์์
- ๋ ๋ค ๋ฐ์ดํฐ๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐ/์ญ์ ํ ์ ์์
- ๊ตฌ์กฐ์ฒด๋ ์ ์ ์ธ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง(Fixed Layout) ์ฆ, ๊ตฌ์กฐ์ฒด์ ๊ฐ ํ๋๋ ์ปดํ์ผ ํ์์ ๊ฒฐ์
4.2 ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
- C++์ ๋งต์ Red-Black tree๋ฅผ ์ฌ์ฉํ์ฌ ํค๋ฅผ ์๋์ผ๋ก ์ ๋ ฌํ๋ฉฐ ์ ์ฅํจ
(2, "two")
/
(1, "one")
5. ๊ฐ์ฒด์ ํด๋์ค์์ ์ฐจ์ด
5.1 ๊ฐ์ฒด
- ๊ฐ์ฒด๋ ๊ธฐ์กด์ ์ ์๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ ์ ์๋ ์๋ฃํ
- ์ฆ, ์คํ ์์ ์ ์์ฑ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์๋ค
let obj = { a: 10, b: 20 };
obj.c = 30; // ๋์ ์ผ๋ก ํ๋กํผํฐ ์ถ๊ฐ
5.2 ํด๋์ค
- ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ ํ๋ฆฟ
- ํด๋์ค์์ ์ ์๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ๋ ํ ๋น
- ํด๋์ค๋ ์์ฑ์(constructor)๋ฅผ ์ฌ์ฉํด ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ค
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
}
let p = new Person("Alice", 30);
5.3 ๋ฉ๋ชจ๋ฆฌ ์ฐจ์ด
- ๊ฐ์ฒด: ๊ฐ์ฒด๋ ๋์ ์ผ๋ก ์์ฑ์ ์ถ๊ฐํ๊ฑฐ๋ ์์ ํ ์ ์์ผ๋ฉฐ, ํ์ ํ ๋น
- ํด๋์ค: ํด๋์ค๋ ํ ํ๋ฆฟ์ผ ๋ฟ์ด๊ณ , ํด๋์ค ์ธ์คํด์ค๋ ๊ฐ์ฒด๋ก ์์ฑ๋์ด ํ์ ํ ๋น
- ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ์๋๊ฐ prototype์ ์ ์ฅ๋๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์์
- ๊ฐ์ฒด ๋ฆฌํฐ๋ด ๋ฐฉ์์ ๊ฐ๋ณ ๊ฐ์ฒด๊ฐ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ๋ฐ์ํ ์ ์์
๐ ๊ด๋ จ ๊ฐ๋
- Hidden Class: ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ๊ฐ์ฒด์ ์์ฑ์ ์ต์ ํํ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฉํ๋ฐ์ดํฐ.
- Property Storage: ๊ฐ์ฒด์ ์ค์ ์์ฑ์ด ์ ์ฅ๋๋ ๊ณต๊ฐ.
- ํด๋์ค์ ๊ฐ์ฒด: ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ํ ํ๋ฆฟ์ด๊ณ , ๊ฐ์ฒด๋ ์ค์ ์ธ์คํด์ค
๐ ์ฐธ๊ณ ์๋ฃ
- MDN - Object (JavaScript)
- MDN - Class (JavaScript)
- GeeksforGeeks - Memory Management in JavaScript
- Fast properties in V8
- Javascript Hiddenclass์ ์ต์ ํ ๊ธฐ๋ฒ
'Language > javascript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Javascript์ ๊ฐ์ฒด์งํฅ - ์์ (inheritance) (0) | 2025.05.13 |
---|---|
javascript์ prototype๊ณผ __proto__ ์ ๋ฆฌ (1) | 2025.04.27 |
์๋ฐ์คํฌ๋ฆฝํธ ํจ์ ์ ๋ฆฌ (javascript function) (0) | 2025.03.21 |
javascript์ ์๋ฃํ Number, Bigint, String๊ณผ ๋ฉ๋ชจ๋ฆฌ (0) | 2025.03.15 |