Front-end/JS

μžλ°”μŠ€ν¬λ¦½νŠΈ λ°°μ—΄ Array

ciocio 2021. 8. 13. 14:00

πŸ“Œ  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 배열이 μ•„λ‹ˆλ‹€?

 

자료 ꡬ쑰data structureμ—μ„œ λ§ν•˜λŠ” "λ°°μ—΄" === λ™μΌν•œ 크기의 λ©”λͺ¨λ¦¬ 곡간이 λΉˆν‹ˆμ—†μ΄ μ—°μ†μ μœΌλ‘œ λ‚˜μ—΄λœ 자료 ꡬ쑰.

즉, "λ°°μ—΄"의 μš”μ†ŒλŠ” ν•˜λ‚˜μ˜ 데이터 νƒ€μž…μœΌλ‘œ ν†΅μΌλ˜μ–΄ 있으며, μ„œλ‘œ μ—°μ†μ μœΌλ‘œ 인접해 μžˆλ‹€. ( λ°€μ§‘ λ°°μ—΄dense array )

ν•˜λ‚˜μ˜ 데이터 νƒ€μž…μœΌλ‘œ ν†΅μΌλ˜μ–΄μžˆλ‹€λŠ” μ–˜κΈ°λŠ” 각 μš”μ†Œκ°€ λ™μΌν•œ 데이터 크기λ₯Ό κ°€μ§„λ‹€λŠ” 뜻과 일λ§₯μƒν†΅ν•˜λ‹€.

 

일반적인 λ°°μ—΄ μž₯단점

μž₯점: 인덱슀둜 μš”μ†Œμ— λΉ λ₯΄κ²Œ μ ‘κ·Όν•  수 μžˆλ‹€.

단점: νŠΉμ • μš”μ†Œλ₯Ό 검색/μ‚½μž…/μ‚­μ œν•˜λŠ” κ²½μš°μ—λŠ” λΉ„νš¨μœ¨μ μ΄λ‹€.

 

즉, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 μ—°μ†μ μœΌλ‘œ 이어져 μžˆμ§€ μ•Šμ„ 수 μžˆλ‹€. ex. ν¬μ†Œ λ°°μ—΄

즉, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 μš”μ†Œλ₯Ό μœ„ν•œ 각각의 λ©”λͺ¨λ¦¬ 곡간이 λ™μΌν•œ 크기λ₯Ό κ°–μ§€ μ•Šμ•„λ„ λœλ‹€. ex. μš”μ†Œλ₯Ό μ’…λ₯˜λ³„λ‘œ 담을 수 μžˆλ‹€

 

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ°°μ—΄ μž₯단점

μž₯점: νŠΉμ • μš”μ†Œλ₯Ό 검색/μ‚½μž…/μ‚­μ œν•˜λŠ” κ²½μš°μ— 일반적인 배열보닀 λΉ λ₯Ό 수 μžˆλ‹€.

단점: 인덱슀둜 μš”μ†Œμ— μ ‘κ·Όν•  λ•Œ 일반 배열보닀 λŠλ¦¬λ‹€.

 

-->  μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 일반적인 λ°°μ—΄μ˜ λ™μž‘μ„ 흉내 λ‚Έ νŠΉμˆ˜ν•œ 객체닀.

 

 

 

πŸ“Œ  λ°°μ—΄ λ¦¬ν„°λŸ΄

 

 

배열은 κ°μ²΄μ§€λ§Œ ν”„λ‘œνΌν‹° ν‚€κ°€ μ—†κ³  κ°’λ§Œ μ‘΄μž¬ν•œλ‹€.

 

// λ°°μ—΄ λ¦¬ν„°λŸ΄μ€ 0개 μ΄μƒμ˜ μš”μ†Œλ₯Ό, μ‰Όν‘œλ‘œ κ΅¬λΆ„ν•˜μ—¬ λŒ€κ΄„ν˜Έλ‘œ λ¬ΆλŠ”λ‹€.

const arr = [1, 2, 3];
console.log(arr.length);  // 3


// λ°°μ—΄ λ¦¬ν„°λŸ΄μ— μš”μ†Œλ₯Ό ν•˜λ‚˜λ„ μΆ”κ°€ν•˜μ§€ μ•ŠμœΌλ©΄, λ°°μ—΄μ˜ κΈΈμ΄λŠ” 0인 빈 배열이 λœλ‹€.

