배열(Array)의 모든 것

kiduki·2023년 8월 22일

자료구조

목록 보기
2/2

배열의 개념과 특징

배열(Array)은 프로그래밍에서 가장 기본적인 자료구조 중 하나로, 동일한 데이터 타입의 요소들을 순차적으로 저장하는 선형 데이터 구조입니다. 각 요소는 인덱스(Index)라고 불리는 숫자로 접근할 수 있으며, 이를 통해 데이터에 빠르게 접근할 수 있는 특징을 가지고 있습니다. 배열은 데이터를 효율적으로 관리하고 처리하는 데 사용되며, 프로그래밍에서 다양한 분야에서 활용됩니다.


배열의 특징:

동일한 데이터 타입: 배열은 동일한 데이터 타입의 요소들로 구성됩니다. 예를 들어, 정수 배열은 모든 요소가 정수여야 합니다.

순차적 저장: 배열은 요소들을 순차적으로 저장합니다. 이는 메모리 상에서 연속된 공간에 데이터를 배치함을 의미합니다.

인덱스 기반 접근: 각 요소는 고유한 인덱스를 가지며, 이를 사용하여 요소에 빠르게 접근할 수 있습니다. 첫 번째 요소의 인덱스는 0부터 시작합니다.

고정된 크기: 배열은 생성할 때 크기를 지정하며, 크기가 고정되어 있습니다. 크기를 변경하려면 새로운 배열을 생성하고 데이터를 복사해야 합니다.

메모리 효율성: 인덱스를 통한 빠른 접근이 가능하기 때문에 메모리 상에서 데이터를 효율적으로 관리할 수 있습니다.

연속적인 공간 할당: 배열은 요소들이 메모리 상에서 연속적으로 할당되므로, 인덱스를 통한 접근 시간이 일정합니다.


배열의 장점과 단점

장점:

빠른 접근 속도: 배열은 각 요소에 고유한 인덱스를 부여하여 O(1)의 시간 복잡도로 요소에 빠르게 접근할 수 있습니다. 이는 데이터를 효율적으로 검색하고 수정하는 데 도움을 줍니다.

메모리 관리 용이성: 배열은 요소들을 연속적인 메모리 공간에 저장하기 때문에 메모리 관리가 비교적 간단합니다. 인덱스를 사용하여 요소에 접근하기 때문에 메모리 주소 계산이 용이합니다.

이해하기 쉬운 구조: 배열은 간단하고 직관적인 구조를 가지고 있어 프로그래머들이 이해하고 사용하기 쉽습니다. 인덱스 기반 접근 방식은 직관적으로 이해할 수 있습니다.

연속적인 메모리 할당: 배열은 연속적인 메모리 공간에 할당되기 때문에 캐시 메모리의 활용도가 높아져 접근 속도가 빨라질 수 있습니다.

단점:

고정된 크기: 배열은 생성 시 크기가 결정되며, 크기 변경이 어렵습니다. 크기를 변경하려면 새로운 배열을 생성하고 기존 데이터를 복사해야 합니다.

메모리 낭비: 배열은 크기를 미리 지정해야 하므로, 실제로 사용하지 않는 큰 크기의 배열을 선언하면 메모리가 낭비될 수 있습니다.

삽입과 삭제의 어려움: 배열의 중간에 요소를 삽입하거나 삭제할 경우, 해당 위치 이후의 모든 요소를 이동시켜야 합니다. 이는 시간이 많이 소요되며, 삽입과 삭제 작업이 불편할 수 있습니다.

비효율적인 크기 변경: 크기를 동적으로 변경하려면 새로운 배열을 할당하고 기존 데이터를 복사해야 합니다. 이로 인해 메모리 할당 및 복사 작업이 추가로 필요하므로 비효율적입니다.


JavaScript 배열의 메서드

push()pop()

push() 메서드는 배열의 끝에 새로운 요소를 추가합니다.

const fruits = ['apple', 'banana', 'orange'];
fruits.push('grape');
console.log(fruits); // ['apple', 'banana', 'orange', 'grape']

pop() 메서드는 배열의 마지막 요소를 제거하고 반환합니다.

fruits.pop();
console.log(fruits); // ['apple', 'banana', 'orange']

