2차원 배열은 1차원 배열과 깊은 복사 하는 방식이 다르다.
1차원 배열 : clone을 사용해서 깊은 복사 가능.
2차원 배열 : 루프를 돌리거나, System.arraycopy 를 사용해야 깊은 복사 가능.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | int [] DArr = {1, 2}; int [] DDeep = DArr.clone(); int [] DLight = DArr; System.out.println("----------------------"); System.out.println("1차원 배열 원본"); printArr(DArr); System.out.println("1차원 배열 깊은 복사"); printArr(DDeep); System.out.println("1차원 배열 얕은 복사"); printArr(DLight); System.out.println("----------------------"); System.out.println("1차원 배열 값 변경"); DArr[0] = 350; DArr[0] = 321; System.out.println("----------------------"); System.out.println("1차원 배열 원본"); printArr(DArr); System.out.println("1차원 배열 깊은 복사"); printArr(DDeep); System.out.println("1차원 배열 얕은 복사"); printArr(DLight); System.out.println("----------------------");
| cs |
결과는
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ---------------------- 1차원 배열 원본 1 2 1차원 배열 깊은 복사 1 2 1차원 배열 얕은 복사 1 2 ---------------------- 1차원 배열 값 변경 ---------------------- 1차원 배열 원본 321 2 1차원 배열 깊은 복사 1 2 1차원 배열 얕은 복사 321 2 ----------------------
| cs |
위와 같이 나온다.
깊은 복사를 한 경우에만 원본의 값이 복사되고, 주소값에 따라가지 않는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | int [][] tDArr = {{1, 2}, {3, 4}}; int [][] tDDeepWithClone = tDArr.clone(); int [][] tDDeepWithArrayCopy = deepCopy(tDArr); int [][] tDLight = tDArr; System.out.println("2차원 배열 원본"); print2DArr(tDArr); System.out.println("2차원 배열 clone 을 이용한 복사"); print2DArr(tDDeepWithClone); System.out.println("2차원 배열 arraycopy 를 이용한 복사"); print2DArr(tDDeepWithArrayCopy); System.out.println("2차원 배열 앝은 복사"); print2DArr(tDLight); System.out.println("----------------------"); System.out.println("2차원 배열 값 변경"); tDArr[0][1] = 350; tDArr[1][0] = 321; System.out.println("----------------------"); System.out.println("2차원 배열 원본"); print2DArr(tDArr); System.out.println("2차원 배열 clone 을 이용한 복사"); print2DArr(tDDeepWithClone); System.out.println("2차원 배열 arraycopy 를 이용한 복사"); print2DArr(tDDeepWithArrayCopy); System.out.println("2차원 배열 앝은 복사"); print2DArr(tDLight); System.out.println("----------------------");
| cs |
2차원 배열의 경우에도 clone 이 사용 가능하긴 하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | ---------------------- 2차원 배열 원본 1 2 3 4 2차원 배열 clone 을 이용한 복사 1 2 3 4 2차원 배열 arraycopy 를 이용한 복사 1 2 3 4 2차원 배열 앝은 복사 1 2 3 4 ---------------------- 2차원 배열 값 변경 ---------------------- 2차원 배열 원본 1 350 321 4 2차원 배열 clone 을 이용한 복사 1 350 321 4 2차원 배열 arraycopy 를 이용한 복사 1 2 3 4 2차원 배열 앝은 복사 1 350 321 4 ----------------------
| cs |
하지만 clone을 사용 시에도 얕은 복사로 진행된다.
| static int [][] deepCopy(int[][] defProc){ int [][] copyReturn = new int [defProc.length][defProc[0].length]; for(int i = 0; i < defProc.length; i++) { System.arraycopy(defProc[i], 0, copyReturn[i], 0, defProc[i].length); } return copyReturn; }
| cs |
2차원 배열은 위와 같이 System.arraycopy 를 써서 깊은 복사가 가능하다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //1차원 배열 출력 static void printArr(int [] arr) { for(int i : arr) { System.out.print(i + "\t"); } System.out.println(""); } //2차원 배열 static void print2DArr(int [][] arr) { for(int i = 0; i < arr.length; i++) { for(int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j] + "\t"); } System.out.println(); } }
| cs |
출력은 이렇게 한다.
* 에디터 HTML 모드가 위치가 수정되서 찾는데 고생했다.
참조 : https://dwspnote.blogspot.com/2020/10/blog-create-post-2.html
친절한 블로거 고맙습니다!
댓글
댓글 쓰기