[JAVA] 1차원,2차원 배열의 깊은복사, 얕은복사? :: 매운코딩
728x90
300x250

2차원 배열을 복사할 일이 있어 clone() 함수를 사용하다가 궁금증이 생겨 찾아보았다.

출처 - https://limkydev.tistory.com/177 , https://dundun-dev.tistory.com/52

 

얕은복사는 복사된 배열이나, 원본배열이 변경될 때, 함께 변경됩니다.

깊은복사는 완벽하게 2개의 배열은 따로 존재한 지정한 의미에 복사입니다.

 

일반적으로 = 연산자는 얕은복사입니다.

얕은복사는 주소값을 복사하기 때문에 주소로 값을 참조하여 값이 변경되면 해당 값을 참조하고 있는 배열들의 값이 변경되는 것이지요..

 

(+) arr = arr1; 을 하게되면 실제 값이아닌 주소값이 복사되는 것

 

하지만, 깊은복사는 주소값을 참조하는것이 아닌, 새로운 메모리공간에 값을 복사하는 것이기 때문에 원본 배열이 변경되어도 복사된 배열에 전혀 상관이 없습니다.

 

그렇다면 깊은복사를 어떻게 할까요?

1차원배열에 경우 간단하게 array.clone() 함수를 쓰면 됩니다.

하지만 2차원 배열에 경우 array.clone() 함수를 써도, 깊은복사가 되지 않습니다.

 

2차원 배열 복사하는 방법은 따로 함수를 만들어서 직접 하나씩 복사하는 방법이 있다..

private static char[][] arrayCopy(char[][] aSource) {
	char[][] aDestination = new char[aSource.length][]
	for (int i = 0; i < aSource.length; i++) {
		aDestination[i] = aSource[i].clone();
	}
	return aDestination;
}
    private static int[][] deepCopy(int[][] original2) {
        if(original2 == null) return null;
        int[][] result = new int[original2.length][original2[0].length];
         
        for(int i=0; i<original2.length; i++){
            System.arraycopy(original2[i], 0, result[i], 0, original2[0].length);
        }
         
        return result;
    }
728x90

+ Recent posts