language/java
[Java] System.arraycopy 와 Array.copyOfRange
zincah
2023. 6. 6. 17:38
반응형
Java에는 배열을 복사하는 여러가지 방법들이 있는데 내가 아는 방법들에 대해 간단하게 정리해보려 합니다.
Java 배열 복사 방법
- System.arraycopy
- Arrays.copyOf
- Arrays.copyOfRange
- for문으로 hard copy
System.arraycopy
// System.java
@HotSpotIntrinsicCandidate
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
System.java의 arraycopy메소드를 확인하면 다음과 같이 되어있습니다. 변수들을 살펴보면
- src : 복사하고자 하는 원본 배열
- srcPos : 원본 배열에서 복사할 때 시작 인덱스
- dest : 복사한 값을 저장해주는 배열
- destPos : dest배열에서 어디부터 복사한 값을 저장할 것인지에 대한 인덱스
- length : 원본 배열에서 얼만큼 읽어올 것인지에 대한 길이
System.arraycopy 예시
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 1. System.arraycopy 3번째 인덱스 부터 배열 끝까지 복사
int[] copyArr = new int[arr.length - 3];
System.arraycopy(arr, 3, copyArr, 0, arr.length - 3);
for(int i=0; i<copyArr.length; i++){
System.out.print(copyArr[i] + " ");
}
// 출력 결과
// 4 5 6 7 8 9 10
- 원본 배열인 arr에서 3번째 인덱스에서 부터 끝까지 값을 복사하여 copyArr에 저장해줍니다.
Arrays.copyOf
// Arrays.java
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
해당 소스를 살펴보면 Arrays.copyOf 메소드를 실행하면 System.arraycopy를 실행한다는 것을 알 수 있습니다. 변수들을 살펴보면
- original : 복사하고자 하는 원본 배열
- newLength : 복사할 배열의 크기
복사된 배열을 바로 return하므로 아래와 같이 예시를 작성해줄 수 있습니다.
Arrays.copyOf 예시
// 2. Arrays.copyOf 인덱스 5까지 복사
// import java.util.Arrays;
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] copyArr1 = Arrays.copyOf(arr, 6);
for(int i=0; i<copyArr1.length; i++){
System.out.print(copyArr1[i] + " ");
}
// 출력 결과
// 1 2 3 4 5 6
- arr배열에서 길이가 6만큼 배열을 복사하려 했음으로 다음과 같이 작성해주면 됩니다.
Arrays.copyOfRange
// Arrays.java
public static int[] copyOfRange(int[] original, int from, int to) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
int[] copy = new int[newLength];
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
return copy;
}
해당 메소드도 역시 System.arraycopy를 사용하는 것을 알 수 있습니다. 변수들을 살펴보면
- original : 복사하고자 하는 원본 배열
- from : 복사를 시작할 인덱스
- to : 복사가 끝나는 지점의 다음 인덱스 (ex. 7번 인덱스까지 복사하고 싶으면 int to = 8)
Arrays.copyOfRange 예시
// 3. Arrays.copyOfRange 3번째 인덱스부터 7번째 인덱스까지 복사
// import java.util.Arrays;
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] copyArr2 = Arrays.copyOfRange(arr, 3, 8);
for(int i=0; i<copyArr2.length; i++){
System.out.print(copyArr2[i] + " ");
}
// 출력 결과
// 4 5 6 7 8
- arr배열의 3번 인덱스부터 8번 인덱스의 전까지 배열의 값이 복사됩니다.
for문 사용
// 4. for문을 통해 3번째 인덱스부터 끝까지 복사
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] copyArr3 = new int[arr.length - 3];
int pos = 3;
for(int i=0; i<copyArr3.length; i++){
copyArr3[i] = arr[pos++];
}
for(int i=0; i<copyArr3.length; i++){
System.out.print(copyArr3[i] + " ");
}
// 출력 결과
// 4 5 6 7 8 9 10
반응형