const arr = [];
console.log(arr.length);  // 0


// λ°°μ—΄ λ¦¬ν„°λŸ΄μ— μš”μ†Œλ₯Ό μƒλž΅ν•˜λ©΄, "ν¬μ†Œ λ°°μ—΄"이 μƒμ„±λœλ‹€.

const arr = [1, , 3];  
console.log(arr.length)  // 3
                         // ν¬μ†Œ λ°°μ—΄
					     // ν¬μ†Œ 배열은 λ°°μ—΄ κΈΈμ΄λŠ” 같은데 μš”μ†Œ κ°’ κ°œμˆ˜λŠ” 적음 ;; 
                         // OMG μ΅œμ•…

 

 

πŸ“Œ  λ°°μ—΄ μ’…λ₯˜?

 

 

β—Ύ Array μƒμ„±μž ν•¨μˆ˜

 

const arr = new Array(10);

console.log(arr);         // [empty x 10]
console.log(arr.length);  // 10

// μ΄λ•Œ μƒμ„±λœ λ°°μ—΄ -> ν¬μ†Œ λ°°μ—΄
// length ν”„λ‘œνΌν‹° 값은 0이 μ•„λ‹ˆμ§€λ§Œ, μ‹€μ œλ‘œ λ°°μ—΄μ˜ μš”μ†ŒλŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

console.log(Object.getOwnPropertyDescriptors(arr));
// length: configurable: false, enumerable: false, value: 10, writable: true

 

// 배열은 μš”μ†Œλ₯Ό μ΅œλŒ€ (2^32 - 1 = 4,294,967,295)개 κ°€μ§ˆ 수 μžˆλ‹€.
new Array(4294967295);

// μ „λ‹¬λœ μΈμˆ˜κ°€ 0~4,294,967,295λ₯Ό λ²—μ–΄λ‚˜λ©΄ RangeErrorκ°€ λ°œμƒν•œλ‹€.
// μ „λ‹¬λœ μΈμˆ˜κ°€ μŒμˆ˜μ—¬λ„ RangeErrorκ°€ λ°œμƒν•œλ‹€.
new Array(4294967296);  // RangeError: Invalid array length 
new Array(-1);          // RangeError: Invalid array length

// μ „λ‹¬λœ μΈμˆ˜κ°€ μ—†λŠ” 경우, 빈 배열을 μƒμ„±ν•œλ‹€ !
new Array();  // -> []

// μ „λ‹¬λœ 인수 개수 >= 2 -> λ°°μ—΄ 생성
new Array(1, 2, 3);  // -> [1, 2, 3]

// μ „λ‹¬λœ 인수 개수 <= 1 && !typeof 인수 === 'number' -> λ°°μ—΄ 생성
new Array({});       // -> [{}]

// new μ—°μ‚°μžμ™€ ν˜ΈμΆœν•˜μ§€μ•Šλ”λΌλ„, 일반 ν•¨μˆ˜λ‘œμ„œ ν˜ΈμΆœν•΄λ„ λ™μž‘ν•œλ‹€.
Array(1, 2, 3);      // -> [1, 2, 3]

 

 

β—Ύ Array.of (ES6 λ„μž…)

 

Array μƒμ„±μž ν•¨μˆ˜μ™€ λ‹€λ₯΄κ²Œ, μ „λ‹¬λœ μΈμˆ˜κ°€ 1κ°œμ—¬λ„ κ·Έ κ°’μ˜ νƒ€μž…μ— 상관없이 배열을 μƒμ„±ν•œλ‹€ !

 

Array.of(1);        // -> [1]
Array.of(1, 2, 3);  // -> [1, 2, 3]
Array.of('string');  // -> ['string']

 

 

β—Ύ Array.from (ES6 λ„μž…)

 

μœ μ‚¬ λ°°μ—΄ 객체array-like objectλ˜λŠ” μ΄ν„°λŸ¬λΈ” 객체iterable objectλ₯Ό 인수둜 전달받아 λ°°μ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

 

Array.from({length: 2, 0: 'a', 1: 'b'});  // -> ['a', 'b']
Array.from('Hello');                      // -> ['H','e','l','l','o']

 

 

🏁  μœ μ‚¬ λ°°μ—΄ 객체 array-like object?

 

