본문 바로가기
카테고리 없음

정적 배열 vs 동적 배열 (메모리 할당, 성능 차이)

by kguidebook0001 2026. 1. 31.

정적 배열 vs 동적 배열
정적 배열 vs 동적 배열

 

프로그래밍을 처음 배울 때 가장 먼저 접하는 자료구조는 배열(Array)입니다. 하지만 실제 현업 프로젝트나 시스템 프로그래밍 단계로 넘어가면, 단순히 데이터를 담는 것을 넘어 메모리 관리(Memory Management)의 효율성을 고민해야 합니다. 이때 가장 빈번하게 마주치는 선택지가 바로 정적 배열(Static Array)동적 배열(Dynamic Array)입니다. 이 두 가지는 데이터를 연속적으로 저장한다는 공통점이 있지만, 메모리 할당 시점과 위치, 그리고 리사이징(Resizing) 메커니즘에서 결정적인 차이를 보입니다. 본 글에서는 컴퓨터 구조론적 관점에서 두 배열의 차이를 분석하고, 상황에 맞는 최적의 선택 기준을 제시합니다.

1. 정적 배열(Static Array): 컴파일 타임의 결정

정적 배열은 프로그램이 실행되기 전, 즉 컴파일 타임(Compile Time)에 크기가 결정되는 배열입니다. 선언과 동시에 크기가 고정되며, 프로그램이 종료될 때까지(혹은 함수가 종료될 때까지) 그 크기를 변경할 수 없습니다.

1-1. 메모리 구조: 스택(Stack) 영역

대부분의 정적 배열은 메모리의 스택(Stack) 영역에 할당됩니다. 스택은 메모리 할당과 해제가 매우 빠르다는 장점이 있지만, 공간이 제한적입니다.

  • 장점: 별도의 메모리 할당/해제 연산(Allocation/Deallocation) 비용이 거의 없어 속도가 매우 빠릅니다.
  • 단점: 선언된 크기보다 더 많은 데이터를 저장할 수 없으며(Overflow), 반대로 너무 큰 크기를 잡아놓고 조금만 쓰면 메모리 낭비가 발생합니다.

2. 동적 배열(Dynamic Array): 런타임의 유연성

동적 배열은 프로그램 실행 중, 즉 런타임(Run Time)에 필요한 만큼의 메모리를 요청하여 할당받는 배열입니다. 사용자의 입력값이나 파일의 크기 등 실행 전에는 알 수 없는 데이터 양을 처리할 때 필수적입니다.

2-1. 메모리 구조: 힙(Heap) 영역

동적 배열은 힙(Heap) 영역을 사용합니다. 힙은 스택보다 훨씬 큰 공간을 가질 수 있지만, 개발자가 직접 메모리를 관리해야 하는 책임이 따릅니다(C/C++의 경우). Java나 Python 같은 현대 언어는 Garbage Collector가 이를 대신 수행하지만, 내부 원리는 동일합니다.

2-2. 리사이징(Resizing)과 성능 비용

동적 배열의 가장 큰 특징은 크기 조절이 가능하다는 점입니다. 하지만 이 과정에서 비용(Overhead)이 발생합니다.

  1. 기존 배열보다 더 큰(보통 2배) 새로운 메모리 공간을 힙에 할당합니다.
  2. 기존 데이터를 새로운 공간으로 모두 복사(Copy)합니다.
  3. 기존 메모리를 해제합니다.

이러한 복사 과정은 O(n)의 시간 복잡도를 가지므로, 잦은 리사이징은 성능 저하의 주원인이 될 수 있습니다. 이를 방지하기 위해 많은 언어(예: C++ std::vector, Java ArrayList)는 미리 여유 공간(Capacity)을 확보해두는 전략을 사용합니다.

3. 성능 비교 및 기술적 선택 가이드

두 배열 방식은 각각의 장단점이 명확하므로, 개발하려는 애플리케이션의 성격에 따라 신중하게 선택해야 합니다.

3-1. 시간 복잡도와 접근 속도

  • 데이터 접근(Access): 두 방식 모두 연속된 메모리 주소를 가지므로 인덱스를 통한 접근은 O(1)로 동일하게 빠릅니다.
  • 데이터 삽입(Insertion): 정적 배열은 불가능하며, 동적 배열은 평소에는 O(1)이지만 배열이 꽉 찼을 때 리사이징이 발생하면 O(n)이 걸립니다. (이를 분할 상환 분석으로 보면 평균적으로 Amortized O(1)이라 합니다.)

4. C++ 코드로 보는 구현 차이

메모리 할당의 차이를 가장 명확하게 보여주는 C++ 코드를 통해 비교해 보겠습니다.


#include 
#include 

int main() {
    // 1. 정적 배열 (Stack)
    // 컴파일 시 크기 5로 고정. 변경 불가.
    int staticArr[5] = {1, 2, 3, 4, 5}; 

    // 2. 동적 배열 (Heap - Raw Pointer)
    // 런타임에 크기 결정 가능. 개발자가 delete로 해제해야 함.
    int size = 10;
    int* dynamicArr = new int[size]; 
    delete[] dynamicArr; // 메모리 누수 방지

    // 3. 동적 배열 (Standard Library - Vector)
    // 내부적으로 힙을 사용하며 자동으로 리사이징 및 해제 관리
    std::vector vec;
    vec.push_back(10); // 공간 부족 시 자동 증설 (Capacity 증가)
    
    return 0;
}
[핵심 요약 : 정적 배열 vs 동적 배열]
1. 메모리 위치: 정적 배열은 스택(Stack), 동적 배열은 힙(Heap)을 주로 사용합니다.
2. 결정 시점: 정적은 컴파일 타임(고정 크기), 동적은 런타임(가변 크기)에 결정됩니다.
3. 성능 고려: 데이터 크기가 예측 가능하고 빠른 속도가 중요하다면 정적 배열, 유연한 데이터 처리가 필요하다면 동적 배열을 선택하십시오.