-
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ ์ฌ์ค ๊ฐ์ฒด๋ค!์นดํ ๊ณ ๋ฆฌ ์์ 2023. 2. 13. 20:05
typeof ๋ฐฐ์ด === ๊ฐ์ฒด?
typeof ๋ฅผ ํตํด ๋ฐฐ์ด์ ํ์ ์ ์ฝ์์ ์ฐ์ด๋ณด๋ฉด object๋ผ๊ณ ๋์จ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด์ด๋ผ๋ ํ์ ์ ๋ฐ๋ก ์กด์ฌํ์ง ์๋๋ค. ๋ฐฐ์ด์ ์ฌ์ค์ ๊ฐ์ฒด ํ์ ์ด๋ค. ๊ทธ๋ ์ง๋ง ์ผ๋ฐ ๊ฐ์ฒด์๋ ๊ตฌ๋ณ๋๋ ํน์ง์ด ์๋ค.
๊ตฌ๋ถ ๊ฐ์ฒด ๋ฐฐ์ด ๊ตฌ์กฐ ํ๋กํผํฐ ํค, ํ๋กํผํฐ ๊ฐ ์ธ๋ฑ์ค์ ์์ ๊ฐ์ ์ฐธ์กฐ ํ๋กํผํฐ ํค ์ธ๋ฑ์ค ๊ฐ์ ์์ X O length ํ๋กํผํฐ X O ๊ฐ์ฅ ๋ช ํํ ์ฐจ์ด์ ์ "๊ฐ์ ์์"์ "length ํ๋กํผํฐ"๊ฐ ์๋ค๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ ์ง๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฒ์/๋ง์ง๋ง/ํน์ ์์น๋ถํฐ ์์ฐจ์ ์ผ๋ก ์์์ ์ ๊ทผํ ์๊ฐ ์๋ค.
๋ ๊ฐ์ง ์ข ๋ฅ์ ๋ฐฐ์ด
๋ฐฐ์ด์๋ ๋ ๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
- ๋ฐ์ง ๋ฐฐ์ด(dense array)
- ์๋ฃ๊ตฌ์กฐ์์ ์ผ๋ฐ์ ์ผ๋ก ๋งํ๋, ๋ฐฐ์ด์ ๋์ผํ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์ฐ์์ ์ผ๋ก ๋์ด๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค.
- ๋นํ์์ด ์ฐ์์ ์ผ๋ก ์ด์ด์ ธ ์์ผ๋ฏ๋ก, ์ธ๋ฑ์ค๋ฅผ ํตํด ๋จ ํ ๋ฒ์ ์ฐ์ฐ์ผ๋ก ์์์ ์์์ ์ ๊ทผ : O(1)
- ์ธ๋ฑ์ค๊ฐ 0์ธ ์์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์: 1000(์์์์น) + 0 * 8 = 1000
- ์ธ๋ฑ์ค๊ฐ 1์ธ ์์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์: 1000 + 1 * 8 = 1000
- ์ ๋ ฌ๋์ด ์์ ๊ฒฝ์ฐ ์์ฒ๋ผ ์ธ๋ฑ์ค๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ณ์ฐํ ์ ์์ผ๋ ํ์์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด O(1)๋ง ์ ๋ ฌ์ด ๋์ด ์์ง ์์ ๊ฒฝ์ฐ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ฒ์๋ถํฐ ํน์ ์์๋ฅผ ๋ฐ๊ฒฌํ ๋๊น์ง ์ฐจ๋ก๋๋ก ๊ฒ์ํ๋
์ ํ ๊ฒ์
์ ํด์ผํ๋ฏ๋ก, ์๊ฐ ๋ณต์ก๋๋ O(n)์ด๋ค. - ๋ฐฐ์ด์ ์ค๊ฐ์ ์ฝ์ , ์ญ์ ๋ฅผ ํ๋ ๊ฒฝ์ฐ ๋ฐฐ์ด์ ์์๋ฅผ ์ฐ์์ ์ผ๋ก ์ ์งํ๊ธฐ ์ํด ์์๋ฅผ ์ด๋์์ผ์ผ ํ๋ ๋จ์ ์ด ์๋ค.
- ์ ๋ ฌ๋์ด ์์ ๊ฒฝ์ฐ ์์ฒ๋ผ ์ธ๋ฑ์ค๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ณ์ฐํ ์ ์์ผ๋ ํ์์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด O(1)๋ง ์ ๋ ฌ์ด ๋์ด ์์ง ์์ ๊ฒฝ์ฐ ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ์ฒ์๋ถํฐ ํน์ ์์๋ฅผ ๋ฐ๊ฒฌํ ๋๊น์ง ์ฐจ๋ก๋๋ก ๊ฒ์ํ๋
- ํฌ์ ๋ฐฐ์ด(sparse array)
- ๋ฐฐ์ด ์์๋ฅผ ์ํ ๊ฐ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋์ผํ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์๋๋ค.
- ์ฐ์์ ์ผ๋ก ์ด์ด์ ธ ์์ง ์์ ์๋ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฐ์ง ๋ฐฐ์ด์ด ์๋ ํฌ์ ๋ฐฐ์ด๋ก, ์๋ฐํ ๋งํด ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด์ด ์๋๋ฉฐ,
์ผ๋ฐ์ ์ธ ๋ฐฐ์ด์ ๋์์ ํ๋ด ๋ธ ํน์ํ ๊ฐ์ฒด๋ค
getOwnPropertyDescriptors๋ฅผ ํตํด ๋ฐฐ์ด์ ์ฐ์ด๋ณด๋, 0, 1, 2๋ผ๋ ์ธ๋ฑ์ค๊ฐ ์ฐํ๊ณ , length๋ผ๋ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ ์์๋ ์ฌ์ค
ํ๋กํผํฐ ๊ฐ
์ด์๋ ๊ฒ์ด๋ค!์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ๊ฐ์ ๊ฐ์ฒด์ ํ๋กํผํฐ ๊ฐ์ด ๋ ์ ์์ผ๋ฏ๋ก, ์ด๋ค ํ์ ์ ๊ฐ์ด๋ผ๋ ๋ฐฐ์ด์ ์์๊ฐ ๋ ์ ์์๋ ๊ฒ์ด๋ค! ์ฌ์ค ๋ฐฐ์ด์ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์!!
์ผ๋ฐ์ ์ธ ๋ฐฐ์ด๊ณผ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด ์ฅ๋จ์
- ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด
- ์ ๊ทผ(O(1)) - ์ธ๋ฑ์ค๋ก ์์์ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์๋ค.
- ์์ ์ฝ์ , ์ญ์ ํ๋ ๊ฒฝ์ฐ ๋นํจ์จ์
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด
- ์ ๊ทผ(O(n)) - ์ฌ์ค์ ํด์ํ ์ด๋ธ์ด๊ธฐ ๋๋ฌธ์ ์ ํ ๊ฒ์์ ํจ
- ์์ ์ฝ์ , ์ญ์ ์ ๋น ๋ฅด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ธ๋ฑ์ค๋ก ์์์ ์ ๊ทผ์ ์ผ๋ฐ ๋ฐฐ์ด๋ณด๋ค ๋๋ฆฌ๋ค๋ ๊ตฌ์กฐ์ ์ธ ๋จ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋๋ถ๋ถ์ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ฐฐ์ด์ ์ผ๋ฐ ๊ฐ์ฒด์ ๊ตฌ๋ถํ์ฌ ์ข ๋ ๋ฐฐ์ด์ฒ๋ผ ๋์ํ๋๋ก ์ต์ ํํ์๋ค. ๋ฐ๋ผ์ ๋ฐฐ์ด์ด ์ผ๋ฐ ๊ฐ์ฒด๋ณด๋ค ์ฝ 2๋ฐฐ ์ ๋ ๋น ๋ฅด๋ค.
length ํ๋กํผํฐ์ ํฌ์ ๋ฐฐ์ด
ํ๋กํผํฐ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํตํด ์ดํด ๋ณธ length ํ๋กํผํฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
length: {value: 3, writable: true, enumerable: false, configurable: false}
writable์ด true์ด๋ ์ง์ ์์ ํ ์ ์๊ณ , enumerable์ด false์ด๋ ๋ฐ๋ณต๋ฌธ ๋ฑ์์ length ํ๋กํผํฐ๋ ์ ์ธํ๊ณ ๋๋ฆด ์ ์๋ ๊ฒ์ด๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด์ ์์๋ฅผ ์ถ๊ฐ, ์ญ์ ํ๋ฉด length ํ๋กํผํฐ ๊ฐ์ ์๋ ๊ฐฑ์ ๋๋ค. ๊ทธ๋ฌ๋ ์์์ ์ซ์ ๊ฐ์ ๋ช ์์ ์ผ๋ก ํ ๋นํ ์๋ ์๋ค.
ํ์ฌ length๋ณด๋ค ์์ ๊ฐ์ ํ ๋นํ๋ ๊ฒฝ์ฐ
์๋ฅผ ๋ค์ด ํ์ฌ length ํ๋กํผํฐ ๊ฐ๋ณด๋ค ์์ ์ซ์ ๊ฐ์ ํ ๋นํ๋ฉด ๋ฐฐ์ด์ ๊ธธ์ด๊ฐ ์ค์ด๋ ๋ค.
const arr = [1,2,3,4,5]; arr.length = 3; console.log(arr); // [1,2,3]
ํ์ฌ length๋ณด๋ค ํฐ ๊ฐ์ ํ ๋นํ๋ ๊ฒฝ์ฐ - ํฌ์ ๋ฐฐ์ด
length๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋์ง๋ง, ์ค์ ๋ฐฐ์ด์๋ ์๋ฌด๋ฐ ๋ณํจ์ด ์๋ค. ๊ฐ ์์ด ๋น์ด ์๋ ์์๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ๋ณดํ์ง ์์ผ๋ฉฐ, ๋น ์์๋ฅด ์์ฑํ์ง๋ ์๋๋ค.
const arr = [1]; arr.length = 3; console.log(arr.length); // 3 console.log(arr); // [1, empty * 2]
์ฝ์์ ์ฐ์ด๋ณด๋ length์ value๋ 3์ด ๋์์ง๋ง, ์ค์ ๋ก๋ 0์ ํค๋ง ํ๋กํผํฐ๋ก ์กด์ฌํ๊ณ ์๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๋ ๋ฏ
๋ฐฐ์ด์ ์์๊ฐ ์ฐ์์ ์ผ๋ก ์์นํ์ง ์๊ณ ์ผ๋ถ๊ฐ ๋น์ด ์๋ ๋ฐฐ์ด์ ํฌ์๋ฐฐ์ด
์ด๋ผ ํ๋ค. ํฌ์๋ฐฐ์ด์ lenght๋ ํฌ์ ๋ฐฐ์ด์ ์ค์ ์์ ๊ฐ์๋ณด๋ค ์ธ์ ๋ ํฌ๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ฌธ๋ฒ์ ์ผ๋ก ์ด๋ฐ ํฌ์๋ฐฐ์ด์ ํ์ฉํ์ง๋ง ๋ฐฐ์ด ๊ฐ๋ ์๋ ๋ง์ง ์๊ณ , ์ฑ๋ฅ๋ ์ข์ง ์์ผ๋ ์ฌ์ฉํ์ง ์๋๊ฒ ์ข๋ค.๋ํ, ๋ฐฐ์ด ์์ฑ์์๋ ๊ฐ์ ํ์ ์ ์์๋ฅผ ์ฐ์์ ์ผ๋ก ์์น์ํค๋ ๊ฒ์ด ์ฐ์ ์ด๋ค.
์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด์ ๋ฐฐ์ด์ ์ฐจ์ด
์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด๋ ๋ฐฐ์ด์ฒ๋ผ ์ธ๋ฑ์ค๋ก ํ๋กํผํฐ ๊ฐ์ ์ ๊ทผํ ์ ์๊ณ , lengthํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
์์์ ๋ฐฐ์ด๊ณผ ์ผ๋ฐ ๊ฐ์ฒด์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ด ๋ฐ๋ก ์ด ๋๊ฐ์ง๋ผ๊ณ ํ๋๋ฐ, ๊ทธ๋ ๋ค๋ฉด ๋ฌด์กฐ๊ฑด ์ด ๋ ๊ฐ์ง๋ง ์ถฉ์กฑํ๋ฉด ๋ฐฐ์ด์ด์ง ์์๊น?๊ทธ๋ ์ง ์๋ค. ์ฝ์์ ์ฐ์ด๋ณด๋ฉด ์ฐจ์ด๋ฅผ ๊ฐ์ฅ ๋นจ๋ฆฌ ์ ์ ์๋ค.
console.dir([1,2,3]); // > Array(3) const arrayLike = { 0: 1, 1: 2, 2: 3, length: 3 }; console.dir(arrayLike); // > Object
๋ฐฐ์ด์ ํ๋กํ ํ์ ์ Array์ธ ๋ฐ๋ฉด, ์ ์ฌ๋ฐฐ์ด ๊ฐ์ฒด์ prototype์ Object์ธ ๊ฒ์ ์ ์ ์๋ค. ๋ง์ฝ ์ ์ฌ๋ฐฐ์ด๊ฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ๋ง๋ค์ด Array์
__proto__
๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉดArray.from
์ ํตํด ๋ฐฐ์ด๋ก ๋ณ๊ฒฝํด ์ฃผ๋ฉด ๋๋ค. - ๋ฐ์ง ๋ฐฐ์ด(dense array)