객체를 저장할 수 있는 배열 클래스를 정의할 때, 두 가지 형태로 각각 정의할 수 있다.


1. 객체를 저장하는 배열 기반의 클래스.


2. 객체의 주소 값을 저장하는 배열 기반의 클래스.


즉, 저장의 대상이 객체이냐, 아니면 객체의 주소 값이냐에 차이가 있는 것이다.



# Point 객체를 저장하는 배열 기반의 클래스



36행: Point 객체로 이뤄진 배열을 생성하고 있다. 인자를 받지 않는 void 생성자의 호출을 통해서 배열요소를 이루는 객체가 생성되므로, 위에 정의된 생성자에 설정된 디폴트 값에 의해 객체의 모든 멤버가 0으로 초기화된다.


67~70행: 임시객체를 생성해서 배열요소를 초기화하고 있다. 초기화의 과정에서 디폴트 대입 연산자가 호출되어 멤버 대 멤버의 복사가 진행된다. 저장의 대상이 객체라면, 여기서 보이는 것과 같이 대입 연산자를 통해서 객체에 저장된 값을 복사해야 한다.






# Point 객체의 주소 값을 저장하는 배열 기반의 클래스

(많이 사용되는 방법)




24행: Point 포인터 형을 의미하는 POINT_PTR을 정의하였다. 

저장의 대상, 또는 연산의 주 대상이 포인터인 경우, 이렇듯 별도의 자료형을 정의하는 것이 좋다.


39행: 저장의 대상이 point 객체의 주소 값이기 때문에 POINT_PTR 배열을 생성하였다.


77행: Point 객체의 주소 값을 저장하고 있다. 이렇듯 객체의 주소 값을 저장할 경우, 깊은 복사냐 얕은 복사냐 하는 문제를 신경 쓰지 않아도 된다.


※ 위의 예제와 같이 주소 값을 저장하는 경우, 

객체의 생성과 소멸을 위한 new, delete 연산 때문에 더 신경 쓸 것이 많아 보이지만, 

깊은 복사냐 얕은 복사냐 하는 문제를 신경 쓰지 않아도 되기 때문에 이 방법이 더 많이 사용된다.

Posted by scii
: