본문 바로가기
BackEnd/Java

[Java] 배열 복사 (깊은 복사 vs 얕은 복사)

by summer_light 2021. 7. 6.

배열 복사

배열 복사에는 얕은 복사, 깊은 복사 두 가지가 있다.

 

 

 


 

얕은 복사

주소값이 복사된 배열이기 때문에, 원본 배열이 변경되면 복사된 배열 또한 변경된다.

package may31;

import java.util.Arrays;

public class ArrayCopy01 {
	public static void main(String[] args) {
		
		int[] arr01 = {10, 20, 30};
		int[] arr02 = new int[3];
		
		arr02 = arr01; //arr01만 수정해도, arr02의 값도 수정된다. 

		//arr01의 0번째 원소의 값 바꾸기 
		arr01[0] = 100;
		
		System.out.println(Arrays.toString(arr01)); //[100, 20, 30]
		System.out.println(Arrays.toString(arr02)); //[100, 20, 30] arr01만 수정했는데, arr02의 값도 수정되었다.
	}
}

 

 

 

 

 

깊은 복사

원본 배열이 변경되어도 복사본 배열은 변경되지 않는다.

깊은 복사를 실행하는 방법은 다음과 같이 여러 방법이 존재한다.

  • for문을 활용하여 직접 대입
  • System.arraycopy(src, srcPos, dest, destPos, length) 이용
  • 원본배열이름.clone() 이용 

 

1) for문을 활용하여 직접 대입하는 방법  

package may31;

import java.util.Arrays;

public class ArrayCopy01 {
	public static void main(String[] args) {
		
		int[] arr01 = {10, 20, 30};
		int[] arr02 = new int[3];

		for (int i = 0; i < arr02.length; i++) {
			arr02[i] = arr01[i];
		}
	
		arr01[0] = 1000;

		System.out.println(Arrays.toString(arr01)); //[1000, 20, 30]
		System.out.println(Arrays.toString(arr02)); //[10, 20, 30] 변경 사항 반영x
	}
}

 

2) System.arraycopy(src, srcPos, dest, destPos, length) 이용하는 방법

package may31;

import java.util.Arrays;

public class ArrayCopy01 {
	public static void main(String[] args) {
		
		int[] arr01 = {10, 20, 30};
		int[] arr02 = new int[3];
	
		
		System.arraycopy(arr01, 0, arr02, 0, 0);
		/* src		원본
		 * srcPos	원본 시작위치 설정
		 * dest		값을 담을 배열
		 * destPos	배열 위치 설정	
		 * length 	담을 길이 설정
		 */
		
		int[] arr03 = new int[10];
		
		System.arraycopy(arr01, 0, arr03, 1, arr01.length);
		System.out.println(Arrays.toString(arr03));//[0,10,20,30,0,0,0,0,0,0]
		
		arr01[0] = 100;
		System.out.println(Arrays.toString(arr03));//[0,10,20,30,0,0,0,0,0,0] 변경 사항 반영x
		
	}
}

 

3) 원본배열이름.clone() 이용하기 

package may31;

import java.util.Arrays;

public class ArrayCopy01 {
	public static void main(String[] args) {
		
		int[] arr01 = {10, 20, 30};
		
		int[] arr04 = arr01.clone(); 
		arr01[0] = 90; 
		System.out.println(Arrays.toString(arr01)); //[90, 20, 30]
		System.out.println(Arrays.toString(arr04)); //[10, 20, 30] 변경 사항 반영 x

	}
}

 

 

'BackEnd > Java' 카테고리의 다른 글

[Java] 생성자 Constructor  (0) 2021.07.09
[Java] 텍스트 형식 Text Format  (0) 2021.07.08
[Java] Object  (0) 2021.07.01
[Java] 접근제어자 Access Modifier  (0) 2021.07.01
[Java] 스태틱 Static  (0) 2021.07.01

댓글