본문 바로가기
개발 언어/cpp

cpp 얕은 복사와 깊은 복사

by eeeun:) 2021. 12. 21.
반응형

얕은 복사

새롭게 생성하는 객체에 다른 객체의 값을 대입하고 싶을 때 대입 연산자(=)를 사용.

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

댓글