Array์ JavaScript์ Array
์ค๋ ๋ฉด์ ์ ๋ณด์๋๋ฐ, Array์ JavaScript์ Array
์ ๊ดํ ๊ธฐ์ ์ง๋ฌธ์ด ์์๊ณ , ์ด์ ๋ํด์ ์ ์๊ณ ์์ง ์์ ๊ธ์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
์ผ๋ฐ์ ์ธ Array (๋ฐ์ง ๋ฐฐ์ด)
์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด์ด๋ผ๋ ์๋ฃ ๊ตฌ์กฐ์ ๊ฐ๋ ์
-
๋์ผํ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋นํ์์ด ์ฐ์์
์ผ๋ก๋์ด๋ ์๋ฃ ๊ตฌ์กฐ
๋ฅผ ๋งํ๋ค. -
๋ฐฐ์ด์ ์์๋
๋์ผํ ํฌ๊ธฐ๋ฅผ ๊ฐ์ผ๋ฉฐ ๋นํ์์ด ์ฐ์์ ์ผ๋ก ์ด์ด์ ธ ์
์ผ๋ฏ๋ก ์ธ๋ฑ์ค๋ฅผ ํตํด ๋จ ํ๋ฒ์ ์ฐ์ฐ์ผ๋ก ์์์ ์์์ ์ ๊ทผ(์์ ์ ๊ทผ(random access), ์๊ฐ ๋ณต์ก๋ O(1))ํ ์ ์๋ค. ์ด๋ ๋งค์ฐ ํจ์จ์ ์ด๋ฉฐ ๊ณ ์์ผ๋ก ๋์ํ๋ค.(ํ์ง๋ง ์ ๋ ฌ๋์ง ์์ ๋ฐฐ์ด์์ ํน์ ํ ๊ฐ์ ํ์ํ๋ ๊ฒฝ์ฐ, ๋ชจ๋ ๋ฐฐ์ด ์์๋ฅผ ์ฒ์๋ถํฐ ๊ฐ์ ๋ฐ๊ฒฌํ ๋๊น์ง ์ฐจ๋ก๋๋ก ํ์(์ ํ ํ์(linear search)์ํ๊ธฐ ๋๋ฌธ์ ์๊ฐ ๋ณต์ก๋๋ O(n))์ด๋ค.)
-
๋ํ ๋ฐฐ์ด์ ์์๋ฅผ
์ฝ์ ํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ
, ๋ฐฐ์ด ์์๋ฅผ์ฐ์์ ์ผ๋ก ์ ์งํ๊ธฐ ์ํด ์์๋ฅผ ์ด๋์์ผ์ผ ํ๋ ๋จ์
๋ ์๋ค. -
์ฆ, ์ผ๋ฐ์ ์ธ Array๋ ํ๋์ ํ์ ์ผ๋ก ํต์ผ๋์ด ์์ผ๋ฉฐ ์๋ก ์ฐ์์ ์ผ๋ก ์ธ์ ํด ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฐฐ์ด์
๋ฐ์ง ๋ฐฐ์ด(dense array)
์ด๋ผ ํ๋ค.
JavaScript์ Array (ํฌ์ ๋ฐฐ์ด)
JavaScript์ Array์ ์ผ๋ฐ์ ์ธ Array์๋ ๋ค๋ฅธ๋ฐ, ๊ทธ ์ด์ ๋
-
์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐฐ์ด์ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด์ ๋์์ ํ๋ด๋ธ ํน์ํ ๊ฐ์ฒด(Array ๊ฐ์ฒด)์ด๋ค.
(์ธ๋ฑ์ค๋ฅผ ํ๋กํผํฐ ํค๋ก ๊ฐ์ผ๋ฉฐ length ํ๋กํผํฐ๋ฅผ ๊ฐ๋ ํน์ํ ๊ฐ์ฒด)
-
์๋ฐ์คํฌ๋ฆฝํธ์์๋
๋ชจ๋ ๊ฐ์ด ๊ฐ์ฒด์ ํ๋กํผํฐ ๊ฐ์ด ๋ ์ ์
์ผ๋ฏ๋ก์ด๋ ํ ํ์ ์ ๊ฐ์ด๋ผ๋ ๋ฐฐ์ด์ ์์๊ฐ ๋ ์ ์๋ค.
-
๋ฐฐ์ด์ ์์๊ฐ ์ฐ์์ ์ผ๋ก ์ด์ด์ ธ ์์ง ์๋ ๋ฐฐ์ด์
ํฌ์ ๋ฐฐ์ด(sparse array)
์ด๋ผ ํ๋ค.
length ํ๋กํผํฐ์ ํฌ์๋ฐฐ์ด
length ํ๋กํผํฐ๋ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ๋ํ๋ด๋ 0์ด์์ ์ ์๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๋๋ค.
const arr = [1, 2, 3];
console.log(arr.length); // 3
arr.push(4);
console.log(arr.length); // 4
arr.pop();
console.log(arr.length); // 3
length ํ๋กํผํฐ์ ์์์ ๊ฐ์ ํ ๋นํ ์๋ ์๋ค.
const arr = [1, 2, 3, 4, 5];
arr.length = 3;
console.log(arr); // [1, 2, 3]
const arr = [1, 2, 3];
arr.length = 6;
console.log(arr.length); // 6
console.log(arr); // [ 1, 2, 3, <3 empty items> ]
์ ์ฝ๋์์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด ๋ณด์์ ๋, arr ๋ณ์
์ ์ ์ธ๋ length ํ๋กํผํฐ์ ๊ฐ๋ณด๋ค ํฐ ์ซ์์ length๋ฅผ ํ ๋นํ๊ฒ ๋๋ฉด length์ ๊ธธ์ด๋ ๋ณ๊ฒฝ๋์ง๋ง, ์ค์ arr ๋ณ์
์๋ ์๋ฌด๋ฐ ๋ณํ๊ฐ ์๊ธฐ ๋๋ฌธ์ 3 empty items
๋ผ๋ console.log์ ์ฐํ๊ฒ ๋๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
console.log(Object.getOwnPropertyDescriptors(arr));
/*
{
'0': { value: 1, writable: true, enumerable: true, configurable: true },
'1': { value: 2, writable: true, enumerable: true, configurable: true },
'2': { value: 3, writable: true, enumerable: true, configurable: true },
length: { value: 6, writable: true, enumerable: false, configurable: false }
}
/*
getOwnPropertyDescriptors()
๋ฅผ ํตํด์ ํ์ธ ์ฌ์ด์ ํด๋ณด๋ฉด ๊ฐ์ด ์๋ ์์๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ์ง ์์ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด์ฒ๋ผ ๋ฐฐ์ด์ ์์๊ฐ ์ฐ์์ ์ผ๋ก ์์นํ์ง ์๊ณ ์ผ๋ถ๊ฐ ๋น์ด ์๋ ๋ฐฐ์ด์ ํฌ์ ๋ฐฐ์ด
์ด๋ผ๊ณ ํ๋ค.
์ฅ๋จ์
์ผ๋ฐ์ ์ธ Array์
์ธ๋ฑ์ค๋ก ๋ฐฐ์ด ์์์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋ค. ํ์ง๋ง ํน์ ์์๋ฅผ ํ์ํ๊ฑฐ๋ ์์๋ฅผ ์ฝ์
๋๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ์๋ ํจ์จ์ ์ด์ง ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ Array์
ํด์ ํ
์ด๋ธ๋ก ๊ตฌํ๋ ๊ฐ์ฒด์ด๋ฏ๋ก ์ธ๋ฑ์ค๋ก ๋ฐฐ์ด ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ, ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด๋ณด๋ค ์ฑ๋ฅ์ ์ธ ๋ฉด์์ ๋๋ฆด ์ ๋ฐ์ ์๋ ๊ตฌ์กฐ์ ์ธ ๋จ์ ์ ๊ฐ๋๋ค. ํ์ง๋ง ํน์ ์์๋ฅผ ํ์ํ๊ฑฐ๋ ์์๋ฅผ ์ฝ์
๋๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ์๋ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด๋ณด๋ค ๋น ๋ฅธ ์ฑ๋ฅ์ ๊ธฐ๋ํ ์ ์๋ค.
์ฆ, ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ก ๋ฐฐ์ด ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ์๋ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด๋ณด๋ค ๋๋ฆฌ์ง๋ง ํน์ ์์๋ฅผ ํ์ํ๊ฑฐ๋ ์์๋ฅผ ์ฝ์ ๋๋ ์ญ์ ํ๋ ๊ฒฝ์ฐ์๋ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด๋ณด๋ค ๋น ๋ฅด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด ๋น๊ต
์๋ฐ์คํฌ๋ฆฌ๋ธ์ ๋ฐฐ์ด์
์ธ๋ฑ์ค๋ก ๋ฐฐ์ด ์์์ ์ ๊ทผํ ๋ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด๋ณด๋ค ๋๋ฆด ์ ๋ฐ์ ์๋ ๊ตฌ์กฐ์ ์ธ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ฐฐ์ด์ ์ผ๋ฐ ๊ฐ์ฒด์ ๊ตฌ๋ณํ์ฌ ๋ณด๋ค ๋ฐฐ์ด์ฒ๋ผ ๋์ํ๋๋ก ์ต์ ํํ์ฌ ๊ตฌํ
ํ์๋ค.
์๋๋ ๋ชจ๋์๋ฐ์คํฌ๋ฆฝํธ ์์ ๋ฅผ ๊ฐ์ ธ์๋ค.
const arr = [];
console.time('Array Performance Test');
for (let i = 0; i < 10000000; i++) {
arr[i] = i;
}
console.timeEnd('Array Performance Test');
// ์ฝ 340ms
const obj = {};
console.time('Object Performance Test');
for (let i = 0; i < 10000000; i++) {
obj[i] = i;
}
console.timeEnd('Object Performance Test');
// ์ฝ 600ms
์ฐธ๊ณ ๋งํฌ
๋ชจ๋์๋ฐ์คํฌ๋ฆฝํธ - ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ ๋ฐฐ์ด์ด ์๋๋ค
[JavaScript] ๋ฐฐ์ด์ด ๋ฐฐ์ด์ด ์๋๋ผ๊ณ ?