[TIL] JavaScript : Array

AcidΒ·2021λ…„ 8μ›” 10일
1

πŸ“’ JavaScript

λͺ©λ‘ 보기
4/8
post-thumbnail

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ μžλ£Œν˜• 쀑 μ°Έμ‘° νƒ€μž…μ— ν¬ν•¨λ˜λŠ” λ°°μ—΄(Array)에 λŒ€ν•œ λ‚΄μš©μž…λ‹ˆλ‹€. 😊

πŸ“‹ λ°°μ—΄(Array)μ΄λž€?

λ°°μ—΄(Array)을 κ°„λ‹¨ν•˜κ²Œ μ„€λͺ…ν•˜λ©΄ μˆœμ„œλ₯Ό 가진 볡수의 μžλ£Œλ“€μ„ μ €μž₯ν•˜λŠ” ꡬ쑰이닀. μ—¬κΈ°μ„œ μˆœμ„œλ₯Ό κ°–λŠ”λ‹€λŠ” μ˜λ―ΈλŠ” 각 μš”μ†Œλ§ˆλ‹€ 인덱슀λ₯Ό ν™œμš©ν•  수 μžˆλ‹€λŠ” 점이 이에 ν•΄λ‹Ήν•˜κ³ , 볡수의 μžλ£Œλ“€μ€ 말 κ·ΈλŒ€λ‘œ μ—¬λŸ¬ μžλ£Œλ“€μ„ ν•œ λ²ˆμ— μ €μž₯ν•  수 μžˆλ‹€λŠ” 점이닀.

배열을 톡해 ν•˜λ‚˜μ˜ λ³€μˆ˜μ— μ—¬λŸ¬κ°€μ§€ 값을 λ™μ‹œμ— μ €μž₯ν•  수 있게 λ˜λ©΄μ„œ λ‹€λŸ‰μ˜ 데이터λ₯Ό 효과적으둜 λ‹€λ£° 수 있고, 인덱슀λ₯Ό ν™œμš©ν•˜μ—¬ 데이터λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•˜λŠ” λ“±μ˜ λ‹€μ–‘ν•œ κΈ°λŠ₯듀을 ν™œμš©ν•  수 μžˆλ‹€.

이번 ν¬μŠ€νŒ…μ—μ„  λ°°μ—΄μ˜ 생성과 μ ‘κ·Ό 방식, λ©”μ„œλ“œμ™€ κ΄€λ ¨λœ λ‚΄μš© 등에 λŒ€ν•΄ μ•Œμ•„λ³Ό 것이닀.

λ°°μ—΄μ˜ 생성

배열을 μƒμ„±ν•˜λŠ” 방법은 크게 두 가지가 μžˆλŠ”λ° 첫 번째둜 λ¦¬ν„°λŸ΄μ„ μ‚¬μš©ν•˜λŠ” 방식, 두 번째둜 new λ₯Ό ν™œμš©ν•œ 생성 방식이 μžˆλ‹€.

let arr1 = [] // λ¦¬ν„°λŸ΄(λ¬Έμžμ—΄) 방식
let arr2 = new Array(arrayLength) // new ν™œμš© 방식


첫 번째 방식은 κ°„λ‹¨ν•˜κ²Œ λŒ€κ΄„ν˜Έλ₯Ό ν™œμš©ν•˜λŠ” κ²ƒμœΌλ‘œ 배열을 생성할 수 있고, 두 번째 방식은 arrayLength 에 ν•΄λ‹Ήν•˜λŠ” 뢀뢄에 숫자λ₯Ό λŒ€μž…ν•˜μ—¬ ν•΄λ‹Ή 숫자 만큼의 길이λ₯Ό κ°–λŠ” 배열을 생성할 수 μžˆλ‹€. ν•΄λ‹Ή λ°°μ—΄μ˜ λ‚΄λΆ€ μš”μ†Œλ“€μ€ μ „λΆ€ undefined 둜 κ΅¬μ„±λœλ‹€.

let arr3 = new Array(3) // output : (3) [undefined, undefined, undefined]


λ˜ν•œ 두 가지 방식 λͺ¨λ‘ λ°°μ—΄ 생성과 λ™μ‹œμ— μ΄ˆκΈ°ν™”κ°€ κ°€λŠ₯ν•˜λ‹€. λ¦¬ν„°λŸ΄ λ°©μ‹μ˜ 경우 λŒ€κ΄„ν˜Έ μ•ˆμ— μš”μ†Œλ₯Ό 콀마λ₯Ό 톡해 κ΅¬λΆ„ν•˜μ—¬ μž‘μ„±ν•˜λŠ” λ°©λ²•μœΌλ‘œ, new λ₯Ό ν™œμš©ν•œ λ°©μ‹μ˜ 경우 μ†Œκ΄„ν˜Έ μ•ˆμ— μš”μ†Œλ₯Ό 콀마λ₯Ό 톡해 κ΅¬λΆ„ν•˜μ—¬ μž‘μ„±ν•˜λŠ” λ°©λ²•μœΌλ‘œ κ°€λŠ₯ν•˜λ‹€.

