본문 바로가기

p-languages/java

java/ copyOf(), copyOfRange(), arraycopy() : 배열을 복사하는 메서드

 

 

Arrays 클래스는 배열과 관련된 여러 메서드들을 지원한다.

*java.util 패키지에 포함되어 있으므로 Arrays의 메서드들을 사용하기 위해서는 import가 필요하다.

 

import java.util.Arrays;

 

 

Arrays.copyOf()

Arrays.copyOf(원본 배열, 복사할 길이)

 

지정한 배열을 인덱스 0부터 원하는 길이만큼 복사한다. 원본 배열이 입력한 길이보다 클 경우 입력한 길이 이후의 인덱스는 제거되어 copy 되고, 원본 배열이 입력한 길이보다 작을 경우 원본 배열에서 존재하지 않는 인덱스 이후의 값은 배열의 타입 기본값으로 초기화되어 copy 된다.

 

 

e.g. 1

 

int[] intArr = new int[] {1, 2, 3, 4, 5};
int[] intArrCopy = Arrays.copyOf(intArr, 3);
for(int i : intArrCopy) System.out.println(i);

 

출력

1
2
3

 

 

e.g. 2

 

String[] strArr = new String[] {"copy", "of", "method"};
String[] strArrCopy = Arrays.copyOf(strArr, 5);
for(String s : strArrCopy) System.out.println(s);

 

 

출력

copy

of
method
null
null

 


 

Arrays.copyOfRange()

 

Arrays.copyOfRang(복사할 원본 배열, 복사를 시작할 인덱스, 복사를 끝낼 인덱스)

 

지정한 배열에서 특정 범위만큼의 요소들을 복사해 새로운 배열로 반환한다. 복사할 배열의 길이가 복사를 끝낼 인덱스로 입력한 길이보다 작을 경우 원본 배열의 마지막 인덱스 이후의 값은 배열의 타입 기본값으로 초기화되어 copy 된다.

(주의) 복사를 시작할 인덱스로 복사할 원본 배열의 길이보다 큰 값을 주면 exception이 발생해 처리되지 않는다.

 

 

e.g. 1

 

int[] intArr = new int[] {1, 2, 3, 4, 5};
int[] intArrCopy = Arrays.copyOfRange(intArr, 2, 4);
for(int i : intArrCopy) System.out.println(i);

 

출력

3
4

 

 

e.g. 2

 

String[] strArr = new String[] {"copy", "of", "range", "method"};
String[] strArrCopy = Arrays.copyOfRange(strArr, 3, 7);
for(String s : strArrCopy) System.out.println(s);

 

출력

method //index=3
null 
null
null //index=7

 


 

System.arraycopy()

 

System.arraycopy(source_arr, sourcePos, dest_arr, destPos, len)

  • source_arr : 복사할 배열
  • sourcePos : (복사할 배열에서) 복사를 시작할 인덱스 
  • dest_arr :  붙여넣기 할 배열
  • destPos : 붙여넣기를 시작할 인덱스
  • len : (복사할 배열에서) 얼마나 복사해 붙여넣을지 길이를 지정
  •  

sourcePos에서 sourcePos+len-1 만큼의 요소가 destPos에서 destPos+len-1으로 복사된다.

 

 

e.g. 1

 

int[] intArr1 = new int[] {1, 2, 3, 4, 5};
int[] intArr2 = new int[] {99, 98, 97, 96, 95};
        
System.arraycopy(intArr1, 1, intArr2, 2, 3);
for(int i : intArr2) System.out.println(i);

 

흐름

1. 배열 intArr1의 요소를 배열 intArr2로 복사한다.

2. intArr1의 인덱스=1부터 인덱스=(sourcePos+len-1)=3 만큼의 요소 {2, 3, 4}를 복사한다.

3. 복사한 요소를 배열 intArr2의 인덱스 2부터 붙여넣는다.

 

 

 

e.g.2 System.arraycopy() 메서드를 이용해 두 배열을 합치기

 

String[] strArr1 = new String[] {"example", "of"};
String[] strArr2 = new String[] {"system", "arraycopy", "method"};

String[] strArr3 = new String[strArr1.length + strArr2.length];

System.arraycopy(strArr1, 0, strArr3, 0, strArr1.length);
System.arraycopy(strArr2, 0, strArr3, strArr1.length, strArr2.length);

for(String s : strArr3) System.out.println(s);

 

출력

example
of
system
arraycopy
method

 

 

1. 먼저 strArr1과 strArr2를 합치기 위해, 두 배열 길이의 합만큼을 길이로 갖는 배열 strArr3를 선언한다.

2. strArr3에 먼저 strArr1의 인덱스 0부터 strArr1.length만큼을 strArr3의 인덱스 0부터 복사해 붙여는다.

3. 그 다음 strArr2의 인덱스 0부터 strArr2.length까지의 요소들을 strArr3의 strArr1.lengh(=2)에 해당하는 인덱스부터 붙어넣어 두 배열을 합쳤다.

 

 

자바에서 배열은 한번 생성되면 길이를 늘리거나 줄일 수 없기 때문에 먼저 두 배열을 합쳐 저장할 새 배열을 만들어 주는 것에 주의한다.

 

*System.arraycopy() 메서드는 Arrays에서 제공되는 메서드와 달리 System에 포함된 메서드로 따로 import가 필요하지 않다.

 

 

reference.

더보기