얕은 복사, 깊은 복사
Last updated
Last updated
알고 있으면 좋은 내용: C언어 - 포인터
가변 객체(mutable): 값을 수정할 수 있는 객체
불변 객체(immutable): 값을 수정할 수 없는 객체
객체 종류
데이터 타입
가변 객체
list, dict, set, deque, defaultdict, ....
불변 객체
bool, int, float, str, tuple, unicode, namedtuple, frozenset, ...
불변 객체는 값을 수정할 수 없어서 밑 내용과는 전혀 상관이 없습니다. 하지만 가변 객체의 경우에는 복사를 할 때 얕은 복사와 깊은 복사로 나뉘기 때문에 재귀 함수 문제를 풀기 전에 꼭 알아야 하는 내용입니다.
왜 이 내용이 필요한 것인지 자세한 내용은 9주차 재귀 함수 2에서 설명하겠습니다.
코딩에서 복사하는 방법은 두 가지로 나뉩니다. 하나는 메모리 주소 값을 복사하는 얕은 복사와 메모리 주소를 새로 할당 받아 객체가 가지고 있는 값을 복사하는 깊은 복사 방법입니다. 그중에서도 얕은 복사는 메모리 주소 값을 복사하는 방법입니다.
쉽게 설명해보자면 위와 같이 웃는 그림이 있는 사진을 얼굴이라는 변수명으로 설정했다고 가정해봅시다. 그런데 이 웃는 그림을 풍선이라고 부르는 사람이 있습니다.
그러면 얼굴이나 풍선이나 서로 같은 주소 값을 가리키고 있는 변수명입니다. 그리고 이제 풍선이라고 부르고 있는 웃는 그림을 노랗게 칠했다고 해봅시다.
얼굴이나 풍선이나 서로 같은 주소 값을 가지고 있기 때문에, 풍선이 가지고 있는 웃는 그림을 노랗게 칠하면 얼굴이 가지고 있는 웃는 그림도 노랗게 칠해질 것입니다.
이렇게 메모리 주소 값을 복사하는 방법을 얕은 복사(shallow copy)라고 부릅니다.
얕은 복사의 경우에는 단순히 변수명1 = 객체, 변수명2 = 변수명1 이라고 설정하면 됩니다.
우리가 보통 복사한다고 말할 때 쓰이는 뜻입니다. 객체를 복사할 때, 객체의 메모리 주소 값이 아니고, 새로운 주소 값을 만들고 객체가 가지고 있는 값을 그대로 새로운 메모리에 복사하여 가지고 오는 것이 깊은 복사입니다.
웃는 그림을 예시로 똑같이 들어본다면
같은 메모리 주소 값을 가지는 것이 아니기 때문에 얼굴이 가지고 있는 웃는 그림과 풍선이 가지고 있는 웃는 그림은 서로 다른 그림입니다. 여기서 풍선을 노랗게 칠해도 얼굴이 가지고 있는 그림에는 영향을 주지 않습니다.
파이썬에서 깊은 복사는 copy()라는 메소드를 사용합니다.
코드 출력물을 확인해보면 얕은 복사와는 다르다는 것을 알 수 있습니다.
파이썬에서는 id()함수를 이용하여 객체의 고유 값을 확인할 수 있습니다. 여기서 얕은 복사는 메모리 주소 값을 복사하는 것이니 같은 값을 가지고 있을 것이고, 깊은 복사면 다른 메모리에 값을 복사하여 가지고 오는 것이므로 서로 다른 값을 가지고 있다는 것을 확인할 수 있습니다.
참고로 is, not is라는 연산자도 있습니다. 서로 같은 객체인지 확인하는 방법입니다.