java arraycopy 메소드는 배열을 복사하는 메소드입니다. 저번 글에서 설명했던 Arrays.copyOf와 비슷하지 않냐고 물어보실 수 있는데요. 아래와 같은 점이 다릅니다.
- copyOf 메소드는 특수 케이스에서만 동작
- arrayCopy는 모든 케이스에서 동작
그러면, 이번 시간에는 System의 arrayCopy에 대해 알아보겠습니다.
배열 복사
배열을 복사하는 연산을 생각해 봅시다. 어떤 것이 중요할까요?
![](https://codingdog.pe.kr/wp-content/uploads/2024/02/arr_cp6.png)
먼저 복사를 하는 원본 배열과 어디서부터 복사할 것인지가 중요합니다. 예를 들어, ori 배열에서 1번째 원소부터 복사한다고 해 보겠습니다. 그러면, 회색으로 표시한 2부터 복사가 될 겁니다.
![](https://codingdog.pe.kr/wp-content/uploads/2024/02/arr_cp7.png)
그 다음은? 몇 개나 복사할 것인지도 중요합니다. 3개? 4개? 혹은 그 이상? 예를 들어, 5개를 복사하는 경우, 회색 + 노란색으로 표시된 부분이 복사받을 배열에 복사됩니다. 여기까지, 원본 배열과 어디서 부터 복사될 것인지, 그리고 몇 개만큼 복사될 것인지에 대한 정보를 알고 있어요.
그런데, 복사 받을 배열에서 어디서부터 복사 받을 것인지가 안 나와 있습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2024/02/arr_cp8.png)
dest는 복사받을 배열입니다. 2번째부터 복사받습니다. 이렇게 되면 어떻게 되는가?
- ori 배열의 1번째 위치부터 5개의 원소를 복사할 건데요.
- dest의 2번째 위치부터 복사할 거에요.
이렇게 되는 것입니다. 복사 후에는 어떻게 될까요?
![](https://codingdog.pe.kr/wp-content/uploads/2024/02/arr_cp9.png)
ori[1]부터 ori[5]까지 원소가 dest[2]부터 dest[6]까지 복사됩니다. 여기까지 정리해 볼게요. 저는 배열 복사를 하기 위해 어떤 정보를 넘겨 주었나요?
- 원본 배열
- 몇 번째 원소부터 복사를 할 건지
- 복사 받을 배열
- 어느 위치부터 복사를 받을 건지
- 복사할 원소의 개수
이렇게 5개의 인자를 넘겨 주었어요. Arrays.copyOf는 0번째 원소부터 복사를 하고, 0번째 위치부터 복사를 받았어요. 이건 배열 복사의 특수한 케이스만 커버하는 것입니다. java arrayCopy 메소드는 그렇지 않아요. 이 점을 기억해 두세요.
이제 함수 설명을 봅시다.
![](https://codingdog.pe.kr/wp-content/uploads/2024/02/arr_cp1.png)
1번째 인자로 src를 받고, 2번째 인자로 srcPos를 받아요. 각각 원본 배열과 몇 번째 원소부터 복사를 할 것인지를 나타내요. 다음에 3번째 인자와 4번째 인자로 dest와 destPost를 받아요. 복사 받을 배열과, 어느 위치부터 복사를 받을 것인지를 나타내요. 5번째 length는 복사할 원소의 개수를 의미해요.
이 메서드는 배열의 범위가 넘어가는 것은 검사하지 않습니다. 이 부분은 조심하셔야 합니다.
java arraycopy 몇 가지 예제 보기
그러면, 예제를 몇 개 보도록 하겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2024/02/arr_cp2.png)
먼저, 예제 1번입니다. ori의 0번째 원소부터 복사를 해요. 그리고 dest의 0번째 위치부터 복사를 받습니다. 몇 개나 복사하나요? 5개요. 그러면 아래와 같이 그려집니다.
![](https://codingdog.pe.kr/wp-content/uploads/2024/02/arr_cp10.png)
복사를 시작한 위치가 0번째 입니다. 5개나 복사했으니까, 1부터 5까지 copy한 셈이지요. dest의 어디서부터 복사 받았나요? 0번째 부터요. 그러므로, 위 그림과 같이 상황이 그려집니다. 결과를 보도록 하겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2024/02/arr_cp3.png)
dest 배열에는 1, 2, 3, 4, 5, 0, 0, 0, 0, 0 순서대로 들어있음을 확인하였습니다. 다음 2번째 예제를 보도록 하겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2024/02/arr_cp4.png)
8번째 줄을 보겠습니다. 2번째 인자가 4, 4번쨰 인자가 2입니다. 이 말은 어떤 의미인가? 아래와 같습니다.
- 원본 배열 ori의 4번째 원소부터 복사합니다.
- dest의 2번째 위치부터 복사 데이터를 받습니다.
- 복사 데이터 개수는 5개입니다.
이 상황을 그림으로 그려보겠습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2024/02/arr_cp11.png)
이 상황과 같은가요? 즉, ori[4]부터 ori[8]까지, 5 ~ 9까지의 데이터가 dest[2]부터 dest[6]까지 복사되게 됩니다. 실행 결과는 아래와 같습니다.
![](https://codingdog.pe.kr/wp-content/uploads/2024/02/arr_cp5.png)
복사 후에, dest에는 0, 0, 5, 6, 7, 8, 9, 0, 0, 0 순서대로 저장되어 있습니다.