프로그래밍을 하면서 알게 모르게 객체 복사를 많이 사용한다.
class Dog{
public:
string name;
int age;
}
void main(){
Dog dog = Dog();
Dog dog2 = dog;
Dog dog3;
dog3 = dog;
}
main에서의 대입은 우리가 흔하게 사용하는 코드이다.
dog2에 dog을 넣고, dog3에 dog을 넣는 것 모두 복사에 해당한다.
무엇을 복사하느냐?
메모리 번지수
|
변수명
|
값
|
100
|
Dog 인스턴스
|
String name
Int age
|
200
|
dog
|
100(주소값)
|
300
|
dog2
|
100(주소값)
|
400
|
dog3
|
100(주소값)
|
이렇게 주소값만 가지는 것을 얕은 복사라 한다.
대부분의 경우 이와 같은 얕은 복사가 필요하고 많이 쓰인다. (함수의 매개변수로 클래스나 배열을 넘겨줄 경우.)
call by reference 와 비슷하다고 보면 된다.
하지만 때에 따라서 깊은 복사가 필요한 경우가 있다.
class Dog{
public:
string name;
int age;
Dog(const Dog& rhs){
name = rhs.name;
age = rhs.age;
}
}
void main(){
Dog dog = Dog();
(1)Dog TwinsDog = Dog(dog);
(2)Dog TwinsDog = dog;
}
예를 들어 강아지가 한마리 있는데 쌍둥이라 가정해보자.
쌍둥이는 서로 완전히 같지만, 서로 다른 객체이다.
이럴 때는 깊은 복사가 필요하다. 객체의 값은 같지만 서로 다른 객체로 존재해야 하기 때문이다.
객체 복사를 위해 c++에서는 복사 생성자를 제공해준다. 복사생성자에서 하는 역할은 위와 같다.
(1)번과 (2)번은 완전히 같은 표현식이다.
메모리 번지수
|
변수명
|
값
|
100
|
Dog 인스턴스
|
String name
Int age
|
200
|
dog
|
100(주소값)
|
300
|
Dog 인스턴스
|
String name
Int age
|
400
|
TwinsDog
|
300(주소값)
|
'게임개발 수업' 카테고리의 다른 글
vector push_back 과 emplace_back의 차이 (0) | 2022.12.01 |
---|---|
팩토리 패턴 (0) | 2022.11.29 |
가상함수 (0) | 2022.11.25 |
클래스 생성자와 소멸자 (0) | 2022.11.24 |
static 키워드 (0) | 2022.11.23 |