반응형
배열을 복사하는 방법 (얕은 복사 / 깊은 복사)
- 얕은 복사(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]
참고 문헌
반응형
'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 |