본문 바로가기
카테고리 없음

[JAVA] 얕은 복사, 깊은 복사 - Shallow Copy, Deep Copy

by IsBerry 2021. 7. 6.
반응형

[JAVA] 얕은 복사, 깊은 복사

 


Java에서 객체를 복사하는 유형으로 깊은 복사와 얕은 복사가 있습니다.

깊은 복사(Deep Copy) 경우, 객체의 실제값을 새로운 객체로 복사하는 것이고,

얕은 복사(Shallow Copy)는 여러 객체가 같은 주소를 참조하기 때문에 하나의 값을 변경해버리면, 다른 대상의 값 또한 바뀌어 버리는 문제 등이 발생합니다.

 

메모리 측면에서는 깊은 복사를 할 경우에, 비효율적이게 될 수도 있습니다.

 

얕은 복사 (Shallow Copy)

public class Array_Copy{
    public static void main(String[] args)  {
        int[] a = [ 1, 2, 3, 4 ];
        int[] b = a;
    }
}

a배열을 b배열로 = 연산자를 활용하여 대입하면, 얕은 복사가 됩니다.

b배열을 수정하면, a배열까지 같이 수정되는 상황이 됩니다.

깊은 복사 (Deep Copy)

Object.clone()

public class Array_Copy{
    public static void main(String[] args)  {
        int[] a = [ 1, 2, 3, 4 ];
        int[] b = a.clone();
    }
}

Array.clone()을 사용하면 배열을 쉽게 복사할 수 있습니다. 가장 보편적인 방법 입니다.

 

Arrays.copyOf()

import java.util.Arrays;

public class Array_Copy{
    public static void main(String[] args)  {
        int[] a = { 1, 2, 3, 4 };
        int[] b = Arrays.copyOf(a, a.length);
    }
}

배열의 시적점~ 원하는 length까지 배열의 깊은 복사를 할 수 있습니다.

 

Arrays.copyOfRange()

import java.util.Arrays;

public class Array_Copy{
    public static void main(String[] args)  {
        int[] a = { 1, 2, 3, 4 };
        int[] b = Arrays.copyOfRange(a, 1, 3);
    }
}

 

배열의 복사할 배열의 시작점도 지정할 수 있습니다.

 

System.arraycopy()

public class Array_Copy{
    public static void main(String[] args)  {
        int[] a = { 1, 2, 3, 4 };
        int[] b = new int[a.length];
        System.arraycopy(a, 0, b, 0, a.length);
    }
}

지정된 배열을 대상의 지정된 위치에 복사합니다.

 

2차원 배열의 깊은 복사

1차 배열의 깊은 복사의 경우 위 메서드를 사용하면 쉽게 복사가 가능하지만, 2차원 경우엔 깊은 복사가 되지않습니다.

 

그 이유는 2차원 배열의 구조 a[x][y]에서 배열을 복사하는 메서드를 사용하게 되면 a[x]만 깊은복사가 되고 값이 있는 a[x][y]는 깊은 복사가 되지 않습니다. 그렇기에 2차원 배열을 복사하기 위해서는 for문을 돌리면서 값이 있는 a[x][y]를 일일이 복사해주어야 합니다.

 

또는, for문을 돌려 system.arraycopy메서드를 이용해 2차원 배열을 복사할 수 있습니다.

public class Array_Copy{
    public static void main(String[] args)  {
        int a[][] = {{1,2,3},{4,5,6,},{7,8,9}};
        int b[][] = new int[a.length][a[0].length];
	    
        for(int i=0; i<b.length; i++){
            System.arraycopy(a[i], 0, b[i], 0, a[0].length);
        }
    }
}

 

출처

https://coding-factory.tistory.com/548?category=758267 

반응형