개발 블로그
article thumbnail
Published 2023. 4. 4. 15:43
얕은 복사 vs 깊은 복사 Java

얕은 복사와 깊은 복사

이 개념은 '참조형 변수'를 복사할 때 알아야 하는 개념입니다.

참조형 변수는 변수에 실제 값을 저장하고 있는 것이 아니라 값이 저장된 메모리 공간의 주소를 저장하고 있습니다.

 

 

얕은 복사

참조형 변수를 복사할 때 '주소값'을 복사하는 것을 말합니다.

int[] a = {1, 2, 3};
int[] b = a;

이렇게 정수형 배열 a를 선언하고 b에 a를 복사해보겠습니다.

 

b[0] = 10;
for (int i : a) {
	System.out.print(i + " ");
}
System.out.println();
for (int j : b) {
	System.out.print(j + " ");
}

b[0] 를 10으로 변경하고 a와 b를 출력하면 결과가 어떻게 나올까요?

 

일반적으로 예상하기로는 a는 건드리지 않았으니 그대로 {1, 2, 3} 이 나올 것이고,

b는 건드렸으니 {10, 2, 3}이 나올 것입니다.

 

하지만 실제로 값을 출력해보면 결과는 예상과 다릅니다.

10 2 3
10 2 3

분명 우리는 b만 변경했는데 a도 변경된 상황입니다.

 

이런 현상이 발생하는 이유는 바로 a를 복사해서 b에 집어 넣을 때 얕은 복사를 통해서 '주소값'을 복사해왔기 때문입니다.

힙 메모리에 저장된 {1, 2, 3}의 주소가 b에 복사되어 같은 값을 참조

따라서 b를 통해 값을 변경하는 것은 곧 a가 참조하고 있는 값을 변경하는 것이기에 b만 건드려도 a 에도 그것이 반영되어 나오는 것입니다.

 

깊은 복사

참조형 변수를 복사할 때 '실제 값'을 복사하는 것을 말합니다. 얕은 복사를 통해서 복사를 하게 되면 우리가 원치 않았음에도 다른 변수가 참조하고 있는 값까지 변경해버릴 우려가 있습니다.

 

따라서 일반적으로 참조형 변수를 복사할 때는 깊은 복사를 활용합니다.

 

깊은 복사는 실제 값을 복사하는 방법으로, 값을 복사해서 또 다른 메모리 주소에 저장해놓고 이 주소를 변수가 참조하는 방식입니다.

이처럼 깊은 복사를 하게 되면 b를 건드려도 a에는 영향을 주지 않게끔 할 수 있습니다.

 

그럼 실제 코드를 통해서 깊은 복사를 해보겠습니다.

배열을 복사할 때는 Arrays 클래스의 copyof 메소드로 깊은 복사가 가능합니다.

int[] a = {1, 2, 3};
int[] b = Arrays.copyOf(a, a.length);

b[0] = 10;
for (int i : a) {
	System.out.print(i + " ");
}
System.out.println();
for (int j : b) {
	System.out.print(j + " ");
}

결과

1 2 3
10 2 3

 

'Java' 카테고리의 다른 글

접근제어자와 Getter & Setter  (0) 2023.04.06
클래스, 객체, 인스턴스  (0) 2023.04.06
instance of 연산자  (0) 2023.04.04
기본형, 참조형, Wrapper Class  (0) 2023.04.03
JDK & JRE & JVM의 개념  (0) 2023.04.03
profile

개발 블로그

@하얀.손

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!