Home » 레퍼런스 » JAVA » java arraycopy 메소드와 사용법을 알아봅시다.

java arraycopy 메소드와 사용법을 알아봅시다.

java arraycopy 메소드는 배열을 복사하는 메소드입니다. 저번 에서 설명했던 Arrays.copyOf와 비슷하지 않냐고 물어보실 수 있는데요. 아래와 같은 점이 다릅니다.

  • copyOf 메소드는 특수 케이스에서만 동작
  • arrayCopy는 모든 케이스에서 동작

그러면, 이번 시간에는 System의 arrayCopy에 대해 알아보겠습니다.


배열 복사

배열을 복사하는 연산을 생각해 봅시다. 어떤 것이 중요할까요?

먼저 복사를 하는 원본 배열과 어디서부터 복사할 것인지가 중요합니다. 예를 들어, ori 배열에서 1번째 원소부터 복사한다고 해 보겠습니다. 그러면, 회색으로 표시한 2부터 복사가 될 겁니다.

그 다음은? 몇 개나 복사할 것인지도 중요합니다. 3개? 4개? 혹은 그 이상? 예를 들어, 5개를 복사하는 경우, 회색 + 노란색으로 표시된 부분이 복사받을 배열에 복사됩니다. 여기까지, 원본 배열과 어디서 부터 복사될 것인지, 그리고 몇 개만큼 복사될 것인지에 대한 정보를 알고 있어요.

그런데, 복사 받을 배열에서 어디서부터 복사 받을 것인지가 안 나와 있습니다.

dest는 복사받을 배열입니다. 2번째부터 복사받습니다. 이렇게 되면 어떻게 되는가?

  • ori 배열의 1번째 위치부터 5개의 원소를 복사할 건데요.
  • dest의 2번째 위치부터 복사할 거에요.

이렇게 되는 것입니다. 복사 후에는 어떻게 될까요?

ori[1]부터 ori[5]까지 원소가 dest[2]부터 dest[6]까지 복사됩니다. 여기까지 정리해 볼게요. 저는 배열 복사를 하기 위해 어떤 정보를 넘겨 주었나요?

  • 원본 배열
  • 몇 번째 원소부터 복사를 할 건지
  • 복사 받을 배열
  • 어느 위치부터 복사를 받을 건지
  • 복사할 원소의 개수

이렇게 5개의 인자를 넘겨 주었어요. Arrays.copyOf는 0번째 원소부터 복사를 하고, 0번째 위치부터 복사를 받았어요. 이건 배열 복사의 특수한 케이스만 커버하는 것입니다. java arrayCopy 메소드는 그렇지 않아요. 이 점을 기억해 두세요.

이제 함수 설명을 봅시다.

[그림 1] arrayCopy 함수

1번째 인자로 src를 받고, 2번째 인자로 srcPos를 받아요. 각각 원본 배열과 몇 번째 원소부터 복사를 할 것인지를 나타내요. 다음에 3번째 인자와 4번째 인자로 dest와 destPost를 받아요. 복사 받을 배열과, 어느 위치부터 복사를 받을 것인지를 나타내요. 5번째 length는 복사할 원소의 개수를 의미해요.

이 메서드는 배열의 범위가 넘어가는 것은 검사하지 않습니다. 이 부분은 조심하셔야 합니다.


java arraycopy 몇 가지 예제 보기

그러면, 예제를 몇 개 보도록 하겠습니다.

[그림 2] 예제 1번 프로그램

먼저, 예제 1번입니다. ori의 0번째 원소부터 복사를 해요. 그리고 dest의 0번째 위치부터 복사를 받습니다. 몇 개나 복사하나요? 5개요. 그러면 아래와 같이 그려집니다.

복사를 시작한 위치가 0번째 입니다. 5개나 복사했으니까, 1부터 5까지 copy한 셈이지요. dest의 어디서부터 복사 받았나요? 0번째 부터요. 그러므로, 위 그림과 같이 상황이 그려집니다. 결과를 보도록 하겠습니다.

[그림 3] 예제 1의 결과

dest 배열에는 1, 2, 3, 4, 5, 0, 0, 0, 0, 0 순서대로 들어있음을 확인하였습니다. 다음 2번째 예제를 보도록 하겠습니다.

[그림 4] 예제 2번 프로그램

8번째 줄을 보겠습니다. 2번째 인자가 4, 4번쨰 인자가 2입니다. 이 말은 어떤 의미인가? 아래와 같습니다.

  • 원본 배열 ori의 4번째 원소부터 복사합니다.
  • dest의 2번째 위치부터 복사 데이터를 받습니다.
  • 복사 데이터 개수는 5개입니다.

이 상황을 그림으로 그려보겠습니다.

이 상황과 같은가요? 즉, ori[4]부터 ori[8]까지, 5 ~ 9까지의 데이터가 dest[2]부터 dest[6]까지 복사되게 됩니다. 실행 결과는 아래와 같습니다.

[그림 5] 예제 2의 실행 결과

복사 후에, dest에는 0, 0, 5, 6, 7, 8, 9, 0, 0, 0 순서대로 저장되어 있습니다.

Leave a Comment

17 + 3 =