Programming Languages/Java

[Java] 배열을 복사하는 방법 (Shallow Copy, Deep Copy)

Jesse 2021. 12. 14. 22:40

Shallow Copy (얕은 복사)

배열을 복사하는 방법에는 Shallow Copy와 Deep Copy가 있는데

먼저 Shallow Copy에 대해서 알아 보았다.

  • 얕은 복사라고도 불리며 원본 객체와 복사한 객체는 메모리에서 같은 배열을 가르키게 된다
  • 복사본을 변경할 경우 당연히 원본도 변경

얕은 복사를 하는 방법

public class Array_Copy{
    public static void main(String[] args)  {
        int[] original = { 2, 5, 10, 15, 1557, 31, 488 };
        int[] copied = original;
    }
}

 

Deep Copy (깊은 복사)

  • 원본의 전체 배열을 복사해서 메모리의 다른 위치에 지정한 후 복사한 객체에 할당한다.
  • 원본 객체와 복사본 객체는 메모리에서 서로 다른 위치에 있는 배열을 할당하고 있기 때문에 서로의 변화에 영향을 받지 않는다.

깊은 복사를 하는 방법

1. System 클래스

public class Array_Copy{
    public static void main(String[] args)  {
        int[] original = { 1, 5, 5, 7 };
        int[] copied = new int[original.length];
        System.arraycopy(original, 0, copied, 0, original.length);
    }
}

System의 arraycopy를 사용할 경우 (원본, 복사하려는 원본의 시작 index, 복사본, 복사본의 시작 index, 복사하는 element의 개수)

 2. Arrays 클래스 (copyOf)

public class Array_Copy{
    public static void main(String[] args)  {
        int[] original = { 1, 5, 5, 7 };
        int[] copied = Arrays.copyOf(original, original.length);
    }
}

parameter 값으로 원본과 원본의 길이

3. Arrays 클래스 (copyOfRange)

public class Array_Copy{
    public static void main(String[] args)  {
        int[] original = { 1, 5, 5, 7 };
        int[] copied = Arrays.copyOfRange(original, 1, 2);
    }
}

parameter 값으로 원본의 시작 지점과 끝지점을 선택 가능

4. Object 클래스의 clone 사용

public class Array_Copy{
    public static void main(String[] args)  {
        int[] original = { 1, 5, 5, 7 };
        int[] copied = original.clone();
    }
}

clone()을 사용할때의 주의할점은 기본형만 깊은 복사가 가능하고 참조형은 얕은복사를 한다

5. Stream API 사용

public class Array_Copy{
    public static void main(String[] args)  {
        String[] original = {"orange", "red", "green'"};
        String[] copied = Arrays.stream(original).toArray(String[]::new);
    }
}

스트림 API를 사용할때의 주의할 점은 clone과 반대로 참조형을 사용할때 깊은 복사를 하지만 기본형을 사용할땐 얕은 복사를 한다는 점이다. 그래서 여태 int 배열을 예시로 사용하다가 여기선 String 배열을 예시로 사용하였다.