[자료구조] 배열 (Array)

건둔덕 ·2023년 2월 24일
0
post-thumbnail

배열이란?

프로그래밍 언어에서 배열은 기본적으로 제공되는 자료 구조(Data Structure)입니다.

int arr[10] = {1, 2, 3, 4, 5};

자바스크립트가 아닌 일반적인 프로그래밍 언어에서는 보통 배열을 선언할 때 배열의 크기도 같이 선언하게 됩니다.

이미지 출처: 인프런 '감자'님의 그림으로 쉽게 배우는 자료구조와 알고리즘(기본편)


배열을 선언하고 배열의 크기와 배열에 들어갈 값 까지 선언이 완료되었다면 운영체제는 메모리에서 숫자 10개가 들어갈 수 있는 연속된 빈 공간을 찾아서 위의 이미지 처럼 순서대로 숫자를 할당 해줍니다. 할당하지 않은 나머지 5자리는 의미가 없는 쓰레기 값이 저장되어 있게 됩니다.

그리고 운영체제는 배열의 시작 주소, 즉 숫자 1이 들어간 주소만 기억합니다. 이 때 개발자가 배열의 3번째 값에 접근하고 싶을 때는 arr[2] 이렇게 인덱스 값으로 한 번에 접근하게 됩니다.

한 번에 접근이 가능한 이유는 운영체제는 배열의 시작 주소를 기억하고 있기 때문에 arr[2] 값을 찾을 때 arr[0]의 주소로 부터 2칸 떨어진 주소의 데이터를 가져옵니다.

배열은 길이에 상관 없이 데이터를 가져올 때 한 번에 가져오기 때문에 O(1)의 성능을 가집니다.

이렇기 때문에 배열은 읽기/쓰기, 즉 참조에서 좋은 성능을 보이게 됩니다. 하지만 데이터를 추가/제거 할 때는 성능이 좋지 않습니다.

위에 선언했던 것 처럼 10개의 자리를 만들어둔 배열안에 10개의 자리를 전부 채운 후 추가로 5개의 배열을 추가하게 된다면 운영체제는 새로운 연속된 메모리 공간을 찾게 되고 새로 찾은 메모리 공간에 기존의 배열 10개의 값을 전부 복사한 후 추가된 5개의 배열을 또 추가하게 됩니다.

그렇다고 배열의 크기를 미리 크게 선언 하게되면 일시적으로는 해결이 될 수도 있지만 조금 더 크게 선언해둔 크기보다 배열의 크기가 더 커지면 문제가 더 생길 수 있고, 또 그 공간을 사용하지 않는다면 순전히 낭비되는 공간이 되는 것 입니다.

배열은 이처럼 데이터를 추가/제거 하려면 내부적으로 필요한 단계가 많이 들기 때문에 성능면에서 별로 좋지 않습니다.

자바스크립트에서의 배열

자바스크립트에서는 일반 프로그래밍 언어에서의 배열과는 달리 상황에 따라 메모리에 연속적 또는 불연속적으로 메모리를 할당하게 되지만 대부분 불연속적으로 할당하게 됩니다.

이미지 출처: 인프런 '감자'님의 그림으로 쉽게 배우는 자료구조와 알고리즘(기본편)

자바스크립트는 불연속적으로 할당되어 있는 메모리를 내부적으로 연결지어 사용자에게는 배열인 것 처럼 보이게 해줍니다. 이러한 이유 때문에 일반적인 프로그래밍 언어의 배열과는 조금 다르지만 자료구조(Data Structure)의 기능적인 부분만 봤을 때는 동일하기 때문에 배열이라고 할 수 있습니다.

배열의 장점배열의 단점
읽기, 쓰기와 같은 참조에서는 좋은 성능을 가지며 수치화 한다면 O(1)의 성능을 가지게된다.크기 예측이 힘들기 때문에 메모리 낭비가 발생할 수 있다.
데이터 삽입, 삭제가 비효율적이다.
profile
건데브

0개의 댓글