let arr4 = [1, 2, "Hi"] // output : (3) [1, 2, "Hi"]
let arr5 = new Array(1, 2, "Hi") // output : (3) [1, 2, "Hi"]


그리고 μœ„μ—μ„œ 확인할 수 μžˆλ“―μ΄ 배열은 λ‹€μ–‘ν•œ 데이터 νƒ€μž…μ„ ν•¨κ»˜ ν¬ν•¨ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.

μ΄λ ‡κ²Œ 배열을 μƒμ„±ν•œ 뒀에 λ°°μ—΄ λ‚΄ μš”μ†Œλ“€μ„ ν™œμš©ν•˜κ±°λ‚˜ μΆ”κ°€ 및 μ œκ±°ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄μž

λ°°μ—΄ μš”μ†Œμ˜ 좔가와 μ‚­μ œ

λ°°μ—΄ λ‚΄ μš”μ†ŒλŠ” 각 μš”μ†Œλ§ˆλ‹€ 인덱슀(index)λ₯Ό κ°–κ³  있고, 인덱슀λ₯Ό 톡해 각 μš”μ†Œμ— μ ‘κ·Όν•  수 μžˆλ‹€. μΈλ±μŠ€λŠ” 0 λΆ€ν„° μ‹œμž‘ν•˜λ©° 인덱슀 μœ„μΉ˜λ₯Ό μ§€μ •ν•˜λŠ” 방법은 λ°°μ—΄ 이름에 λŒ€κ΄„ν˜Έ([])λ₯Ό μ—΄μ–΄ μ•ˆμ— 인덱슀λ₯Ό μ‚½μž…ν•˜λ©΄ λœλ‹€.

let arr = [1, 2, "Hi"]
console.log(arr[0], arr[2]) // output : 1 "Hi"


μœ„μ™€ 같이 λ°°μ—΄μ˜ 인덱슀λ₯Ό μ§€μ •ν•˜κ±°λ‚˜ λ°°μ—΄ λ©”μ„œλ“œ(Method)λ₯Ό ν™œμš©ν•˜μ—¬ λ°°μ—΄ μš”μ†Œμ˜ 좔가와 μ‚­μ œκ°€ κ°€λŠ₯ν•˜λ‹€.

πŸ’‘ μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ λ©”μ„œλ“œ(Method)λž€?

λ©”μ„œλ“œμ™€ ν•¨μˆ˜λŠ” μ„œλ‘œ μœ μ‚¬ν•˜μ§€λ§Œ λͺ…ν™•νžˆ μ •μ˜ν•˜μžλ©΄ λ‹€λ₯Έ μ‘΄μž¬μ΄λ‹€.

κ°„λ‹¨νžˆ μ •μ˜ν•˜λ©΄ ν•¨μˆ˜κ°€ λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜λŠ” μš©μ–΄μ΄κ³ , λ©”μ„œλ“œλŠ” 객체에 μ’…μ†λ˜λŠ” ν•¨μˆ˜λ₯Ό μ˜λ―Έν•œλ‹€.

ν•¨μˆ˜μ˜ κ²½μš°μ—λŠ” κ·Έ μžμ²΄κ°€ κΈ°λŠ₯을 μˆ˜ν–‰ν•˜μ§€λ§Œ, λ©”μ„œλ“œμ˜ κ²½μš°μ—λŠ” 객체에 λͺ…령을 μ£Όκ³  객체가 κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜λΌκ³  μ΄ν•΄ν•˜λ©΄ 될 것이닀.

그렇기에, ν•¨μˆ˜ 호좜 방식과 λ©”μ„œλ“œ 호좜 λ°©μ‹μ—μ„œλ„ 차이λ₯Ό 보인닀.

// μž„μ˜μ˜ ν•¨μˆ˜ μ„ μ–Έ
function funcName() {
	console.log('Hello')
}
funcName() // output : 'Hello'
// Array Method : pop()
let arr = [1, 2, 3]
console.log(arr.pop()) // output : 3


μœ„ μž„μ˜μ˜ ν•¨μˆ˜ funcName 은 ν•¨μˆ˜λͺ…을 톡해 λ°”λ‘œ 싀행이 κ°€λŠ₯ν•˜μ§€λ§Œ λ°°μ—΄μ˜ pop() λ©”μ„œλ“œμ˜ 경우 λ°°μ—΄λͺ…(arr)에 . λ₯Ό 뢙이고 μ‚¬μš©ν•œλ‹€.

μ—¬κΈ°μ„œ pop() λ©”μ„œλ“œλŠ” Array 객체에 μ’…μ†λ˜μ–΄ 있기 λ•Œλ¬Έμ—, Array κ°μ²΄μ—μ„œ ν˜ΈμΆœν•  수 μžˆλ‹€.

πŸ”– 좜처

