배열을 복사하는 방법 (얕은 복사 / 깊은 복사)
- 얕은 복사(Shallow Copy)
- 복사한 배열이 원래 배열의 '주솟값'을 가져옵니다.
- 복사한 배열이나 원본배열이 변경될 때 서로 간의 값이 같이 변경됩니다. - 깊은 복사(Deep Copy)
- 복사한 배열이 원래 배열을 '값'을 가져옵니다.
- 복사한 배열이나 원본배열이 변경될 때 서로 간의 값은 바뀌지 않습니다.
얕은 복사
아래와 같은 arr 배열이 있습니다.
해당 배열을 복사하여 arrNew를 만들어 보려고 합니다.
int[] arr = {0, 1, 2, 3, 4};
간단하게 아래와 같이 생각할 수 있습니다.
int[] arr = {0, 1, 2, 3, 4};
int[] arrNew = arr;
그러나 위와 같이 배열을 복사할 경우
복사한 배열(arrNew) 의 값을 변경하면, 원본 배열(arr)의 값이 변경됩니다. 그 반대도 마찬가지입니다.
int[] arr = {0, 1, 2, 3, 4};
int[] arrNew = arr;
arrNew[0] = 10; //복사한 배열값 변경
System.out.println(Arrays.toString(arr)); // [10, 1, 2, 3, 4]
System.out.println(Arrays.toString(arrNew)); // [10, 1, 2, 3, 4]
arr[4] = 40; //원본 배열값 변경
System.out.println(Arrays.toString(arr)); // [10, 1, 2, 3, 40]
System.out.println(Arrays.toString(arrNew)); // [10, 1, 2, 3, 40]
이러한 경우를 '얕은 복사' 라고 합니다.
그러면 배열을 깊은 복사하는 방법에 대해 알아보겠습니다.
깊은 복사
Object.clone()
객체를 복제하여 새로운 인스턴스를 생성하는 기능을 하며, 가장 보편적인 방법입니다.
int[] arr = {0, 1, 2, 3, 4};
int[] arrNew = arr.clone();
arr[0] = 10; //원본 배열값 변경
System.out.println(Arrays.toString(arr)); // [10, 1, 2, 3, 4]
System.out.println(Arrays.toString(arrNew)); // [0, 1, 2, 3, 4]
Arrays.copyOf(원본배열, 원본 배열에서 복사해올 길이)
원본배열의 시작점부터 원하는 길이만큼 배열을 복사할 수 있습니다.
int[] arr = {0, 1, 2, 3, 4, 6, 7, 8, 9, 10};
int[] arrNew = Arrays.copyOf(arr, 5);
arr[0] = 10; //배열값 변경
System.out.println(Arrays.toString(arr)); // [10, 1, 2, 3, 4, 6, 7, 8, 9, 10]
System.out.println(Arrays.toString(arrNew)); // [0, 1, 2, 3, 4]
System.arraycopy(src, srcPos, dest, destPos, length)
- Object src : 복사할 객체. 원본 배열
- int srcPos : 원본의 시작 index
- Object dest : 복사된 배열
- int destPos : 원본 데이터를 쓸 복사본의 시작 index
- int length : 원본에서 복사할 데이터의 길이
예제. arr의 3번째 index부터 4개를 arrNew의 2번째 index에 붙여넣기
int[] arr = {0, 1, 2, 3, 4, 6, 7, 8, 9, 10};
int[] arrNew = new int[arr.length];
System.arraycopy(arr, 3, arrNew, 2, 4);
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4, 6, 7, 8, 9, 10]
System.out.println(Arrays.toString(arrNew)); // [0, 0, 3, 4, 6, 7, 0, 0, 0, 0]
참고 문헌
[Java] 배열 복사 Arrays.copyOf() vs System.arraycopy()
📌 Arrays.copyOf() Arrays.copyOf(원본배열, 복사할길이); Arrays.copyOfRange(A, form_index, to_index) int[] A : 복사할 배열 int from_index : 복사할 배열의 시작 index int to_index : 복사할 배열의 끝 index 복사할 끝 index 값
terry9611.tistory.com
[Java] 자바 배열을 복사하는 다양한 방법 (깊은복사, 얕은복사)
자바에서 객체를 복사하는 유형으로 깊은 복사와 얕은 복사가 있습니다. 깊은 복사의 경우 객체의 실제값을 새로운 객체로 복사하는 것이고 얕은 복사는 단순히 객체의 주소 값만을 복사하는
coding-factory.tistory.com
[Java] 얕은 복사와 깊은 복사
배열의 복사와 관련해서는 얕은 복사와 깊은 복사의 차이점을 알아야 한다.
woovictory.github.io
'Back end > Java' 카테고리의 다른 글
[Java] Stream의 filter() 메소드 (ft.collect()) (0) | 2024.02.29 |
---|---|
[Java] for-loop를 Stream forEach로 변경하기 (0) | 2024.02.28 |
[Java] 배열을 문자열로 만드는 메서드 join (예제 포함) (0) | 2023.09.13 |
[Java] 문자열 반복 메서드 repeat (예제 포함) (0) | 2023.09.12 |
[JAVA] int, String배열의 오름차순, 내림차순 정렬 개념 및 예제(Arrays.sort(), Collections.reverseOrder()) (0) | 2022.03.31 |