반응형
얕은 복사
새롭게 생성하는 객체에 다른 객체의 값을 대입하고 싶을 때 대입 연산자(=)를 사용.
Robot robot1("hi"); <- robot1이라는 Robot 객체 생성
Robot robot2 = robot1; <- robot2 생성할 때 robot1을 값으로 대입
대입 연산자를 이용한 객체의 대입은 얕은 복사(shallow copy)
얕은 복사(shallow copy)는 값을 복사하는 것이 아닌, 값을 가리키는 포인터를 복사.
-> 변수의 생성에서 대입 연산자를 이용한 값의 복사는 문제가 되지 않지만, 객체를 사용할 때 문제가 생길 수 있음!
-> 특히 객체의 멤버가 메모리 공간의 힙(heap) 영역을 참조할 경우에는 문제가 발생!
깊은 복사
깊은 복사를 하게 되면 새로운 메모리를 할당받아 데이터를 객체에 값을 대입하게 됨.
원하는 값을 받았지만 독립적으로 메모리를 써 문제가 생길 여지가 없음!
class Robot {
public:
char *name;
// 생성자
Robot(char* _name) {
//공간을 새로 할당해서 데이터를 입력
name = new char[strlen(_name) + 1];
strcpy(name, _name);
}
// 복사 생성자 - 깊은 복사
Robot(const Robot& r) {
//공간을 새로 할당해서 데이터를 입력
name = new char[strlen(r.name) + 1];
strcpy(name, r.name);
}
// 복사 생성자 - 얕은 복사
Robot(const Robot& r) {
// 주소값을 넣어줌
name = r.name;
}
}
코드로 보니 이해가 바로 되시죠!?
📌표로 한눈에 알아보도록 정리
얕은 복사 | 깊은 복사 |
포인터를 복사 | 데이터 자체를 통체로 복사 |
같은 메모리를 공유 | 독립적인 메모리 차지 |
깊은 복사보다 상대적으로 빠름(최소한의 복사만 하기 때문) | 얕은 복사보다 속도가 느림 |
728x90
'개발 언어 > cpp' 카테고리의 다른 글
cpp 증감 연산자 오버로딩 (전위 연산자, 후위 연산자) (0) | 2021.12.30 |
---|---|
CPP 클래스 상속(Inheritance) (0) | 2021.12.22 |
cpp 연산자 오버로딩(Operator Overloading) (0) | 2021.12.21 |
cpp 오버로딩(Overloading) (0) | 2021.12.21 |
cpp 복사생성자 (copy constructor) (0) | 2021.12.21 |
댓글