ν•¨μˆ˜μ™€ λ©”μ„œλ“œ : canonmjλ‹˜ 벨둜그 : Javascript : ν•¨μˆ˜μ™€ λ©”μ„œλ“œμ˜ μ°¨μ΄λŠ”? objectλ₯Ό νŒŒν—€μ³λ³΄μž!
ν•¨μˆ˜μ™€ λ©”μ„œλ“œ : 지속가λŠ₯ν•œ 개발 λΈ”λ‘œκ·Έ : λ©”μ†Œλ“œμ™€ ν•¨μˆ˜ (Method and Function)의 차이점

λ°°μ—΄ μš”μ†Œμ˜ μΆ”κ°€

λ°°μ—΄ μš”μ†Œ μΆ”κ°€λŠ” λ‹€μŒκ³Ό 같이 인덱슀λ₯Ό ν™œμš©ν•˜μ—¬ ν•„μš”ν•œ μœ„μΉ˜μ— 값을 ν• λ‹Ήν•  수 μžˆλ‹€.

let arr = []

arr[0] = 1

console.log(arr) // output : (1) [1]


μ΄λ•Œ μˆœμ„œλŒ€λ‘œ ν• λ‹Ήν•  ν•„μš”λŠ” ν•„μš”λŠ” μ—†κ³ , ν•„μš” μœ„μΉ˜μ— 할당을 ν•˜λ©΄ λœλ‹€. λ§Œμ•½ λ°°μ—΄μ˜ 길이λ₯Ό μ΄ˆκ³Όν•˜λŠ” λ²”μœ„μ— μš”μ†Œλ₯Ό ν• λ‹Ήν•˜λ©΄ κ·Έ μ‚¬μ΄μ˜ μš”μ†Œλ“€μ€ λͺ¨λ‘ undefined 둜 ν• λ‹Ήλœλ‹€.

// μœ„ μ˜ˆμ‹œ μ½”λ“œμ—μ„œ μ΄μ–΄μ„œ μž‘μ„±
arr[4] = 1

console.log(arr) // output : (5) [1, undefined, undefined, undefined, 1]


그리고 λ©”μ„œλ“œ(method)λ₯Ό 톡해 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ‹€. λŒ€ν‘œμ μΈ λ©”μ„œλ“œλ‘œ push() 와 unshift()κ°€ μžˆλ‹€.

push() λ°°μ—΄ 맨 뒀에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ³ , unshift() λŠ” λ°°μ—΄ 맨 μ•žμ— μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€. 그리고 두 λ©”μ„œλ“œλŠ” μš”μ†Œλ₯Ό μΆ”κ°€ν•œ λ’€ μƒˆλ‘œμš΄ λ°°μ—΄μ˜ 길이λ₯Ό λ°˜ν™˜ν•œλ‹€.

push() 와 unshift() λ©”μ„œλ“œλŠ” λ§€κ°œλ³€μˆ˜λ‘œ μΆ”κ°€ν•  μš”μ†Œλ₯Ό μž‘μ„±ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.

let arr = [1, 2, 3, 4]

let pushArr = arr.push(5)

console.log(pushArr) // output : 5
console.log(arr) // output : (5) [1, 2, 3, 4, 5]

let unshiftArr = arr.unshift(0)

console.log(unshiftArr) // output : 6
console.log(arr) // output : (5) [0, 1, 2, 3, 4, 5]


λ°°μ—΄ μš”μ†Œμ˜ μ œκ±°λ„ 이와 μœ μ‚¬ν•œ λ°©λ²•μœΌλ‘œ 이루어진닀.

λ°°μ—΄ μš”μ†Œμ˜ 제거

λ°°μ—΄ μš”μ†Œμ˜ μ œκ±°λŠ” 기본적으둜 delete μ—°μ‚°μžλ₯Ό ν™œμš©ν•˜μ—¬ κ°€λŠ₯ν•˜λ‹€.

let arr = [1, 2, 3, 4]

delete arr[2]

console.log(arr) // output : (3) [1, 2, undefined, 4]


ν•˜μ§€λ§Œ ν•΄λ‹Ή 방법을 ν™œμš©ν•  경우, μœ„μ™€ 같이 λ°°μ—΄ 길이(length)μ—λŠ” 변함이 μ—†κ³  κΈ°μ‘΄ μœ„μΉ˜μ—λŠ” undefined κ°€ λ‚¨μŒμ„ μ•Œ 수 μžˆλ‹€.

그렇기에 μ™„μ „νžˆ λ°°μ—΄ μš”μ†Œλ₯Ό μ œκ±°ν•˜κΈ° μœ„ν•΄μ„œ λ‹€μŒμ˜ pop() κ³Ό shift() λ©”μ„œλ“œλ₯Ό ν™œμš©ν•  수 μžˆλ‹€.

