1. 소멸자
소멸자 호출 시에 data 배열을 삭제

2. push_back
(1) size와 capacity의 크기가 같게 되면 용량의 확장이 발생
(2) capacity와 새로운 capacity가 동일하면(capacity가 0이었을 때 발생함) 1 증가시켜야 함.
(3) reserve 함수를 호출해서 새로운 capacity 값을 전달
(4) _size 인덱스의 값에 매개변수를 전달
(5) size의 크기를 증가시킴

3. reserve
(1) 기존의 capacity는 매개변수의 값보다 작을 수 없음(축소불가).
(2) capacity 값을 대입
(3) 데이터 복사 전에 새로운 메모리 영역을 capacity로 동적 할당해야함.
(4) 새로운 데이터 영역에 기존 데이터를 복사
(5) 기존 데이터 영역 할당 해제
(6) 데이터 대체

4. clear
(1) 데이터가 존재하면 소멸자를 호출
(2) capacity는 삭제되지 않으므로 데이터에 capacity 개수만큼 가지는 배열을 동적으로 생성함
(3) size가 0이 됨.

 

5. 동적 배열(Vector) 구현

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

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)
				newCapacity++;

			reserve(newCapacity);
		}
		// 데이터 저장
		_data[_size] = value;

		// 데이터 개수 증가
		_size++;
	}

	void reserve(int capacity)
	{	// 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 pos) { return _data[pos]; }

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

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

(1) resize와 reserve의 차이?

- resize : 실제 데이터 개수를 변화시키면서 capacity도 같이 증가시킴. 더 작은 수로 resize 하면 이후의 데이터가 삭제됨.

-> 배열의 개수가 증가하면 기본 값으로 초기화 함.

 

- reserve : 배열의 capacity를 증가시키지만 요소 개수(size)는 그대로 유지됨. 초기화도 하지 않음.

 

(2) reserve에서 동적할당에 대한 설명

new T[_capacity]는 T 타입의 요소를 _capacity 개수만큼 가지는 배열을 동적으로 생성한다.

이후에 기존의 데이터를 그대로 복사한 후에 기존의 데이터 영역을 할당 해제한다.

그리고 새로운 데이터를 기존의 데이터에 다시 복사한다.