본문 바로가기

취업/준비

깊은 복사 VS 얕은 복사 (Deep Copy VS Shallow Copy)

(아주 간단하게 설명됨 주의)

출처 : https://zetawiki.com/wiki/%EC%96%95%EC%9D%80_%EB%B3%B5%EC%82%AC,_%EA%B9%8A%EC%9D%80_%EB%B3%B5%EC%82%AC

얕은 복사 Shallow Copy

  • 변수 혹은 객체의 주소값(참조값)을 복사하는 것
  • 메모리 상의 같은 곳을 가리키는 참조 변수가 하나 더 생기게 됨
  • C, C++에서 포인터 사용 시 얕은 복사가 이루어짐
int a = 3;
int* p = &a; // Shallow Copy
a = 5;
printf("%d", *p); // 출력 : 5

물론 엄밀히 말하면 포인터는 Shallow Copy의 영역이 아니긴 하고(명시적으로 주소값을 복사하는 것이기 때문에)오히려 Shallow Copy를 이해하는데 도움이 되는 친구라서, JAVA 코드를 하나 더 준비했다.

int[] arr = { 1, 2, 3 };
int[] arr2 = arr;
		
for(int i = 0 ; i < 3 ; i++)
	arr[i] += arr[i];
		
for(int i = 0 ; i < 3 ; i++)
	System.out.printf("%d ", arr2[i]); // 출력 : 2 4 6

자바에서 배열이나 인스턴스의 복사는 일반적으로 얕은 복사로 이루어지기 때문에 위와 같은 상황을 주의해야 한다.

 

깊은 복사 Deep Copy

  • 변수 혹은 객체의 내용을 복사하는 것
  • 메모리 상에 같은 내용을 가진 변수/객체가 별도로 존재하게 됨
int a = 3;
int b = a; // Deep Copy 
a = 5;
printf("%d", b); // 출력 : 3

메모리 상에 b라는 변수를 저장할 공간을 별도로 만들고 a의 값을 깊은 복사해서 저장한다.