language/java

[Java] System.arraycopy 와 Array.copyOfRange

zincah 2023. 6. 6. 17:38
반응형
Java에는 배열을 복사하는 여러가지 방법들이 있는데 내가 아는 방법들에 대해 간단하게 정리해보려 합니다.
Java 배열 복사 방법
  1. System.arraycopy
  2. Arrays.copyOf
  3. Arrays.copyOfRange
  4. 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

 

반응형