Array: 연속된 메모리 공간에 데이터를 저장하는 자료구조
배열(Array)은 같은 타입의 데이터 요소들을 연속적인 메모리 공간에 저장하는 자료구조이다. 인덱스를 통해 각 요소에 빠르게 접근할 수 있으며, 웹 개발을 포함한 다양한 분야에서 핵심적으로 활용된다. 배열의 크기는 선언 시 또는 동적으로 결정될 수 있다.
1. 개념
배열(Array)은 동일한 자료형의 데이터를 순서대로 저장하는 자료구조이다. 물리적으로 메모리 상에 연속적인 공간을 차지하며, 각 요소는 인덱스(index)를 통해 접근한다. 인덱스는 보통 0부터 시작하여 배열의 크기 - 1 까지의 정수 값을 가진다.
2. 왜 사용하는가
- 빠른 접근 속도: 배열은 인덱스를 사용하여 O(1) 시간 복잡도로 특정 요소에 직접 접근할 수 있다.
- 메모리 효율성: 데이터들을 연속적으로 저장하여 메모리 사용량을 줄일 수 있다.
- 데이터 관리 용이: 순서가 있는 데이터를 효과적으로 관리하고 탐색하는 데 유용하다.
3. 동작 원리
배열은 메모리 상에 다음과 같이 구성된다:
[element_0] [element_1] [element_2] ... [element_n-1]
address address address addresselement_i는 i번째 요소의 값을 저장하고, address는 해당 메모리 주소를 나타낸다. 배열의 시작 주소(base address)를 알고 인덱스 i를 통해 접근하면, 다음과 같은 계산으로 원하는 요소의 메모리 주소를 구할 수 있다:
base_address + i * element_size
여기서 element_size는 배열 요소 하나의 크기(byte 단위)이다. 이 계산을 통해 상수 시간 내에 요소에 접근할 수 있다.
4. 코드 예제
# Python에서 리스트는 동적 배열과 유사하게 동작한다.
# 고정된 크기의 배열은 array 모듈을 사용할 수 있다.
arr = [1, 2, 3, 4, 5]
print(arr[0]) # 첫 번째 요소 접근 (O(1))
# 새로운 요소 추가
arr.append(6)
print(arr)
# 특정 위치에 요소 삽입
arr.insert(2, 10) # 인덱스 2에 10을 삽입 (O(n), 뒤의 요소들을 모두 이동해야 함)
print(arr)5. 시간 복잡도 또는 성능 특성
| 연산 | 시간 복잡도 | 설명 | |--------------|-------------|-----------------------------------------| | 접근 (Access) | O(1) | 인덱스를 통해 요소에 직접 접근 | | 삽입/삭제 | O(n) | 배열 중간에 삽입/삭제 시 뒤의 요소들을 이동해야 함 | | 탐색 | O(n) | 선형 탐색을 사용하는 경우 |
6. 실무 사용 사례
- 데이터베이스 인덱스: 데이터베이스에서 특정 필드를 기준으로 빠르게 검색하기 위해 배열 형태의 인덱스를 사용한다.
- 이미지 처리: 이미지 데이터를 2차원 배열 형태로 저장하여 각 픽셀에 접근하고 조작한다.
- 캐시 구현: 캐시 데이터를 배열에 저장하여 빠른 데이터 접근을 지원한다.
- 웹 개발: JavaScript에서 배열은 DOM 요소 목록, API 응답 데이터 등 다양한 데이터를 처리하는 데 사용된다.
7. 주의할 점
- 고정 크기 vs 동적 크기: 고정 크기 배열은 메모리 효율성이 높지만 크기를 변경할 수 없다. 동적 배열은 크기 변경이 가능하지만 삽입/삭제 시 성능 저하가 발생할 수 있다.
- 배열 오버플로우 (Array Overflow): 배열의 범위를 벗어난 인덱스에 접근하면 오류가 발생한다. 주의하여 인덱스를 관리해야 한다.
8. 핵심 정리
배열은 효율적인 데이터 관리를 위한 기본적인 자료구조이다. O(1) 시간 복잡도로 요소에 접근할 수 있다는 장점이 있지만, 삽입/삭제 연산에는 비용이 많이 들 수 있다. 상황에 맞는 배열의 크기를 선택하고, 인덱스 범위를 벗어나지 않도록 주의해야 한다.