Java에서는 java.util 패키지의 Arrays 클래스가 제공하는 유틸리티 메서드를 활용하면 배열 전체 또는 원하는 구간만 손쉽게 복사할 수 있습니다. 대표적인 방법으로 copyOf()와 copyOfRange()가 있으며, 각각의 사용법과 예제를 살펴보겠습니다.
1. copyOf() 메서드 사용하기
copyOf() 메서드는 두 개의 매개변수를 받습니다.
- 복사할 원본 배열 (모든 타입 가능)
- 복사할 길이를 나타내는 정수 값
이 메서드는 지정한 배열의 시작 위치부터 주어진 길이만큼의 내용을 복사하여 새로운 배열로 반환합니다. 만약 지정한 길이가 원본 배열보다 크면 나머지 부분은 기본값(null, 0 등)으로 채워집니다.
예제 코드
import java.util.Arrays;
public class CopyingSectionOfArray {
public static void main(String[] args) {
String str[] = new String[10];
// 배열 초기화
str[0] = "Java";
str[1] = "WebGL";
str[2] = "OpenCV";
str[3] = "OpenNLP";
str[4] = "JOGL";
str[5] = "Hadoop";
str[6] = "HBase";
str[7] = "Flume";
str[8] = "Mahout";
str[9] = "Impala";
System.out.println("원본 배열의 내용: \n" + Arrays.toString(str));
String[] newArray = Arrays.copyOf(str, 5);
System.out.println("복사된 배열의 내용: \n" + Arrays.toString(newArray));
}
}
실행 결과
원본 배열의 내용: [Java, WebGL, OpenCV, OpenNLP, JOGL, Hadoop, HBase, Flume, Mahout, Impala] 복사된 배열의 내용: [Java, WebGL, OpenCV, OpenNLP, JOGL]
위 예제에서 볼 수 있듯이, Arrays.copyOf(str, 5)는 배열의 처음부터 5번째 요소까지만 복사하여 새로운 배열을 생성합니다.
2. copyOfRange() 메서드 사용하기
copyOfRange() 메서드는 세 개의 매개변수를 받습니다.
- 복사할 원본 배열 (모든 타입 가능)
- 복사를 시작할 인덱스(포함)와 끝낼 인덱스(제외)를 나타내는 두 개의 정수 값
이 메서드는 지정한 범위에 해당하는 배열의 내용을 복사하여 새로운 배열로 반환합니다. 시작 인덱스는 결과에 포함되지만, 끝 인덱스는 포함되지 않는다는 점에 유의해야 합니다.
예제 코드
import java.util.Arrays;
public class CopyingSectionOfArray {
public static void main(String[] args) {
String str[] = new String[10];
// 배열 초기화
str[0] = "Java";
str[1] = "WebGL";
str[2] = "OpenCV";
str[3] = "OpenNLP";
str[4] = "JOGL";
str[5] = "Hadoop";
str[6] = "HBase";
str[7] = "Flume";
str[8] = "Mahout";
str[9] = "Impala";
System.out.println("원본 배열의 내용: \n" + Arrays.toString(str));
String[] newArray = Arrays.copyOfRange(str, 2, 7);
System.out.println("복사된 배열의 내용: \n" + Arrays.toString(newArray));
}
}
실행 결과
원본 배열의 내용: [Java, WebGL, OpenCV, OpenNLP, JOGL, Hadoop, HBase, Flume, Mahout, Impala] 복사된 배열의 내용: [OpenCV, OpenNLP, JOGL, Hadoop, HBase]
Arrays.copyOfRange(str, 2, 7)은 인덱스 2부터 인덱스 6까지의 요소를 복사합니다. 즉, 끝 인덱스인 7번째 요소("Flume")는 결과 배열에 포함되지 않습니다.
정리
배열의 앞부분을 복사할 때는 copyOf(), 중간의 특정 범위를 복사할 때는 copyOfRange()를 사용하는 것이 효율적입니다. 두 메서드 모두 원본 배열을 변경하지 않고 새로운 배열을 반환하기 때문에 안전하게 사용할 수 있습니다.