▣ 안녕하세요.
이번장에서는 복사 생성자(Copy Constructor)를 공부해보겠습니다.
복사 생성자란 다른 객체의 내용을 복사해서 만드는 생성자를 의미합니다.
다시 말해 객체를 복사해서 사용한다라고 생각하시면 됩니다.
▣ 복사 생성자는 컴파일러에 의해 자동으로 만들어집니다. 그리고 모든 멤버 변수를 자동 복사합니다.
직접 코드를 작성하며 공부해보겠습니다.
▣ 먼저 클래스를 생성하고 멤버 함수를 선언했습니다.
코드를 작성하다가 주의해야한껀 private으로 멤버 변수를 지정했기 때문에
this->num = n를 기본 생성자에 넣어주셔야
내가 기본생성자 호출로 받아온 매개변수 값을 멤버 변수에 대입할 수 있습니다.
▣ 그리고 이렇게 Calculator c2(c1), Calculator c3 = c1 코드처럼
두 가지 방법으로 복사를 진행했습니다.
저장을 하고 디버그를 해보면 이렇게 같은 값으로 멤버 함수가 출력되는 걸 확인할 수 있습니다.
그런데 여기서 눈여겨 볼게 있습니다.
그건 c1을 복사했는데, 기본 생성자가 한 번만 호출되었습니다.
쉽게 이야기해서 값만 복사했다고 생각하시면 되는데요.
이럴 경우 내가 새로운 복사 생성자를 만들더라도 복사 생성자만에 값을 조절할 수 없습니다.
그렇기 때문에 컴파일러에 의해 자동으로 복사 생성자를 지정하는 게 아닌 별도로 복사지 정자를 생성하는 게 존재합니다.
▣ 단 복사생성자를 생성할 때는 객체의 주소 값과 멤버 변수를 복사해줘야 합니다.
코드를 작성하며 공부해보겠습니다.
▣ 복사 생성자는 Calculator::Calculator(Calculator& c) 코드에서 처럼
Calculator& == reference variable 클래스의 주소 값을 매개변수로 지정해야 합니다.
그리고 클래스에서 선언을 하고
this->num = c.num + 10 복사한 생성자의 멤버 변수를 따로 지정했습니다.
코드를 저장하고 디버그를 해보면 복사한 생성자가 호출되고 더한 값들이 나오는 걸 확인할 수 있습니다.
이렇게 복사 생성자를 지정해서 만들게 되면 내가 복사한 생성자들을 다르게 조절할 수 있습니다.
또 다른 복사 코드를 공부해보겠습니다.
▣ 이렇게 = 대입 연산자를 이용해서 복사 생성자가 아닌 값만 복사할 수도 있습니다.
이걸 얕은 복사(shallow copy)라고 합니다.
그런데 이런 복사는 단점이 있습니다.
다른 코드를 작성하며 공부해보겠습니다.
▣ 클래스 멤버 변수를 포인터를 선언해주고, 기본 생성자에서 메모리를 할당해줍니다.
그리고 소멸자에서 소멸자가 호출되면 할당한 메모리를 삭제해주는 코드를 넣었습니다.
▣ 그리고 저장을 하고 디버그를 하면 이렇게 오류가 나는 걸 확인할 수 있습니다.
그건 얕은 복사(shallow copy)는 할당받은 메모리를 공유한 형태로 표면적인 것만 복사하기입니다.
쉽게 이야기해서 같은 메모리(주소)를 가리키고 사용하기 때문입니다.
풀어서 설명하면 c1과 c2가 같은 주소를 메모리 주소를 가리키고 있는데
c2가 끝나서 소멸자를 통해 메모리가 삭제되었다고 생각해봅시다.
그럼 c1은 메모리를 가리키는 게 없어지게 됩니다. 그럼 이렇게 오류가 나오게 됩니다.
이럴 경우 복사 생성자를 사용하면 됩니다.
▣ 복사 생성자 함수에 메모리 할당하는 코드를 넣어줍니다.
이걸 하면 되면 깊은 복사(deep copy)가 됩니다.
깊은 복사란 틀을 복사해서 별도로 만든다라고 생각하시면 됩니다.
다시 정리하면 깊은 복사(Deep Copy)는 값을 새로운 메모리 공간에 복사하는 것
얕은 복사(Shallow Copy)는 가리키는 메모리의 주소를 복사하는 것이라고 생각하시면 됩니다.
저장을 하고 디버그를 하면 이렇게 오류가 나오지 않고 잘 나오는 걸 확인할 수 있습니다.
'[ C++ ] > - C++ 문법공부' 카테고리의 다른 글
C++ 16장 [static 멤버 변수, 함수] (2) | 2022.11.16 |
---|---|
C++ 15장 [디폴트 매개변수] (0) | 2022.11.11 |
C++ 13장 [참조변수] (0) | 2022.11.04 |
C++ 12장 [함수객체] (1) | 2022.11.03 |
C++ 11장 [string] (0) | 2022.10.28 |
댓글