[C] 깊은복사와 얕은복사 (deep copy, shallow copy)
C를 이용해 코드를 짜다보면 구조체를 활용할 때가 많이 있다.
우선 man이라는 구조체를 선언하고 이 구조체 변수에 값을 할당해보자.
위의 코드는 name이라는 문자열과 age라는 정수변수를 가지고 있는 man이라는 구조체를 만들고, alice와 bob이라는 man구조체에 값들을 할당한 코드이다. 위 코드를 실행해보면
할당한대로 잘 나오는 것을 확인할 수 있다.
그렇다면, 구조체를 복사하고싶을때는 어떻게 할까?
일단 등호(=)를 이용하여 구조체를 복사해주는 방법을 생각해볼 수 있다.
이렇게 실행을 해보면,
이렇게 원하는대로 복사가 된 것을 확인할 수 있다.
하지만, 여기서 한가지 문제가 발생하는데, 아래 코드를 보며 살펴보자
앞부분까지는 이전의 과정과 똑같지만, 이후에 alice 구조체의 name변수를 "alice2"로 바꾼것을 확인할 수 있다.
결과를 실행해보면,
원래 의도했던것과 다르게 bob구조체의 name 변수도 함께 바뀐것을 확인할 수 있다.
이는 구조체를 복사할 때 많이 하는 실수로, 구조체 내에 포인터 변수가 있을 때 발생한다.
구조체 내의 포인터 변수가 가리키는 값을 복사한 것이 아니라, 포인터 변수 그 자체(주소값)를 복사했기 때문에 발생하는 문제인 것이다.
이처럼 포인터의 주소만을 복사하는 것을 얕은복사(shallow copy)라고 한다. 실제 개발을 하다보면 많이 놓치는 부분이기 때문에 잘 알아두는 것이 좋다.
위의 코드와 같이 구조체 내의 모든 변수를 일일히 복사해주는 것을 깊은복사(Hard copy)라고 하는데, 깊은 복사를 하면 앞서 발생했던 문제를 해결할 수 있다.
해결완료!
오늘 배운 내용을 정리해보면,
1. 복사에는 깊은복사와 얕은복사가 있다.
2. 구조체를 사용하다보면, 알게모르게 얕은복사를 하게 되고, 이는 오류를 발생할 수 있다.
3. 깊은복사는 일일히 구조체 내의 모든 변수를 복사해주는 것이므로, 얕은복사로 인해 발생하는 오류를 막을 수 있다.
본 내용은 공부하며 정리한 것으로 오류가 있을 수 있습니다.