-
[Java] 얕은 복사와 깊은 복사Java 2021. 11. 15. 11:56728x90
얕은 복사(shallow copy)
한쪽에서 수정이 발생되면 다른쪽에도 영향을 끼쳐 같아지게 된다.
주소값을 복사하기 때문에 주소로 값을 참조하여 값이 변경되면 해당 값을 참조하고 있는 변수의 값이 모두 변경된다.
= 연산자는 얕은 복사를 수행한다.
아래는 코드 예시이다.
int[] a= new int[]2; a[0] = 2; a[1] = 4; int[] b = a; b[0] = 6; b[1] = 8; System.out.println(a[0] + " " + a[1]); System.out.println(b[0] + " " + b[1]); System.out.println(a); System.out.println(b); //결과 6,8 6,8 [I@36baf30c //a의 주소 [I@36baf30c //b의 주소
위의 코드처럼 =연산자를 사용하여 얕은 복사를 진행하게 되면 복사된 배열의 값이 변경될 때, 원본 배열의 값도 변경된다. (a와 b를 출력해보면 둘다 a의 주소를 참조하고 있기 때문입니다.)
이를 해결하기 위해서는 깊은 복사를 사용해야 한다.
깊은 복사(Deep copy)
깊은 복사는 주소값을 참조하는 것이 아닌, 새로운 메모리 공간에 값을 복사하는 것이기 때문에 원본 배열이 변경되어도 복사된 배열에 전혀 상관이 없다.
int[] a= new int[2]; a[0] = 2; a[1] = 4; System.out.println(a[0] + " " + a[1]); System.out.println(a); int[] b = a.clone(); System.out.println(b[0] + " " + b[1]); System.out.println(b) b[0] = 6; b[1] = 8; System.out.println(a[0] + " " + a[1]); System.out.println(b[0] + " " + b[1]); //결과 2,4 //a0, a1 [I@36baf30c // a의 주소 2,4 //b0, b1 [I@7a81197d // b의 주소 2,4 //a0, a1 6,8 //b0, b1
clone 메소드를 사용하게 되면 a와 b가 참조하는 주소값이 다른것을 확인할 수 있습니다.
출처
https://woovictory.github.io/2020/04/22/Java-Array-Copy/
'Java' 카테고리의 다른 글
[Java] 빌드란?(+빌드 도구) (0) 2021.11.30 [Java]객체 지향 프로그래밍(Object Oriented Programming) (0) 2021.11.25 [Java] Code Convention(코드 컨벤션) (0) 2021.11.10 [Java] StringTokenzier 와 split 의 차이 (0) 2021.11.10 [Java ] String, Stringbuffer, Stringbuilder의 차이 및 장단점(+속도 비교) (0) 2021.11.09