본문 바로가기
Java/JAVA에 대하여

JAVA의 깊은 복사, 얕은 복사

by lms0806 2021. 12. 30.
728x90
반응형

#얕은 복사

1번을 2번에 복사할 경우 1번이 수정이 일어나거나 2번이 수정이 발생하면 둘다 수정이 된다.

얕은 복사는 주소값을 복사하기 때문에 주소로 값을 참조하여 값이 변경되면 해당 값을 참조하고 있는 배열들의 값이 변경된다.

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

를 한 후

System.out.println(Arrays.toString(a));
System.out.print(Arrays.toString(b));

를 할경우

[2, 2, 3]

[2, 2, 3]

을 출력하게 된다.

 

#깊은 복사

1번을 2번에 복사할 경우 1번이 수정이 일어나거나 2번이 수정이 발생해도 값은 수정이 발생한 곳만 변경된다.

주소값을 참조하는 것이 아닌, 새로운 메모리 공간에 값을 복사하는 것이기 때문에 전혀 상관없다.

int[] a = {1, 2, 3};
int[] b = a.clone();
b[0] = 2;

를 한 후

System.out.print(Arrays.toString(a));
System.out.print(Arrays.toString(b));

를 한 경우

[1, 2, 3]

[2, 2, 3]

이 출력이 된다.

 

여기서 2차원배열의 경우 특이한 방법으로 복사를 해야지만 이루어진다.

기존 1차원 배열의 깊은 복사 방식

int[][] a = {{1, 2, 3}, {1, 2, 3}};
int[][] b = {{},{}};
		
for(int i = 0; i < a.length; i++) {
	b[i] = a[i].clone();
}

이런 방식으로 복사를 진행하거나

for(int i = 0; i < a.length; i++) {
	System.arraycopy(a, 0, b, 0, a[i].length);
}

이런 식으로 복사를 진행하면 된다.

System.arraycopy(복사하고자 하는 배열, 시작값, 복사받고자 하는 배열, 시작값, 크기);

728x90
반응형

'Java > JAVA에 대하여' 카테고리의 다른 글

LinkedHashSet에 대하여  (0) 2023.11.01
HashSet 내부  (2) 2022.09.24
JVM이란  (0) 2021.12.25
JAVA 관련 deep한 내용들이 나와있는 사이트 정리  (0) 2021.12.24
[JAVA] Arrays.fill()  (0) 2021.10.29

댓글