본문 바로가기

게임개발 수업

객체 복사

프로그래밍을 하면서 알게 모르게 객체 복사를 많이 사용한다.

 

class Dog{
public:
    string name;
    int age;
}

void main(){
    Dog dog = Dog();
    Dog dog2 = dog;
    Dog dog3;
    dog3 = dog;
}

main에서의 대입은 우리가 흔하게 사용하는 코드이다.

dog2에 dog을 넣고, dog3에 dog을 넣는 것 모두 복사에 해당한다.

 

무엇을 복사하느냐?

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