pop() λ©”μ„œλ“œλŠ” push() 와 μœ μ‚¬ν•˜κ²Œ λ°°μ—΄ 맨 λ’€μ˜ μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³ , shift() λ©”μ„œλ“œλŠ” unshift() λ©”μ„œλ“œμ™€ μœ μ‚¬ν•˜κ²Œ λ°°μ—΄ 맨 μ•žμ˜ μš”μ†Œλ₯Ό μ œκ±°ν•œλ‹€. ν•΄λ‹Ή 두 λ©”μ„œλ“œλŠ” λ°˜ν™˜ κ°’μœΌλ‘œ λ°°μ—΄μ—μ„œ 제거된 값을 λ°˜ν™˜ν•œλ‹€.

let arr = [1, 2, 3, 4]

let popArr = arr.pop()

console.log(popArr) // output : 4
console.log(arr) // output : (3) [1, 2, 3]
  
let shiftArr = arr.shift()

console.log(shiftArr) // output : 1
console.log(arr) // output : (2) [2, 3]


λ˜ν•œ, μΆ”κ°€μ μœΌλ‘œ splice() λ©”μ„œλ“œλ₯Ό ν™œμš©ν•΄μ„œ μš”μ†Œμ˜ 제거λ₯Ό 진행할 수 μžˆλŠ”λ°, λ™μ‹œμ— 좔가도 ν•¨κ»˜ ν•  수 μžˆλ‹€. splice() 의 문법은 λ‹€μŒκ³Ό κ°™λ‹€.

array.splice(start[, deleteCount[, item1[, item2[, ...]]]])

ν•΄λ‹Ή 문법을 μ‚¬μš©ν•˜μ—¬ 좔가와 제거λ₯Ό λ™μ‹œμ— μ§„ν–‰ν•˜λ©΄ λ‹€μŒκ³Ό 같이 ν•  수 μžˆλ‹€.

let arr = [1, 2, 3, 4]

let spliceArr = arr.slice(1, 1, 'two') // μš”μ†Œλ₯Ό μ œκ±°ν•˜κ³  ν•΄λ‹Ή μΈλ±μŠ€μ— μš”μ†Œ μΆ”κ°€

console.log(spliceArr) // output : [2]
console.log(arr) // output : [1, 'two', 3, 4]


그리고 splice() λŠ” μš”μ†Œμ˜ 좔가와 제거λ₯Ό λΆ„λ¦¬ν•˜μ—¬ 각각의 μš©λ„λ‘œ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.

// μš”μ†Œ 제거
let arr = [1, 2, 3, 4]

arr.slice(1, 1)

console.log(arr) // output : (3) [1, 3, 4]

// μš”μ†Œ μΆ”κ°€
arr.slice(1, 0, 2)

console.log(arr) // output : (4) [1, 2, 3, 4]


μœ„μ—μ„œ μ•Œμ•„λ³Έ λ©”μ„œλ“œλ₯Ό ν¬ν•¨ν•˜μ—¬ λ°°μ—΄ λ‚΄ 데이터듀을 인덱슀둜 μ ‘κ·Όν•˜μ—¬ μΆ”κ°€ 및 μˆ˜μ •μ΄ κ°€λŠ₯ν•˜λ‹€. 이제 μ΄λŸ¬ν•œ 배열이 자료ꡬ쑰적으둜 μ–΄λ– ν•œ 의미λ₯Ό κ°–λŠ”μ§€ κ°„λ‹¨ν•˜κ²Œ μ•Œμ•„λ³΄μž.

λ°°μ—΄μ˜ νŠΉμ§•

배열은 ν•˜λ‚˜μ˜ λ³€μˆ˜μ— μ—¬λŸ¬ κ°€μ§€μ˜ 값을 μ €μž₯ν•  수 μžˆλŠ” μžλ£Œν˜•μœΌλ‘œμ„œ, λ°°μ—΄ λ˜ν•œ 객체이기 λ•Œλ¬Έμ— κ΄€λ ¨λœ 속성과 λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•œλ‹€.

λŒ€ν‘œμ μΈ μ†μ„±μœΌλ‘œλŠ” length κ°€ 이에 ν•΄λ‹Ήν•˜κ³  λ©”μ„œλ“œλŠ” μœ„μ—μ„œ μ–ΈκΈ‰ν•œ λ©”μ„œλ“œλ“€μ΄ 이에 ν•΄λ‹Ήν•œλ‹€.

눈으둜 λ³΄μ΄λŠ” λ°°μ—΄μ˜ κ°€μž₯ 큰 νŠΉμ§•μ€ μΈλ±μŠ€κ°€ μ‘΄μž¬ν•˜κΈ°μ— μˆœμ„œκ°€ μžˆλ‹€λŠ” 점이고, 이λ₯Ό ν™œμš©ν•˜μ—¬ 효과적으둜 데이터λ₯Ό 관리할 수 μžˆλ‹€λŠ” 점이닀.

