[Java] Java 배열의 얕은 복사 & 깊은 복사

Yoon Uk·2022년 7월 13일
0

언어 - Java

목록 보기
1/5
post-thumbnail

Java의 배열 복사에는 얕은 복사(Shallow Copy)깊은 복사(Deep Copy)가 있다.

  • 얕은 복사(Shallow Copy)는 단순히 배열의 주솟값을 복사하여 가져오는 방법이다.
    • 단순히 주솟값을 복사하는 것이기 때문에 새로운 배열을 수정하면 원본 배열도 수정된다.
  • 깊은 복사(Deep Copy)는 새 배열에 완전히 덮어씌우는 방법이다.
    • 새로운 배열을 수정해도 원본 배열은 수정되지 않는다.

얕은 복사(Shallow Copy)깊은 복사(Deep Copy)를 사용하는 방법이 다르다.

1차원 배열에서의 복사

얕은 복사

  • 원본 배열의 주솟값을 가져온다.
  • 복사한 배열의 값을 수정하면 원본 배열의 값도 수정된다.
  • 단순히 배열 변수 선언을 통해 복사할 수 있다.
		int[] rootArr = {1, 2, 3, 4, 5};
		int[] newArr = rootArr;
		
		newArr[0] = 100;
		
		//새로운 배열을 바꾸면 원본 배열의 값이 바뀐다
		for(int val : rootArr) {
			System.out.print(val+" ");
		}
        >>> 100 2 3 4 5 

깊은 복사

  • 원본 배열의 값을 그대로 가져와 새로운 배열에 복사한다.
  • 복사한 배열의 값을 수정해도 원본 배열의 값은 영향을 받지 않는다.
  • rootArr.clone();을 사용하여 복사할 수 있다.
		int[] rootArr = {1, 2, 3, 4, 5};
		int[] newArr = rootArr.clone();
		
		newArr[0] = 100;
		
        // 원본 배열의 값은 변하지 않는다.
		for(int val : rootArr) {
			System.out.print(val+" ");
		}
		>>> 1 2 3 4 5
        
        // 새로운 배열의 값만 변한다.
		for(int val : newArr) {
			System.out.print(val+" ");
		}
		>>> 100 2 3 4 5

2차원 배열에서의 복사

얕은 복사

  • 단순 변수 선언 뿐 만 아니라 newArr.clone();을 사용해도 얕은 복사가 된다.
		int[][] rootArr = {{1, 2, 3, 4, 5}, 
						   {11, 12, 13, 14, 15}};
		int[][] newArrA = rootArr;
		int[][] newArrB = rootArr.clone();
		

		// 단순 변수 선언 시 원본 배열도 값이 바뀜
		newArrA[0][0] = 100;
		System.out.println(rootArr[0][0]);
		>>> 100
        
		// clone()을 쓴 배열을 바꾸면 원본 배열도 값이 바뀜
		newArrB[1][1] = 555;
		System.out.println(newArrB[1][1]);
        >>> 555

깊은 복사

  • 2중 반복문을 사용해 복사해야 한다.
  • 반복문 + System.arraycopy() 을 사용하여 복사한다.
    • System.arraycopy(원래 배열, 원래 배열 시작 위치, 새 배열, 새 배열 시작 위치, 길이)
		int[][] rootArr = {{1, 2, 3, 4, 5}, 
						   {11, 12, 13, 14, 15}};
		
		// newArrA : rootArr와 같은 사이즈로 만든 후, 2중 반복문을 통한 복사
		int[][] newArrA = new int[rootArr.length][rootArr[0].length];

		for(int i = 0; i < rootArr.length; i++){ // 2중 반복문
			for(int j = 0 ; j < rootArr[0].length; j++){
				newArrA[i][j] = rootArr[i][j];
			}
		}

		// newArrB : rootArr와 같은 사이즈로 만든 후, 반복문 + arraycopy 사용하여 복사
		int[][] newArrB = new int[rootArr.length][rootArr[0].length]; // C 선언,

		for(int i = 0; i < rootArr.length; i++){ // 반복문 + ArrayCopy
			System.arraycopy(rootArr[i], 0, rootArr[i], 0, rootArr[i].length);
		}


		newArrA[0][0] = 100;
		newArrB[1][1] = 500;

		// newArrA을 바꿔도 rootArr 값이 바뀌지 않는다.
		System.out.println(rootArr[0][0]);
		>>> 1
        
		// newArrB을 바꿔도 rootArr 값이 바뀌지 않는다.
		System.out.println(rootArr[1][1]);
        >>> 1

0개의 댓글