Java에서 System.arraycopy() 사용법

 

전체 데이터가 있을 때, 그 특정 부분만 빼오고 싶을 때가 있습니다.

 

데이터를 하나씩 읽어가다가 내가 찾는 번지가 나올 때부터 값을 저장하게 하고, 일정 갯수나 위치 만큼 까지만 읽어오게 한다면... 할 수 있지만, 상당히 귀찮은 일입니다.

 

이런 경우에 쉽게 사용할 수 있는게 System.arraycopy입니다.

배열에서 원하는 부분만 복사한다는 의미로 생각하면 됩니다.

 

 

1. System.arraycopy()

 

Java 코드를 주로 이클립스에서 작성을 하는데,  System.arraycopy() 라고 입력을 합니다.

 

System.arraycopy(arg0, arg1, arg2, arg3, arg4);

 

예전에는 자세히 뜬거 같은데, 요즘엔 arg 라는 값만 떠서 헷갈리게 합니다.

이런 경우에는, arraycopy 부분에 마우스를 클릭하면 F2를 누르면 자세한 설명이 나옵니다.

 

 

 

2. System.arraycopy() 요소

 

Object src : 복사하고자 하는 소스입니다. 원본이라고 생각하면 됩니다.

 

int srcPos : 위의 소스에서 어느 부분부터 읽어올지 위치를 정해줍니다.

 

Object dest : 원본이 있다면 복사본이 있어야겠지요. 복사하려는 대상입니다.

 

int destPos : 위의 dest에서 자료를 받을 때, 어느 부분부터 쓸지 시작 위치를 정해줍니다.

 

int length : 원본에서 복사본까지 얼마큼 읽어 올지 입력하는 것 입니다.

 

간단하게 앞의 2개는 src(원본)에 관한 것이고, 그 뒤에 2개는 dest(복사본), 마지막으로 length는 가져올 길이라고 생각하면 됩니다.

 

 

3. System.arraycopy() 예제 1

 

사용법에 대해서 설명을 들었으니, 간단하게 예제를 들어보도록 하겠습니다.

 

원본 배열 이름은 src 라고 하고 복사본은 dest 라고 하겠습니다.

 

원본 배열은 아래와 같이 00 ~ 0F 까지 차례대로 데이터를 넣었습니다.

복사된 내용을 넣을 배열은 4 바이트 만큼 잡았습니다.

 

byte[] src = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 ... 0x0F }
byte[] dest = new byte[4];

 

이제 System.arraycopy를 사용할 차례입니다.

 

위에서 배운대로 먼저 배열을 넣어줍니다.

 

System.arraycopy(src, ?, dest, ?, ?);

 

그 다음엔 원본에 첫 번째 있는 데이터를 복사본 길이 만큼 넣어주려고 합니다.

src 다음에 0이라고 입력하여, 원본의 첫 데이터부터 복사한다고 정해줍니다.

그 다음 복사된 데이터를 dest의 첫 번째 자리부터 넣을거라고 0이라고 입력을 합니다.

 

System.arraycopy(src, 0, dest, 0, ?);

 

그 다음 dest 의 길이인 4 만큼 넣을 것이므로 제일 마지막엔 4 라고 입력을 해줍니다.

 

System.arraycopy(src, 0, dest, 0, 4);

 

System.arraycopy를 실행 후에, dest 의 값을 출력하도록 합니다.

아래와 같이 원본의 처음 데이터부터 4번째까지 데이터가 들어왔습니다.

 

dest 값
0x00, 0x01, 0x02, 0x03

 

 

3. System.arraycopy() 예제 2

 

이번에는 원본에서 처음이 아닌 특정 위치 데이터를 복사본의 특정 위치에 복사를 해보도록 하겠습니다.

 

byte[] src = { 0x01, 0x02, 0x03, 0x04, 0x05 ... 0x0F }
byte[] dest = new byte[8];

 

먼저 dest를 출력을 해봅니다.

선언 후에 데이터가 없기 때문에 0으로 출력이 됩니다.

 

dest 값
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

 

원본에 있는 데이터를 0x03부터 0x06 까지만 복사하고 싶습니다.

0x03 의 위치인 2를 입력합니다.

 

그 다음 0x03~0x06 는 갯수가 4개 이므로 4을 입력합니다.

 

System.arraycopy(src, 2, dest, ?, 4);

 

이번에는 dest 기준으로 0 이라고 입력하면 처음부터 복사한 데이터를 저장할 것입니다.
이번엔 4번째부터 넣을 예정이니 3이라고 입력을 합니다.

 

System.arraycopy(src, 2, dest, 3, 4);

 

System.arraycopy를 수행한 후에 dest 값을 출력해봅니다.

아래와 같이 원하는 위치에 들어가면 문제 없이 출력이 된 것입니다.

 

dest 값
0x00, 0x00, 0x00, 0x03, 0x04, 0x05, 0x06, 0x00

 

 

~(^_ ^ )~

 

입력해야 되는게 5개라서 헷갈릴 수 있지만, 몇 번 사용하다보면 쉽게 느껴질 것입니다.