κ·Έλ ‡λ‹€λ©΄ 배열은 μ–΄λ– ν•œ 자료ꡬ쑰λ₯Ό κ°–κ³  있으며, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 타 μ–Έμ–΄μ˜ λ°°μ—΄κ³ΌλŠ” μ–΄λ– ν•œ 차이점이 μ‘΄μž¬ν• κΉŒ? 이에 λŒ€ν•΄ κ°„λ‹¨νžˆ μ•Œμ•„λ³΄μž.

λ°°μ—΄κ³Ό 자료ꡬ쑰

μš°μ„  λ°°μ—΄μ˜ 자료ꡬ쑰λ₯Ό μ„€λͺ…ν•˜κΈ°μ— μ•žμ„œ μžλ£Œκ΅¬μ‘°μ— λŒ€ν•œ κ°„λ‹¨ν•œ μ„€λͺ…을 ν•΄μ•„ ν•œλ‹€.

자료ꡬ쑰(Data Structure)λž€ 컴퓨터 κ³Όν•™μ—μ„œ μžλ£Œμ— 효율적인 μ ‘κ·Ό 및 μˆ˜μ •μ„ κ°€λŠ₯μΌ€ ν•˜λŠ” 자료의 쑰직 및 관리와 μ €μž₯을 μ˜λ―Έν•œλ‹€.

μžλ£Œκ΅¬μ‘°λŠ” κ·Έ ν˜•νƒœμ— 따라 λΆ„λ₯˜κ°€ λ˜λŠ”λ°, μ„ ν˜• ꡬ쑰(Linear)와 λΉ„μ„ ν˜• ꡬ쑰(NonLinear)κ°€ 이에 ν•΄λ‹Ήν•œλ‹€.

μ„ ν˜• κ΅¬μ‘°λŠ” 자료λ₯Ό κ΅¬μ„±ν•˜λŠ” 데이터λ₯Ό 순차적으둜 λ‚˜μ—΄μ‹œν‚¨ ν˜•νƒœλ₯Ό μ˜λ―Έν•˜λ©° λ°°μ—΄, μŠ€νƒ(Stack), 큐(Queue) 등이 이에 ν•΄λ‹Ήν•œλ‹€. μ„ ν˜• ꡬ쑰의 경우 μ €μž₯된 자료의 μ „ν›„ 관계가 1:1인 것이 νŠΉμ§•μ΄λ©°, μš”μ†Œλ₯Ό μˆœμ„œλŒ€λ‘œ μž‘μ—…ν•˜λŠ” 경우 효과적으둜 ν™œμš©ν•  수 μžˆλ‹€.

λ°˜λŒ€λ‘œ λΉ„μ„ ν˜• κ΅¬μ‘°λŠ” ν•˜λ‚˜μ˜ μžλ£Œμ™€ μ—¬λŸ¬κ°€μ§€μ˜ μžλ£Œκ°€ 연결될 수 μžˆλŠ” ν˜•νƒœλ₯Ό μ˜λ―Έν•˜λ©° 트리(Tree)와 κ·Έλž˜ν”„(Graph) 등이 이에 ν•΄λ‹Ήν•œλ‹€. λΉ„μ„ ν˜• κ΅¬μ‘°λŠ” 데이터가 1:n 관계λ₯Ό κ°–λŠ” 것이 νŠΉμ§•μ΄λ©° 자료 κ°„μ˜ 관계λ₯Ό μ •μ˜ν•  λ•Œ 효과적으둜 ν™œμš©ν•  수 μžˆλ‹€.

μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆ 듯이 배열은 μ„ ν˜• ꡬ쑰에 μ†ν•˜λ©° 그렇기에 μ„ ν˜• ꡬ쑰의 νŠΉμ§•μ„ μ΄ν•΄ν•˜λ©΄μ„œ λ°°μ—΄μ˜ νŠΉμ§•μ„ μ΄ν•΄ν•˜λ©΄ μˆ˜μ›”ν•  것이닀. μ΄μ–΄μ„œ λ°°μ—΄μ˜ νŠΉμ§•κ³Ό μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 μ–΄λ–€ 차이가 μžˆλŠ” 지에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

πŸ”– 좜처

자료 ꡬ쑰 : Wikipedia : 자료 ꡬ쑰
Linear & NonLinear : HelloWorld : μ„ ν˜•κ΅¬μ‘°μ™€ λΉ„μ„ ν˜•κ΅¬μ‘°
자료 ꡬ쑰 : blackb0xλ‹˜ 벨둜그 : μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 자료ꡬ쑰

μžλ°”μŠ€ν¬λ¦½νŠΈ λ°°μ—΄μ˜ νŠΉμ§•

μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 배열은 타 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ™€λŠ” 차이점을 보인닀. 이에 λŒ€ν•΄ μ•Œμ•„λ³΄κΈ° μœ„ν•΄ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œμ˜ λ°°μ—΄ νŠΉμ§•μ— λŒ€ν•΄ μš°μ„ μ μœΌλ‘œ μ•Œμ•„λ³΄μž.

