[Java] System.arraycopy() 와Arrays.copyOf()의 차이 (배열 복사)

kai6666·2022년 6월 2일
1

TIL. Java

목록 보기
17/21
post-custom-banner

💁‍♀️ 배열 복사 메서드

자바에서 배열을 복사할 때 사용할 수 있는 두 가지 메서드가 있다. 바로 System.arraycopy()Arrays.copyOf()이다. 사용법은 아래와 같다.

System.arraycopy()

System.arraycopy(원본배열, 원본 배열의 복사 시작 지점, 복사할 배열, 복사할 배열의 복사 시작 지점, 복사할 요소의 개수)

Arrays.copyOf()

Arrays.copyOf(원본배열, 원본 배열에서 복사해올 길이)

👉 코드로 살펴보는 차이점

먼저 1부터 10까지의 수를 담은 배열 arr과 크기 15의 배열 copied를 만들어준다.

int[] arr = {1,2,3,4,5,6,7,8,9,10};
int[] copied = new int[15];

System.arraycopy() 메서드부터 사용해봤다. arr를 copied의 1번째 자리로 10개 숫자 모두 복사해왔다. 보이다 싶이 남은 공간은 0으로 채워져있다.

System.arraycopy(arr,0,copied,1,10)
System.out.println(Arrays.toString(copied)); 
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0]

Arrays.copyOf 메서드를 사용해봤다. arr로부터 15만큼을 복사해오고, 7만큼 복사해와봤다. 위치 지정 이런 것없이 첫번째 요소부터 지정한 길이만큼 가져온 것이 보인다.

int[] copied = Arrays.copyOf(arr, 15);
System.out.println(Arrays.toString(copied)); 
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]

int[] copied = Arrays.copyOf(arr, 7);
System.out.println(Arrays.toString(copied)); 
// [1, 2, 3, 4, 5, 6, 7]

코드로 봤을 때, 두 메서드의 차이는 복사해오는 길이/범위에 있는 것 같다. 그러나 Arrays.copyOf의 소스 코드를 보면 System.arraycopy() 메서드를 래핑한 함수라서 사실상 같은 함수라는 사실을 알 수 있다.

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() : 복사 길이를 명시해야 하거나, 객체를 유지하고자 할 때 사용 추천.

참고 자료
소스코드

profile
성장 아카이브
post-custom-banner

2개의 댓글

comment-user-thumbnail
2023년 6월 25일

Arrays.copyOf가 2배가량 빠르다고 한다. -> 이건 틀린내용아닌가요

System.arrayCopy 를 래핑하는데 어떻게 2배가량 빠를수있는거죠..

1개의 답글