본문 바로가기
C++ 공부

[C++]Vector 와 Array 비교

by honey달콤 2024. 7. 27.
반응형

C++에서 vector와 array는 모두 데이터를 저장하는 컨테이너로 사용되지만, 각각의 특성과 사용법에는 차이가 있습니다. 여기서는 std::vector와 C 스타일 배열을 비교하고, 각각의 장단점을 설명하겠습니다.

Vector 

장점

  1. 동적 크기 조정: vector는 필요에 따라 자동으로 크기를 조정할 수 있습니다. 요소를 추가하거나 제거할 때 자동으로 메모리를 관리합니다.
  2. 안전성: vector는 범위 검사, 예외 처리 등을 제공하여 더 안전한 코드 작성을 돕습니다. 예를 들어, at 메서드는 범위 밖의 인덱스에 접근하면 예외를 발생시킵니다.
  3. 풍부한 인터페이스: 다양한 메서드(push_back, pop_back, insert, erase 등)를 통해 유연하게 데이터를 조작할 수 있습니다.
  4. 표준 라이브러리 통합: STL의 다른 컨테이너 및 알고리즘과 쉽게 통합할 수 있습니다.

단점

  1. 성능 오버헤드: 동적 메모리 할당 및 범위 검사 등으로 인해 Array보다 약간의 성능 오버헤드가 발생할 수 있습니다.
  2. 메모리 사용: 추가적인 메타데이터와 동적 메모리 할당으로 인해 Array보다 더 많은 메모리를 사용할 수 있습니다.

Array

장점

  1. 고정된 크기: 컴파일 타임에 크기가 고정되어 있어 메모리 할당이 효율적입니다.
  2. 성능: 불필요한 오버헤드가 없어서 매우 빠르고, 특히 성능이 중요한 상황에서 유리할 수 있습니다.

단점

  1. 고정된 크기: 배열의 크기가 고정되어 있어, 실행 중에 크기를 변경할 수 없습니다.
  2. 안전성 부족: 배열은 범위 검사 등을 제공하지 않아, 잘못된 인덱스 접근으로 인해 메모리 오버플로우 등의 문제가 발생할 수 있습니다.
  3. 메모리 관리: 동적 할당된 배열의 경우, 메모리 관리를 직접 해야 하며, 메모리 누수 등의 위험이 있습니다.
  4. 인터페이스 부족: vector와 같은 풍부한 메서드를 제공하지 않아서, 많은 기능을 직접 구현해야 합니다.

예제 코드 비교

Vector 예제

#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers;

// Vector 추가 
    numbers.push_back(1);
    numbers.push_back(2);
    numbers.push_back(3);

    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

// Vector 제거 
    numbers.pop_back();

    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

 

Vector 결과

1 2 3	// push_back
1 2	// pop_back

 

Array 예제

#include <iostream>

int main() {
// 배열 3개 선언 
    int numbers[3] = {1, 2, 3};

    for (int i = 0; i < 3; ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    // 배열 크기는 고정되어 있어서
    // pop_back과 같은 동작을 흉내내려면 직접 구현해야 합니다.
    // for loop 의 조건 i < 2 이므로, 배열[0], [1] 만 출력
    
    int newSize = 2;
    for (int i = 0; i < newSize; ++i) {
        std::cout << numbers[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

 

요약

  • **std::vector**는 동적 크기 조정, 안전성, 유연한 인터페이스 등으로 일반적인 경우에 더 많이 사용됩니다.
  • C 스타일 배열은 고정된 크기, 성능, 메모리 효율성 등의 장점으로 인해 성능이 중요한 경우에 적합합니다.

사용하려는 상황에 맞게 적절한 컨테이너를 선택하는 것이 중요합니다.

반응형

댓글