일반적으둜 λ°°μ—΄(Array)μ΄λž€ 같은 μžλ£Œν˜•μ„ 가진 μ—°μ†λœ λ©”λͺ¨λ¦¬ κ³΅κ°„μœΌλ‘œ 이루어진 자료ꡬ쑰라고 ν•  수 μžˆλ‹€.

μœ„ 두 가지 νŠΉμ§•μ€ λ°°μ—΄μ˜ κ°€μž₯ 기본적인 νŠΉμ§•μ΄λ©΄μ„œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ°°μ—΄κ³Ό κ΅¬λΆ„λ˜λŠ” νŠΉμ§•μ΄κΈ°λ„ ν•˜λ‹€.

λ¨Όμ € 같은 μžλ£Œν˜•μ„ κ°€μ§„λ‹€λŠ” 뢀뢄은 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 경우, 배열에 λ‹€μ–‘ν•œ μžλ£Œν˜•μ˜ μžλ£Œλ“€μ„ λ™μ‹œμ— ν• λ‹Ήν•  수 μžˆλ‹€λŠ” μ μ—μ„œ 차이점을 κ°–λŠ”λ‹€.

let arr = [1, 2, 'Hello', true]
// Number와 String, Boolean의 μžλ£Œν˜•μ΄ λ™μ‹œμ— ν• λ‹Ήλœ λͺ¨μŠ΅μ΄λ‹€.


μœ„μ™€ 같이 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ°°μ—΄μ˜ 경우, 타 μ–Έμ–΄μ˜ λ°°μ—΄κ³Ό λ‹€λ₯΄κ²Œ λ‹€μ–‘ν•œ μžλ£Œν˜•μ„ ν•˜λ‚˜μ˜ λ³€μˆ˜μ— ν• λ‹Ήν•  수 μžˆλ‹€.

그리고 일반적인 배열이 μ—°μ†λœ λ©”λͺ¨λ¦¬ 곡간을 κ°–λŠ”λ‹€λŠ” λΆ€λΆ„μ—μ„œ, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 각각의 λ°°μ—΄ μš”μ†Œλ“€μ΄ μ—°μ†μ μœΌλ‘œ 이루어지지 μ•Šμ•„λ„ λœλ‹€.

let arr = [1, 2, 'Hello', true]

delete arr[1]

console.log(arr) // output : (4) [1, undefined, "Hello", true]


일반적으둜 λ°°μ—΄μ—μ„œ λ°°μ—΄ μš”μ†Œμ˜ μ‚­μ œκ°€ 이루어지면, λ°°μ—΄ μš”μ†Œλ₯Ό μ—°μ†μ μœΌλ‘œ μœ μ§€ν•˜κΈ° μœ„ν•΄ μš”μ†Œλ“€μ„ μ΄λ™μ‹œμΌœμ•Ό ν•˜μ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ°°μ—΄ μš”μ†Œ μ‚­μ œ 방법 쀑 ν•˜λ‚˜μΈ delete λ₯Ό μ‚¬μš©ν•˜λ©΄ λ°°μ—΄ 길이가 κ°μ†Œν•˜μ§€ μ•Šκ³  λ°°μ—΄ μš”μ†Œμ˜ 곡간은 κ·ΈλŒ€λ‘œ μœ μ§€λœλ‹€λŠ” 점이 이에 ν•΄λ‹Ήν•œλ‹€.

πŸ”– 좜처

λ°°μ—΄ : CodeDragon : λ°°μ—΄(Array)
λ°°μ—΄ 차이 : CodeDragon : λ°°μ—΄(Array), λ°°μ—΄ 차이 (java vs javscript)


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

μœ„μ—μ„œ μ–ΈκΈ‰ν•œ 바와 같이 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 여타 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œμ˜ λ°°μ—΄κ³ΌλŠ” 차이점이 μžˆλ‹€.

기쑴의 배열은 밀집 λ°°μ—΄(dense array)둜 λ°°μ—΄ μš”μ†Œκ°€ λ°€μ ‘ν•˜κ²Œ μ—°μ†μ μœΌλ‘œ μ΄μ–΄μ Έμ„œ 순차적인 μž‘μ—…μ— μ΅œμ ν™” 된 ν˜•νƒœμ΄λ‹€.

ν•˜μ§€λ§Œ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ²½μš°μ—λŠ” ν¬μ†Œ λ°°μ—΄(sparse array)둜 λ°°μ—΄ μš”μ†Œμ˜ 각 λ©”λͺ¨λ¦¬ κ³΅κ°„μ˜ 크기가 λ‹€λ₯Ό 수 있고 μ—°μ†μ μœΌλ‘œ 이루어지지 μ•Šμ•„λ„ λœλ‹€λŠ” μ μ—μ„œ 일반적인 λ°°μ—΄μ˜ 의미λ₯Ό κ°–λŠ”λ‹€κ³  λ§ν•˜κΈ°μ— μ–΄λ €μšΈ 수 μžˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열을 배열이라고 ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄, μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 일반적인 λ°°μ—΄μ˜ νŠΉμ§•μ„ κ°–μΆ˜ 객체라고 말할 μˆ˜λ„ μžˆλ‹€.