shift()unshift()

shift() 메서드는 배열의 첫 번째 요소를 제거하고 반환합니다.

fruits.shift();
console.log(fruits); // ['banana', 'orange']

unshift() 메서드는 배열의 맨 앞에 새로운 요소를 추가합니다.

fruits.unshift('kiwi');
console.log(fruits); // ['kiwi', 'banana', 'orange']

concat()

concat() 메서드는 두 개 이상의 배열을 합쳐 새로운 배열을 반환합니다.

const moreFruits = ['grape', 'melon'];
const allFruits = fruits.concat(moreFruits);
console.log(allFruits); // ['kiwi', 'banana', 'orange', 'grape', 'melon']

join()

join() 메서드는 배열의 모든 요소를 문자열로 합쳐 반환합니다.

const fruitString = fruits.join(', ');
console.log(fruitString); // 'kiwi, banana, orange'

slice()

slice() 메서드는 배열의 일부분을 복사하여 새로운 배열을 반환합니다.

const citrus = fruits.slice(1, 3);
console.log(citrus); // ['banana', 'orange']

splice()

splice() 메서드는 배열에서 요소를 추가하거나 제거합니다.

fruits.splice(1, 1, 'grape');
console.log(fruits); // ['kiwi', 'grape', 'orange']

indexOf()lastIndexOf()

indexOf() 메서드는 배열에서 특정 요소의 첫 번째 인덱스를 반환합니다. lastIndexOf()는 마지막 인덱스를 반환합니다.

console.log(fruits.indexOf('orange')); // 2
console.log(fruits.lastIndexOf('kiwi')); // 0

find()findIndex()

find() 메서드는 주어진 조건에 맞는 첫 번째 요소를 반환합니다. findIndex()는 인덱스를 반환합니다.

const foundFruit = fruits.find(fruit => fruit.length > 5);
console.log(foundFruit); // 'orange'

const foundIndex = fruits.findIndex(fruit => fruit.length > 5);
console.log(foundIndex); // 2

filter()

filter() 메서드는 주어진 조건에 맞는 모든 요소를 반환합니다.

const longFruits = fruits.filter(fruit => fruit.length > 5);
console.log(longFruits); // ['orange']

map()

map() 메서드는 배열의 모든 요소에 함수를 적용하고 새로운 배열을 반환합니다.

const upperCaseFruits = fruits.map(fruit => fruit.toUpperCase());
console.log(upperCaseFruits); // ['KIWI', 'GRAPE', 'ORANGE']

forEach()

forEach() 메서드는 배열의 각 요소에 대해 함수를 실행합니다.

fruits.forEach(fruit => {
  console.log(`I like ${fruit}`);
});

reduce()

reduce() 메서드는 배열 요소를 하나로 축소하여 반환합니다.

const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, curr) => acc + curr, 0);
console.log(sum); // 15

sort()

sort() 메서드는 배열을 정렬합니다.

const sortedFruits = fruits.sort();
console.log(sortedFruits); // ['grape', 'kiwi', 'orange']

reverse()

reverse() 메서드는 배열의 요소 순서를 역순으로 변경합니다.

const reversedFruits = fruits.reverse();
console.log(reversedFruits); // ['orange', 'kiwi', 'grape']

includes()

includes() 메서드는 배열에 특정 요소가 있는지 확인합니다.

console.log(fruits.includes('kiwi')); // true
console.log(fruits.includes('apple')); // false

every()some()

every() 메서드는 배열의 모든 요소가 주어진 조건을 만족하는지 확인합니다. some()은 어느 하나라도 만족하는지 확인합니다.

console.log(fruits.every(fruit => fruit.length > 3)); // true
console.log(fruits.some(fruit => fruit.length > 5)); // true

toString()

toString() 메서드는 배열을 문자열로 변환합니다.

const fruitsString = fruits.toString();
console.log(fruitsString); // 'orange,kiwi,grape'

isArray()

isArray() 메서드는 주어진 값이 배열인지 확인합니다.

console.log(Array.isArray(fruits)); // true


console.log(Array.isArray('apple')); // false
profile
끝까지 가면 다 개발해...!

0개의 댓글