소개글
"방통대(방송통신대학교) 2020학년도 2학기 C++프로그래밍 기말과제물"에 대한 내용입니다.
목차
[문항 1] 복사 생성자, 이동 생성자, 대입 연산자, 이동대입 연산자에 대한 다음 과제를 작성하라. (30점)
가) 각각의 개념을 설명하라. (A4용지 1매 내외)
(나) 교재의 [소스코드 4-8, 4-9]의 Person 클래스에 복사 생성자, 이동 생성자, 대입 연산자, 이동대입 연산자를 추가하라.
[문항 2] 가상함수의 개념 및 용법을 간단한 예와 함께 A4용지 1매 내외로 설명하라. (20점)
[문항 3] 교재의 [소스코드 7-11]을 수정하여 [소스코드 5-6, 5-7]의 Complex2 객체의 배열에 대해 rPart의 제곱과 iPart의 제곱의 합을 기준으로 내림차순 정렬 및 합병을 하려고 한다. [소스코드 7-11]을 어떻게 수정해야 하는지 설명하고, 이 방법에 따라 프로그램을 수정하라. (20점)
본문내용
복사 생성자란, 동일한 클래스 내에 있는 다른 객체를 복사해서, 객체를 만드는 생성자이다. 만약, Person이라는 클래스의 객체를 a라는 변수로 만들었다면, 해당 a 객체 값의 내용을, 새로운 Person b라는 새로운 객체에 입력하는 것이다. 복사 생성자의 장점은, 생성자에 필요한 인자들을 직접 입력하지 않고도 똑같은 객체를 생성할 수 있다는 점이다. 프로그래머가 따로 지정하지 않아도 디폴트 복사 생성자가 기본적으로 설정되어 있다.
하지만 만약 데이터 멤버에 포인터가 있을 경우를 가정하고, 디폴트 복사 생성자로 객체가 만들어진다면, 얕은 복사의 문제점이 발생한다. 왜냐하면, 복사를 받은 객체 내의 포인터에는, 원본의 객체 내의 포인터의 주소가 입력되어 있을 것이다. 하지만 만약 원본 데이터가 해제된다면, 복사를 받은 객체의 포인터는, 해제된 빈 공간을 가리키게 된다. 이를 얕은 복사의 문제점이라고 한다. 이를 해결하기 위해, 포인터 주소가 아닌, 주소의 내용을 복사하는 깊은 복사 방법을 선택할 수 있다. 즉, 복사 생성자 내에서, 포인터를 위한 별도의 메모리를 할당(내용의 크기에 따라 달라짐)하고, 그 할당된 메모리가 복사할 실 내용을 담게끔 하는 것이다.
대입 연산자는 기본적으로 복사를 한다는 점에서, 복사 생성자와 유사하다. 대입 연산자 오버로딩을 구현해야 하는데, 대입을 받을 객체의 기존 데이터의 공간들을 비운 뒤에, 해당 빈자리에, 대입을 할 객체의 데이터를 각각 대입하면 된다. 기존 데이터에 포인터 변수를 위해 할당한 메모리가 있다면, 해제하고, 복사할 내용의 크기만큼 다시 메모리를 할당한 후, 내용을 복사하면 된다.
하지만, 만약에 어떤 객체를 잠깐만 사용할 경우가 있다. 객체 a와 b를 더한 값을 객체 c에 담고자 했을 때, 임시 객체인 (a+b)의 내용을 객체 c에 담을 때 깊은 복사가 일어나는데, 잠깐 있다가 값만 전달하는 객체인 (a+b)를 위한 메모리 할당은 프로그램의 비효율을 야기한다. 이 때, 이동 생성자가 활용하면 이를 해소할 수 있다.
참고 자료
없음