μ‰½κ²Œ λ§ν•˜μžλ©΄ μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ°°μ—΄μ—μ„œ μΈλ±μŠ€λŠ” 객체(Object)의 ν”„λ‘œνΌν‹° ν‚€(key)에 ν•΄λ‹Ήν•˜κ³ , length ν”„λ‘œνΌν‹°λ₯Ό λ³„λ„λ‘œ κ°–λŠ” κ°μ²΄λΌλŠ” 말이닀.

그렇기에 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ 배열은 κΈ°μ‘΄ 배열이 인덱슀λ₯Ό 톡해 각 μš”μ†Œμ— λΉ λ₯΄κ²Œ μ ‘κ·Όν•  수 μžˆλŠ” 만큼 νš¨μœ¨μ μ΄μ§€ μ•Šμ§€λ§Œ, λ°°μ—΄ μš”μ†Œμ˜ 좔가와 μ‚­μ œ λ“±κ³Ό 같은 μž‘μ—…μ—μ„œ μ’€ 더 효율적일 수 μžˆλ‹€λŠ” 뢀뢄이 μž₯점이닀.

μΆ”κ°€μ μœΌλ‘œ, λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ μ—”μ§„μ—μ„œλŠ” 배열을 여타 λ°°μ—΄κ³ΌλŠ” κ΅¬λ³„ν•˜μ—¬ μ’€ 더 λ°°μ—΄μ²˜λŸΌ λ™μž‘ν•˜λ„λ‘ μ΅œμ ν™”ν•˜μ—¬ κ΅¬ν˜„ν–ˆλ‹€λŠ” 점도 μ•Œμ•„λ‘μž.

πŸ”– 좜처

μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λ°°μ—΄ : poiemaweb : μžλ°”μŠ€ν¬λ¦½νŠΈ 배열은 배열이 μ•„λ‹ˆλ‹€


λ°°μ—΄κ³Ό μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)

νŠΉμ • 배열에 ν•˜λ‚˜μ˜ μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” λ©”μ„œλ“œλŠ” 같은 μ‹€ν–‰ μ‹œκ°„μ„ κ°€μ§ˆκΉŒ? 같은 갯수의 μš”μ†Œλ₯Ό μ²˜λ¦¬ν•˜λŠ” λ©”μ„œλ“œλΌλ„ κ·Έ 방식에 따라 λ‹€λ₯Έ νš¨μœ¨μ„ 보일 수 μžˆμ„ 것이닀.

μžλ°”μŠ€ν¬λ¦½νŠΈ λ°°μ—΄μ˜ λ©”μ„œλ“œλ“€μ΄ μ‹€ν–‰ μ‹œκ°„μ„ 각각 μ–Όλ§ˆλ‚˜ κ°–λŠ” 가에 λŒ€ν•΄ μ΄ν•΄ν•˜κΈ° μ•žμ„œ, μ‹œκ°„ λ³΅μž‘λ„(Time Complexity)와 λΉ… 였(Big-O) ν‘œκΈ°λ²•μ— λŒ€ν•΄ μ•Œ ν•„μš”κ°€ μžˆλ‹€.

μš°μ„  μ‹œκ°„ λ³΅μž‘λ„λž€ μ‹€ν–‰ μ‹œκ°„μ˜ κ΄€μ μ—μ„œ ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ˜ νš¨μœ¨μ„ μΈ‘μ •ν•˜λŠ” 정도라고 말할 수 μžˆλ‹€. 그리고 λΉ… 였 ν‘œκΈ°λ²•μ€ μ΄λŸ¬ν•œ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν‘œκΈ°λ²•μ΄λ‹€. λΉ… 였 ν‘œκΈ°λ²•μ€ O() 의 ν˜•νƒœλ‘œ μž‘μ„±ν•˜κ³  μ‹œκ°„ λ³΅μž‘λ„μ— 따라 κ΄„ν˜Έ μ•ˆμ— λ“€μ–΄κ°€λŠ” 값이 달라진닀.

μœ„ μ‹œκ°„ λ³΅μž‘λ„μ™€ λΉ… 였 ν‘œκΈ°λ²•μ„ ν™œμš©ν•˜μ—¬ μžλ°”μŠ€ν¬λ¦½νŠΈ λ°°μ—΄μ˜ 일뢀 λ©”μ„œλ“œλ“€μ΄ μ–΄λ–€ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°–λŠ” 지에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.

μš°μ„ , λ°°μ—΄ μš”μ†Œμ˜ μΆ”κ°€ 및 μ œκ±°μ™€ κ΄€λ ¨λœ push() 그리고 pop() λ©”μ„œλ“œμ™€ unshift(), shift() λ©”μ„œλ“œκ°€ μžˆλ‹€.

