포인터 객체 배열이란?
클래스의 객체의 주소값을 가르키는 포인터들을 담는 배열이다.
간략하게 사용법을 적는다.
Storage* Arr[100];
선언을 한후 초기화는 하지않았다.
배열은 선언후 초기화를 해야하지않나요?
하지만 프로그램의 실행중에 동적으로 생성되는 객체를 무슨수로 초기화할 수 있을까.
그럼 메커니즘을 설명해보겠다.
Arr[100] 포인터 배열은 초기화가 안되어있으므로
Arr[0]. Arr[1].... --------------> NULL 을 가르킨다. // 전역변수로 선언시!
배열요소가 비어있는 판단하는 기준은 Arr[i]==NULL 인지를 판단하고
객체의 생성은 new키워드의 동적할당이다.
이렇게 동적할당된
////////// 포인터배열은 전역변수로 선언시 모든 요소는 NULL로 초기화된다.
////////// 하지만 main 안으로 선언할시 모든요소가 쓰레기값을 가지므로 NULL인지로 판단하면안된다. 이럴경우 어떻게하면될까.
실험을 해보면 알겠지만 객체 배열 선언시 기본 생성자의 호출이 요소의 개수만큼 호출되지만,
포인터 객체 배열 선언시 생성자의 호출이 없다.! 왜냐하면 포인터선언은 객체를 생성하지않기때문이다.
이런, 초기화 루투가 막혔다. 멤버변수에 플래그를 달던지, 아니면 모든값을 NULL로 초기화해야 한다.
그런데 멤버변수에 플래그를 다는법은 객체가 모두 존재해야할때만 가능한데, 포인터객체배열은 선언만 되있는 상태에선 객체의 크기만큼의 공간을 가르킬 뿐이지, 실제 객체가 존재하는것은 아니다. 그러므로 이방법은 불가능하다.
그럼 for문으로 다음과같이 가르키는 주소값을 초기화하면 우리는 객체생성존재유무가 판단이가능하다.
for(int i;i<MAX;i++){
Storage[i]=NULL;
}
// 객체지향을 하는 목적중 하나인 캡슐화를 위해서 Storage 클래스의 포인터배열을 생성할시 지역전역변수를 사용하지 말도록한다.
그러기위해선 Storage객체배열을 멤버변수로 하는 StorageHandler 클래스를 만들도록한다.
그리고 StorageHandler 클래스의 객체생성시 기본생성자에서 Storage 포인터배열객체들이 NULL값을 가지도록 초기화하면된다.
우리는 이렇게 클래스를 설개함으로써 단지 main 에선 StorageHandler객체를 생성하기만하면 된다.