01 마치 λ°°μ—΄μ²˜λŸΌ 인덱슀둜 ν”„λ‘œνΌν‹° 값에 μ ‘κ·Όν•  수 μžˆλ‹€.

02 length ν”„λ‘œνΌν‹°λ₯Ό κ°–λŠ” 객체이닀.

 

// μœ μ‚¬ λ°°μ—΄ 객체
const arrayLike = {
  '0': 'apple',
  '1': 'banana',
  '2': 'orange',
  length: 3
}

// μœ μ‚¬ λ°°μ—΄ κ°μ²΄λŠ” 마치 λ°°μ—΄μ²˜λŸΌ for문으둜 μˆœνšŒν•  수 μžˆλ‹€.
for(let i=0; i<arrayLike.length; i++){
  console.log(arrayLike[i]);  // apple banana orange
}

 

 

🏁  μ΄ν„°λŸ¬λΈ” iterable object?

 

01 Symbol.iterator λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ—¬ for...of 문으둜 μˆœνšŒν•  수 μžˆλ‹€.

02 μŠ€ν”„λ ˆλ“œ 문법, λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒμœΌλ‘œ μ‚¬μš©ν•  수 μžˆλŠ” 객체이닀.

-->  μ§€κΈˆμœΌλ‘œμ„œλŠ” 이해가 ν•˜λ‚˜λ„ μ•ˆκ°€μ§€λ§Œ 일단 PASS ^_^

03 ES6μ—μ„œ μ œκ³΅ν•˜λŠ” built-in μ΄ν„°λŸ¬λΈ”μ€ Array, String, Map, Set, DOM Collection(NodeList, HTMLCollection), arguments..

 

 

 

πŸ“Œ  λ°°μ—΄ μš”μ†Œμ˜ μ°Έμ‘°

 

 

🏁  μ°Έμ‘°

 

const arr = [1, 2];

// μΈλ±μŠ€κ°€ 0인 μš”μ†Œλ₯Ό μ°Έμ‘°
console.log(arr[0]);  // 1

 

μΈλ±μŠ€λŠ” 값을 μ°Έμ‘°ν•  수 μžˆλ‹€λŠ” μ˜λ―Έμ—μ„œ 객체의 ν”„λ‘œνΌν‹° 킀와 같은 역할을 ν•œλ‹€.

 

const arr = [1, 2];

// λ°°μ—΄ arrμ—λŠ” μΈλ±μŠ€κ°€ 2인 μš”μ†Œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
console.log(arr[2]);  // undefined

 

μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μš”μ†Œμ— μ ‘κ·Όν•˜λ©΄ undefinedκ°€ λ°˜ν™˜λœλ‹€.

배열은 사싀, 인덱슀λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžμ—΄μ„ ν”„λ‘œνΌν‹° ν‚€λ‘œ κ°–λŠ” 객체닀.

μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν”„λ‘œνΌν‹° ν‚€λ‘œ 객체의 ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν–ˆμ„ λ•Œ undefined을 λ°˜ν™˜ν•˜λŠ” κ²ƒμ²˜λŸΌ

배열도 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μš”μ†Œλ₯Ό μ°Έμ‘°ν•˜λ©΄ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.

 

// ν¬μ†Œ λ°°μ—΄
const arr = [1,  , 3];

console.log(arr[1]);  // undefined
console.log(arr[3]);  // undefined

 

λ§ˆμ°¬κ°€μ§€λ‘œ ν¬μ†Œ λ°°μ—΄μ˜ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μš”μ†Œλ₯Ό 참쑰해도 undefinedκ°€ λ°˜ν™˜λœλ‹€.

 

 

 

πŸ“Œ  λ°°μ—΄ μš”μ†Œμ˜ μΆ”κ°€ & κ°±μ‹ 

 

 

🏁  μΆ”κ°€

 

const arr = [0];

// λ°°μ—΄ μš”μ†Œμ˜ μΆ”κ°€
arr[1] = 1;

console.log(arr);  // [0, 1]
console.log(arr.length);  // 2

 

객체에 ν”„λ‘œνΌν‹° ν‚€λ₯Ό λ™μ μœΌλ‘œ μΆ”κ°€ν•  수 μžˆλŠ” κ²ƒμ²˜λŸΌ 배열에도 κ·Έ μš”μ†Œλ₯Ό λ™μ μœΌλ‘œ μΆ”κ°€ν•  수 μžˆλ‹€.