push() 와 pop() 의 경우, λ°°μ—΄μ˜ 맨 끝에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•˜λŠ” λ©”μ„œλ“œμ΄κΈ° λ•Œλ¬Έμ—, ν•œ 번의 λ‹¨κ³„λ§Œ ν•„μš”ν•˜κ³  μ‹œκ°„ λ³΅μž‘λ„λŠ” O(1) 둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

unshift() 와 shift() 의 κ²½μš°μ—λŠ”, λ°°μ—΄ 맨 μ•žμ— μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•˜λŠ” λ©”μ„œλ“œμ΄κΈ° λ•Œλ¬Έμ—, λ‹€λ₯Έ μš”μ†Œλ“€μ˜ 인덱슀 값이 λ°”λ€Œλ―€λ‘œ O(n) 의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°–λŠ”λ‹€.

πŸ’‘ pop() 이 shift() 보닀 효율적이라고?

shift() λ©”μ„œλ“œκ°€ O(n) 의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°–λŠ” 것에 λŒ€ν•΄ μžμ„Ένžˆ μ„€λͺ…ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

pop() 의 경우, 맨 끝의 μš”μ†Œλ§Œ μ œκ±°ν•˜κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ μš”μ†Œμ˜ μΈλ±μŠ€μ— 영ν–₯을 주지 μ•ŠλŠ”λ‹€.

let arr = [1, 2, 3]
arr.pop()
console.log(arr) // output : (2) [1, 2]


μœ„ μ˜ˆμ‹œλ₯Ό 보면 맨 끝의 μš”μ†ŒμΈ 3 은 사라지고 κΈ°μ‘΄ μš”μ†ŒμΈ 1, 2 λŠ” 인덱슀 값이 κ·ΈλŒ€λ‘œ μž„μ„ μ•Œ 수 μžˆλ‹€.

let arr = [1, 2, 3]
arr.shift()
console.log(arr) // output : (2) [2, 3]


ν•˜μ§€λ§Œ, shift() 의 경우 맨 μ•žμ˜ μš”μ†ŒμΈ 1 을 μ œκ±°ν•¨κ³Ό λ™μ‹œμ— κΈ°μ‘΄ μš”μ†ŒμΈ 2, 3 의 인덱슀 값이 1 μ”© κ°μ†Œν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

그렇기에 같은 갯수의 μš”μ†Œλ₯Ό μ²˜λ¦¬ν•˜μ§€λ§Œ, shift() 의 경우 λͺ¨λ“  μš”μ†Œλ₯Ό μˆœν™˜ν•˜λ©° 인덱슀 값을 λ³€ν™˜ν•˜κΈ° λ•Œλ¬Έμ— μ‹œκ°„ λ³΅μž‘λ„μ—μ„œ 차이λ₯Ό λ³΄μ΄λŠ” 것이닀.


μ΄λ ‡κ²Œ λ°°μ—΄μ˜ λ©”μ„œλ“œλ“€μ˜ μ‹œκ°„ λ³΅μž‘λ„κ°€ μ–΄λŠ 정도인지λ₯Ό μ•Œκ³  μ΄ν•΄ν•œλ‹€λ©΄ 같은 데이터λ₯Ό μ²˜λ¦¬ν•¨μ— μžˆμ–΄μ„œλ„ 효율적으둜 λ‹€λ₯Έ κ²°κ³Όλ₯Ό λ§Œλ“€μ–΄ λ‚Ό 수 μžˆκΈ°μ—, λ§Žμ€ 데이터λ₯Ό μ²˜λ¦¬ν• μˆ˜λ‘ μ‹œκ°„ λ³΅μž‘λ„μ— λŒ€ν•œ 이해가 μΆ©λΆ„ν•˜λ‹€λ©΄ 그것은 ν•„νžˆ 도움이 될 것이닀.

πŸ”– 좜처

λ°°μ—΄κ³Ό μ‹œκ°„ λ³΅μž‘λ„ : μ†λˆ„λˆ„λ‹˜ Tistory : [Javascript/JS] μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œμ˜ λ°°μ—΄κ³Ό μ‹œκ°„λ³΅μž‘λ„
μžλ°”μŠ€ν¬λ¦½νŠΈ μžλ£Œν˜•κ³Ό λ³΅μž‘λ„ : λŸ¬λ‹μ›Œν„° 개발 λΈ”λ‘œκ·Έ : 문제 31 : μžλ°”μŠ€ν¬λ¦½νŠΈ μžλ£Œν˜•μ˜ λ³΅μž‘λ„

πŸ”– 전체적인 μ°Έκ³ 

λ°°μ—΄ : MDN Web Docs : Array
μžλ°”μŠ€ν¬λ¦½νŠΈ Array : poiemaweb : 5.28 Array λ°°μ—΄

profile
μ΄μœ μ— μ§‘μ°©ν•˜λŠ” ν”„λ‘ νŠΈμ—”λ“œ 개발자 μ§€λ§μƒμž…λ‹ˆλ‹€ 🧐

0개의 λŒ“κΈ€