🧱 동적 배열이란?

  • 배열과 유사하지만 크기를 유동적으로 조절 가능
  • STL에서 제공하는 std::vector가 대표적인 동적 배열
  • 동적 배열 구현의 핵심:
    증설(reserve), 삽입(push_back), 접근(operator[]), 초기화(clear)

🛠️ 직접 구현한 Vector 클래스

template<typename T>
class Vector
{
public:
    Vector() {}
    ~Vector()
    {
        if (_data)
            delete[] _data;
    }

    void push_back(const T& value)
    {
        if (_size == _capacity)
        {
            int newCapacity = static_cast<int>(_capacity * 1.5);
            if (newCapacity == _capacity) // 0일 경우 방지
                newCapacity++;

            reserve(newCapacity);
        }

        _data[_size] = value;
        _size++;
    }

    void reserve(int capacity)
    {
        if (_capacity >= capacity)
            return;

        _capacity = capacity;
        T* newData = new T[_capacity];

        for (int i = 0; i < _size; i++)
            newData[i] = _data[i];

        if (_data)
            delete[] _data;

        _data = newData;
    }

    void clear()
    {
        if (_data)
        {
            delete[] _data;
            _data = new T[_capacity]; // capacity는 유지
        }
        _size = 0;
    }

    T& operator[](const int index) { return _data[index]; }

    int size() { return _size; }
    int capacity() { return _capacity; }

private:
    T* _data = nullptr;
    int _size = 0;
    int _capacity = 0;
};

📌 주요 함수 해설

🔹 push_back(const T& value)

새로운 요소를 배열 끝에 추가합니다.

  • 현재 _size == _capacity면 → 증설 필요
  • _capacity * 1.5 방식으로 증가 (STL과 유사한 방식)
  • 기존 데이터 유지 + 새 데이터 추가

🔹 reserve(int capacity)

새로운 공간을 확보하며, 기존 데이터를 복사합니다.

  • 요청한 크기가 현재보다 작으면 무시
  • 기존 배열을 새 배열로 교체 후 삭제 (깊은 복사 방식)

🔹 clear()

데이터를 모두 지우되 capacity는 유지

  • 데이터를 삭제하고 새 배열로 초기화
  • _size는 0으로 리셋

🔹 operator[]

배열처럼 요소 접근 가능

  • vector[3]과 같이 사용 가능
  • 인덱스 범위 체크는 구현되어 있지 않음

🔹 size() vs capacity()

  • size: 현재 담긴 요소의 개수
  • capacity: 할당된 전체 공간 (여유분 포함)

🧪 실습 코드 분석

int main()
{
    Vector<int> v;

    for (int i = 0; i < 100; i++)
    {
        v.push_back(i);
        cout << v[i] << " " << v.size() << " " << v.capacity() << endl;
    }

    v.clear();
    cout << "After clear: " << v.size() << " " << v.capacity() << endl;
}

실행 흐름

  1. Vector<int> 객체 생성
  2. push_back 100회 반복
    • 매 삽입마다 size, capacity 출력
    • 증설이 일어날 때 capacity가 점프식 증가
  3. clear() 호출
    • 모든 데이터 삭제 (size == 0)
    • 하지만 capacity는 유지됨

📊 vector의 reserve() vs resize() 차이

함수명목적크기 변화capacity 변화초기화
reserve(n)공간 확보❌ size 그대로✅ 증가 가능❌
resize(n)크기 조절✅ 바뀜✅ 또는 유지✅ default 값으로 초기화됨

reserve: "미리 방만 만들어둠"
resize: "방을 만들고 사람도 넣음"


profile
李家네_공부방

0개의 댓글