[자바]/자바 문법

[Java] 배열 복사 Arrays.copyOf() vs System.arraycopy()

쿠릉쿠릉 쾅쾅 2021. 10. 31. 15:57
728x90

 

📌 Arrays.copyOf()

  • Arrays.copyOf(원본배열, 복사할길이);
  • Arrays.copyOfRange(A, form_index, to_index)
    • int[] A : 복사할 배열
    • int from_index : 복사할 배열의 시작 index
    • int to_index : 복사할 배열의 끝 index 
    • 복사할 끝 index 값은 포함 안됨 
  • import java.util.Arrays; 필요
  • Arrays.copyOf()System.arraycopy()를 래핑한 함수
  • Arrays.copyOf()System.arraycopy()가 구현하는 것 외에 추가 기능 제공
    • System.arraycopy()는 단순히 소스배열에서 대상으로 값을 복사하지만 Arrays.copyOf()는 새 배열도 만들 수 있고 필요한 경우 내용을 자르거나 채울 수 있음

 

import java.util.Arrays;

// arr1 배열에서 0번째부터 3개의 값 복사
Array.copyOf(arr1, 3);

// arr1 배열에서 2번째부터 4번째까지 값 복사 (4번째 값 포함 안됨)
Array.copyOfRange(arr1, 2, 4);

 

 

import java.util.Arrays;

class prac{
    public static void main(String[] args){
        int[] arr1 = {1,2,3,4,5, 6, 7, 8, 9, 0};
        int[] arr2 = Arrays.copyOf(arr1, 3);
        int[] arr3 = Arrays.copyOfRange(arr1, 2, 7);
        
        System.out.println(Arrays.toString(arr1));  // [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
        System.out.println(Arrays.toString(arr2));  // [1, 2, 3]
        System.out.println(Arrays.toString(arr3));  // [3, 4, 5, 6, 7]
    }
}

 

 

 

 

 

📌 System.arraycopy()

  • System.arraycopy(src, srcPos, dest, destPos, length);
    • Object src  : 복사할 객체, 원본 배열
    • int srcPos : 복사 시작할 index
    • Object dest : 복사된 배열
    • int destPos : 원본으로부터 가져온 데이터를 복사된 배열의 몇 번째부터 추가할지
    • int length : 카피되는 배열 요소 개수
  • native 메서드로 되어있어 속도가 빠름

 

// arr1 배열에서 0번째부터 3개 값을 arr2 배열의 2번째부터 추가하겠다는 의미
System.arraycopy(arr1, 0, arr2, 2, 3);

 

 

예제

import java.util.Arrays;

class prac {
    public static void main(String[] args){
        int[] arr1 = {1,2,3,4,5,6};
        int[] arr2 = new int[6];
        
        System.arraycopy(arr1, 0, arr2, 2, 3);
        System.out.println(Arrays.toString(arr2));  // [0, 0, 1, 2, 3, 0]
    }
}

 

 

 

 

 

 

정리

Arrays.copyOf()System.arraycopy() 보다 더 직관적

Arrays.copyOf()System.arraycopy() 와 달리 새 배열도 생성 가능

전체 길이를 전부 복사하거나, 복사 대상의 객체를 유지하지 않아도 된다면 Arrays.copyOf() 를 사용할 것

복사하는 길이를 명시하거나 객체를 유지해야한다면 System.arraycopy()를 사용 할 것

기본의 배열의 일부만 덮어쓰이기 또는 clone()보다 더 빠르길 원할 때는 System.arraycopy()를 쓸 것

 

728x90