Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 배열 vs 벡터: 벡터가 갖는 핵심 장점과 차이점

C++에서는 배열(array)벡터(vector) 모두 여러 데이터를 순차적으로 저장할 수 있지만, 두 자료구조는 동작 방식과 사용 편의성에서 큰 차이를 보입니다. 이 글에서는 배열 대신 벡터를 사용할 때 얻을 수 있는 장점과 함께, 몇 가지 주의할 점까지 코드 예제와 함께 정리해 보겠습니다.

1. 언어 구조 vs 템플릿 클래스

  • 벡터는 std::vector라는 템플릿 클래스로, C++에만 존재하는 고유 기능입니다.
  • 반면 배열은 C++뿐 아니라 C, Java 등 다양한 언어에 존재하는 언어 차원의 내장 구조(built-in construct)입니다.

2. 정적/동적 할당 방식의 차이

벡터는 내부적으로 동적 배열(dynamic array) 형태로 구현되어 리스트 인터페이스를 제공합니다. 반면 일반 배열은 기본 타입(primitive type)을 기반으로 정적 또는 동적 방식으로 선언해야 합니다.

예제 코드

#include<iostream>
#include<vector>
using namespace std;

int main() {
    int arr[10];            // 정적 할당 배열
    int* dynArr = new int[10]; // 동적 할당 배열
    vector<int> vec;        // 크기가 자동으로 조절되는 벡터
}

3. 고정된 크기 vs 동적 크기 조절

배열은 한 번 생성하면 크기를 변경할 수 없습니다. 반면 벡터는 요소를 추가할 때 공간이 부족하면 더 넉넉한 새 메모리 공간을 자동으로 확보하고 기존 데이터를 옮기므로, 크기를 신경 쓰지 않아도 됩니다.

4. 수동 해제 vs 자동 해제

new로 동적 할당한 배열은 사용 후 반드시 delete[]로 직접 해제해야 하며, 이를 잊으면 메모리 누수가 발생합니다. 벡터는 스코프(범위)를 벗어나면 소멸자가 자동으로 메모리를 해제하기 때문에 훨씬 안전합니다.

예제 코드

#include<iostream>
#include<vector>
using namespace std;

int main() {
    int* arr = new int[10]; // 동적 할당 배열
    delete[] arr;           // 반드시 수동 해제 필요

    vector<int> vec;        // 변수가 범위를 벗어나면 자동 해제됨
}

5. 크기 확인의 편의성

동적 할당된 배열은 포인터만 남기 때문에 원래 크기를 쉽게 알 수 없습니다. 반면 벡터는 size() 멤버 함수를 통해 상수 시간(O(1))에 크기를 즉시 확인할 수 있습니다.

6. 함수 전달 시의 차이

배열을 함수에 전달하려면 배열 자체 외에 크기(길이) 정보를 담은 별도의 매개변수를 함께 넘겨야 합니다. 벡터는 크기 정보를 스스로 가지고 있으므로 추가 매개변수 없이 객체 하나만 전달하면 됩니다.

7. 함수 반환 가능 여부

배열은 동적으로 할당한 경우가 아니라면 함수의 반환값으로 사용할 수 없습니다. 반면 벡터는 값 복사나 이동 의미론(move semantics)을 통해 함수에서 자유롭게 반환할 수 있어 코드 작성이 훨씬 유연합니다.

정리

항목배열벡터
크기 변경불가능 (고정)자동 확장
메모리 해제수동 (delete[])자동 (RAII)
크기 확인별도 관리 필요size()로 O(1)
함수 전달크기 매개변수 필요객체만 전달
함수 반환동적 할당 시에만 가능자유롭게 가능

이처럼 벡터는 메모리 관리와 크기 처리 측면에서 배열보다 훨씬 안전하고 편리합니다. 특별한 성능 최적화나 저수준 제어가 필요한 경우가 아니라면, 현대 C++에서는 std::vector를 기본 컨테이너로 사용하는 것이 권장됩니다.