반응형

x, y의 좌표를 저장하는 8byte짜리 Point Class가 있다고 가정.
어느정도의 양이 필요할 지 알 수 없을 때, 객체 배열과 포인터 배열의 차이점


1. 객체 배열
Point arr[1000];
- 객체를 1000개 생성하여 총 8000byte의 메모리를 미리 할당
- 생성자 1000번을 호출하는 성능저하를 초래

2. 포인터 배열
Point *arr[100];
필요시, arr[index++] = new Point(생성자 맞게); 처럼 하나씩 메모리 할당
- 최초 주소배열 1000개, 즉 4000byte의 메모리를 미리 할당
- 객체는 실행 중 필요할 때, 동적 생성하므로 그 때마다 생성자 호출
- 포인터배열로 할 때에는, delete를 잊지 말아야 한다.

확실한 숫자를 알 수 없다면, 객체 배열은 비추!

3. 자료구조 클래스
그렇다고 포인터배열이 뛰어난 것은 아니다. 자료구조 클래스를 이용하도록 한다.
실제로 야기된 결과를 구지 보지 않아도, 이런 상황에서는 자료구조 클래스를 이용하는 것이 좋다.

- STL 컨테이너 : vector, list, map...
- MFC 컬렉션 : cArray, cList, cMap...

상황을 그대로.... 놓고 보면 가변길이에 적당한 vector나 List를 이용하면 편하다.

//동적 객체 생성
void DynamicObject()
{
   //new, delete 때 생성자와 소멸자 호출
   Point *p = (Point*)malloc(sizeof(Point));     //메모리할당 Only
   delete p;          //소멸자 호출

   Point *p1 = new Point;      //메모리할당 + 생성자 호출
   delete  p1;         //소멸자 호출
   p1 = NULL;

   p1 = new Point(12,34);
   p1->Print();
   delete  p1;
   p1 = NULL;

   int size;
   cout << "Point 객체 몇개 만들랭? \n";
   cin >> size;
   Point *arr = new Point[size];
   for(int i = 0; i < size; i++)
   {
     arr[i].SetX(i+1);
     arr[i].SetY(i+1);
     arr[i].Print();
   }
   delete []arr;
   arr = NULL;
}

 //객체에 대한 포인터 배열
void PointerArray()
{
 Point *arr[100] = {NULL}; //Point객체의 주소를 넣을 수 있는 포인트변수만 100개 준비
 int cnt = 0;

 while( cnt < 100)
 {
  arr[cnt++] = new Point(rand()%100, rand()%100);
  char yesno;
  cout << "계속 Point 객체 생성할래? (y/n) : ";
  cin >> yesno;
  if(yesno != 'y') break;
 }

 cout << cnt << "개의 Point 객체를 생성했따\n";
 for(int i = 0 ; i< cnt ; i ++)
  arr[i]->Print();

 for(int i = 0; i< cnt ; i++)
 {
  delete arr[i];
  arr[i] = NULL;
 }

}

//STL의 vector 클래스 이용
//동적으로 생성된 Point 객체의 주소를 저장하고 관리하는 경우
void UsingVector()
{
 vector <Point*> arr;

 while(1)
 {
  arr.push_back(new Point(rand()%100, rand()%100));  
  char yesno;
  cout << "계속 객체 생성할껴? (y/n) : ";
  cin >> yesno;
  if(yesno != 'y') break;
 }
 cout << arr.size() << "개의 Point 객체를 생성했습니다.\n";

 for(int i = 0; i < arr.size() ; i++)
  arr[i]->Print();

 //객체의 소멸자 호출
 for(int i = 0; i < arr.size() ; i++){
  delete arr[i];
  arr[i] = NULL;
 }

 //vector가 null포인터 3개를 갖고있는 셈
 cout << "clear()전의 원소수 : " << arr.size() << "\n";
 arr.clear();
 cout << "clear()후의 원소수 : " << arr.size() << "\n";
}

반응형
Posted by Rainfly
l