μ΄λ•Œ length ν”„λ‘œνΌν‹° 값은 μžλ™κ°±μ‹ λœλ‹€.

 

arr[100] = 100;

console.log(arr);  // [0, 1, empty*98, 100]
console.log(arr.length);  // 101

 

ν˜„μž¬ λ°°μ—΄μ˜ length ν”„λ‘œνΌν‹° 값보닀 큰 인덱슀둜 μƒˆλ‘œμš΄ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λ©΄ ν¬μ†Œ 배열이 λœλ‹€.

λͺ…μ‹œμ μœΌλ‘œ 인덱슀둜 μš”μ†Œμ— μ ‘κ·Όν•˜μ—¬ 값을 ν• λ‹Ήν•˜μ§€ μ•Šμ€ μš”μ†ŒλŠ” μƒμ„±λ˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것에 μ£Όμ˜ν•˜μž.

 

 

🏁  κ°±μ‹ 

 

// μš”μ†Œκ°’μ˜ κ°±μ‹ 
arr[1] = 10;

console.log(arr);  // [0, 10, empty*98, 100]

 

이미 μš”μ†Œκ°€ μ‘΄μž¬ν•˜λŠ” μΈλ±μŠ€μ— 값을 μž¬ν• λ‹Ήν•˜λ©΄ μš”μ†Œκ°’μ΄ κ°±μ‹ λœλ‹€.

 

const arr = [];

// λ°°μ—΄ μš”μ†Œμ˜ μΆ”κ°€
arr[0] = 1;
arr['1'] = 2;

// ν”„λ‘œνΌν‹° μΆ”κ°€
arr['foo'] = 3;
arr.var = 4;
arr[1.1] = 5;
arr[-1] = 6;

console.log(arr);  // [1, 2, foo:3, bar:4, '1.1':5, '-1':6]

// ν”„λ‘œνΌν‹°λŠ” length에 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€.
console.log(arr.length);  // 2

 

μΈλ±μŠ€λŠ” μš”μ†Œμ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λ―€λ‘œ λ°˜λ“œμ‹œ 0μ΄μƒμ˜ μ •μˆ˜( λ˜λŠ” μ •μˆ˜ ν˜•νƒœμ˜ λ¬Έμžμ—΄ )λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

μ •μˆ˜ μ΄μ™Έμ˜ 값을 인덱슀처럼 μ‚¬μš©ν•˜λ©΄, μš”μ†Œκ°€ μƒμ„±λ˜λŠ” 것이 μ•„λ‹ˆλΌ ν”„λ‘œνΌν‹°κ°€ μƒμ„±λœλ‹€.

μ΄λ•Œ μΆ”κ°€λœ ν”„λ‘œνΌν‹°λŠ” length ν”„λ‘œνΌν‹° 값에 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€.

 

 

 

πŸ“Œ  λ°°μ—΄ μš”μ†Œμ˜ μ‚­μ œ

 

 

🏁  μ‚­μ œ

 

const arr = [1, 2, 3];

// λ°°μ—΄ μš”μ†Œμ˜ μ‚­μ œ
delete arr[1];
console.log(arr);  // [1, empty, 3]

// length ν”„λ‘œνΌν‹°μ— 영ν–₯을 μ£Όμ§€ μ•ŠλŠ”λ‹€. -> ν¬μ†Œ 배열이 λœλ‹€.
console.log(arr.length);  // 3

 

delete μ—°μ‚°μžλŠ” 객체의 ν”„λ‘œνΌν‹°λ₯Ό μ‚­μ œν•˜μ§€λ§Œ ν¬μ†Œ 배열을 μƒμ„±ν•œλ‹€.

이 μ—°μ‚°μžλŠ” μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이 μ’‹λ‹€.

ν¬μ†Œ 배열을 λ§Œλ“€μ§€ μ•ŠμœΌλ©΄μ„œ λ°°μ—΄μ˜ νŠΉμ • μš”μ†Œλ₯Ό μ™„μ „νžˆ μ‚­μ œν•˜λ €λ©΄ Array.prototype.splice λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄λœλ‹Ή :)

λ°˜μ‘ν˜•