프로그래밍/Java

자바 배열을 복사하는 방법 (깊은 복사, 얕은 복사)

개발계발게발 2021. 5. 31. 17:46
반응형

배열 복사하는 방식

얕은 복사, 깊은 복사 2가지 방식으로 구분

 

배열 얕은 복사, 깊은 복사

 

얕은 복사(shallow copy)

한 쪽에서 수정이 발생되면 다른쪽에도 영향을 끼쳐 같아지게 된다.

얕은 복사는 주소값을 복사하기 때문에 주소로 값을 참조하여 값이 변경되면

해당 값을 참조하고 있는 배열들의 값이 변경된다.

복사된 배열이나 원본 배열이 변경될 때 함께 변경(연산자는 얕은 복사 수행)

 

		int[] arr01 = {10, 20, 30};
		int[] arr02 = new int[3];
		arr02 = arr01;
		
		arr01[0] = 100;
		
		System.out.println(Arrays.toString(arr01));	//[100, 20, 30]
		System.out.println(Arrays.toString(arr02));	//[100, 20, 30] 

 

깊은 복사(Deep copy)

깊은 복사는 주소값을 참조하는 것이 아닌, 새로운 메모리 공간에 값을 복사

원본 배열이 변경되어도 복사된 배열과 상관없음

배열을 복사한 후에 한쪽 값을 수정해도 다른 배열에 영향을 미치지 않는다.

 

		for (int i = 0; i < arr01.length; i++) {	//for문 방식
			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]
		
		System.arraycopy(arr01, 0, arr02, 0, arr01.length);	//arraycopy 방식
		/*
		 	src 원본
		 	srcPos 원본 어느 위치 부터
		 	dest	값을 담을 배열
		 	destPost	어느 위치에 저장
		 	length	어느 길이만큼		  
		 */
		System.out.println(Arrays.toString(arr01));	//[1000, 20, 30]
		System.out.println(Arrays.toString(arr02));	//[1000, 20, 30]
		
		int[] arr03 = new int[10];
		//[0,0,0,0,0,0,0,0,0,0]
		System.arraycopy(arr01, 0, arr03, 1, arr01.length);	

		System.out.println(Arrays.toString(arr03));	//[0,1000, 20, 30,0,0,0,0,0,0]
		
		int[] arr04 = arr01.clone();	//clone 방식
		System.out.println(Arrays.toString(arr04))

 

System.arraycopy()

int[] a = { 1, 2, 3, 4, 5 };
int[] b = new int[5];
System.arraycopy(a, 0, b, 0, a.length); // [ 1, 2, 3, 4, 5 ]

System.out.println(Arrays.toString(arr02));	//[1000, 20, 30]
		
int[] arr03 = new int[10];
//[0,0,0,0,0,0,0,0,0,0]
System.arraycopy(arr01, 0, arr03, 1, arr01.length);	
System.out.println(Arrays.toString(arr03));	//[0,1000, 20, 30,0,0,0,0,0,0]

지정된 위치(0)에서 시작해 지정된 소스(a)의 배열을 대상 배열(b)의 지정된 위치(0)에 지정 길이(a.length) 만큼 복사하는 기능을 제공하고 있으므로 다양하게 활용이 가능합니다.

 

clone()

int[] a = { 1, 2, 3, 4, 5 };
int[] b = a.clone(); // [ 1, 2, 3, 4, 5 ]

변수명.clone();

Arrays.copyOf()

int[] a = { 1, 2, 3, 4, 5 };
int[] b = Arrays.copyOf(a, a.length); // [ 1, 2, 3, 4, 5 ]

Arrays.copyOf 배열의 시작점부터 원하는 길이(a.length)까지 복사

Arrays.copyOfRange()

int[] a = { 1, 2, 3, 4, 5 };
int[] b = Arrays.copyOfRange(a, 0, a.length); // [ 1, 2, 3, 4, 5 ]

Arrays.copyOf()는 배열의 처음부터 원하는 길이(a. length)까지 복사

Arrays.copyOfRange() 메서드는 복사할 배열의 시작점도 지정 가능

 

반응형