#pragma once
#include "assert.h"
// 동적 배열 클래스 템플릿
template<typename T>
class DynamicArray
{
private:
T* adress; // 배열의 첫번째 인덱스 주소
int dataCount; // 배열에 저장된 요소의 개수
int maxCount; // 현재 배열에 저장할 수 있는 최대 요소의 개수
public:
void push_back(const T& data);
void resize(int size);
T& operator [] (int index);
public:
DynamicArray();
~DynamicArray();
};
template<typename T>
DynamicArray<T>::DynamicArray()
: adress(nullptr)
, dataCount(0)
, maxCount(2) // 배열 객체를 처음 생성할 시 기본 크기 지정
{
adress = new T[2];
}
template<typename T>
DynamicArray<T>::~DynamicArray()
{
delete[] adress; // 동적할당 메모리 해제
}
// 배열에 요소 추가
template<typename T>
void DynamicArray<T>::push_back(const T& data)
{
if (maxCount <= dataCount) // 배열의 자리가 모두 찻을 경우
{
resize(maxCount * 2); // 동적 메모리 재할당
}
adress[dataCount++] = data;
}
// 배열 크기 재할당
template<typename T>
void DynamicArray<T>::resize(int size)
{
if (maxCount >= size) // 리사이즈 할 크기가 현재 배열의 최대 크기보다 작을 경우
{
assert(nullptr);
}
T* newArray = new T[size];
for (int i = 0; i < dataCount; ++i)
{
newArray[i] = adress[i]; // 새로운 동적 배열에 이전 동적 배열 요소 복사
}
delete[] adress; // 이전 동적 메모리 해제
adress = newArray; // 새로운 동적 메모리 주소값 갱신
maxCount = size;
}
// operator overloading
template<typename T>
T& DynamicArray<T>::operator[](int index)
{
return adress[index];
}