배열 (Array)
핵심
배열 (Array)
메모리 구조
| 인덱스 | 0 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|---|
| 값 | 10 | 20 | 30 | 40 | 50 |
| 주소 | 100 | 104 | 108 | 112 | 116 |
주소가 4씩 일정하게 늘어납니다. 연속된 메모리 공간에 놓이기 때문입니다.
시간 복잡도
| 연산 | 복잡도 | 이유 |
|---|---|---|
| 인덱스 접근 | O(1) | 주소 = 시작 + index × size |
| 뒤에 추가 | O(1) | 배열 확장 시 O(n) |
| 앞/중간 삽입 | O(n) | 뒤 요소 전부 시프트 |
| 삭제 | O(n) | 빈 공간 메우기 |
| 탐색 (미정렬) | O(n) | 순차 탐색 |
| 탐색 (정렬) | O(log n) | 이진 탐색 가능 |
실무 포인트
- 캐시 지역성: 연속 메모리라 CPU 캐시 히트율 높음
- Java ArrayList: 내부적으로 배열. 조회 많으면 유리
- 동적 배열: 용량 초과 시 2배로 확장 후 복사 (amortized O(1))
면접 키워드
"배열은 왜 인덱스 접근이 O(1)인가?" → 연속 메모리 + 주소 계산
면접에서 이렇게 나옵니다
- Q.배열에서 인덱스 접근이 O(1)인 이유를 설명해주세요
- Q.동적 배열(ArrayList)의 확장 방식을 설명해주세요
- Q.배열 vs 연결리스트, 캐시 효율 관점에서 비교해주세요