Backend/Java

[Java] Array(배열)_3 (배열 복사)

Deeb 2021. 9. 3. 11:15

✍hallow copy(얕은 복사)

- 참조하는 배열의 시작 주소만을 복사하는 것이다. 

ex) 바로가기

두 변수가 하나의 배열을 공유한다.

-> 객체의 매개변수, 반환형 전달 시 사용

int[] arr = {1, 2, 3, 4, 5};
int[] copyArr = arr;
// 얕은 복사 진행 

 

Deep copy(깊은복사) 

: 완전 다른 파일이기 때문에 원본에 영향을 주지 않는다. 

- 같은 값을 가진 서로다른 배열이 생긴다.

- 원본 배열과 동일한 자료형, 동일하거나 더 큰 크기, 동일한 데이터를 가지는 새로운 배열을 만드는 것이다.

- 원본 데이터 유지, 원본과 똑같은 배열이 필요할 때 

 

 

ex) ctrl c-> ctrl v

 

종류   예시
얕은 복사   윈도우 바로가기
깊은 복사   원본의 복사본

 

📝얕은 복사 예제

ArrayService2 // public void example1() 

int[] arr = {1, 2, 3, 4, 5};
// 얕은 복사 진행
int[] copyArr = arr;
//arr, copyArr은 동일한 주소에 있는 int[]을 참조
System.out.println("변경 전"); System.out.println(Arrays.toString(arr)); System.out.println(Arrays.toString(copyArr));
//복사가 되었는지 확인

//복사한 배열의 0번째 요소를 변경
copyArr[0] = 999;
System.out.println("변경 전");
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(copyArr));
//얕은 복사 -> arr, copyArr은 같은 배열을 참조
// -> arr,copyArr 둘 다 0번 인덱스 값이 변경됨

 

📝깊은복사 예제

ArrayService2 // public void example2() 

int[] arr = {1, 2, 3, 4, 5};
// 깊은 복사 진행
// 1) 복사를 위한 새로운 배열 선언 및 할당
int[] copyArr = new int[arr.length];
//원본 배열크기만큼을 만들기 위해 arr배열의 크기인 arr.length
//원본 배열과 같은 크기의 새로운 배열 할당

// 2) 원본 배열의 내용을 복사용 배열에 초기화 하기
// 2-1) for문을 이용한 깊은 복사
for(int i = 0; i<arr.length; i++) {
//i가 0일때 대입연산 오른쪽의 값이 왼쪽에 들어가니 c
opyArr[i] = arr[i]; // arr0번의 값이 copyArr0번으로 들어간다.
}
System.out.println("변경 전");
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(copyArr));
//복사가 되었는지 확인

//복사한 배열의 0번째 요소를 변경
copyArr[0] = 999;
System.out.println("변경 전");
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(copyArr));

2-2)

int[] arr = {1, 2, 3, 4, 5};
int[] copyArr = new int[arr.length];


2-2)//System.arraycopy(원본배열, 원본 복사 시작 인덱스, 복사배열, 복사 배열의 삽입 시작 인덱스, 복사길이);
// 값이 5개가 들어간다

System.arraycopy(arr, 0, copyArr, 0, arr.length);
// 원본 배열 arr에서 0번째 인덱스부터 5개의 데이터 (arr.length)를
// 복사배열 copyArr의 0번 인덱스부터 차례대로 삽입하겠다.

System.out.println("변경 전");
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(copyArr));
//복사가 되었는지 확인

//복사한 배열의 0번째 요소를 변경
copyArr[0] = 999;
System.out.println("변경 전");
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(copyArr));

결과 화면)

 

1,2 번을 자주쓰고

3번은 잘 안쓰고

4번은 데인져러스

 

clone : 복제

잘못 쓰게 되면 무한히 복제되어서 컴퓨터에 문제가되기때문에 권장하지 않다. 

effective java에서 나오는 말이다. 

 

반응형