JAVA

[JAVA] 자바 배열 복사 (깊은 복사)

해니01_15 2023. 2. 20. 22:35

 

● 깊은 복사 

     배열의 요소는 동일하지만, 다른 메모리에 복사한다. 둘은 참조값이 다르다


- 직접 구현 

int [] a ={1,2,3,4,5}; // 원본 배열 
int [] b = new int [a.length]; // 깊은 복사를 할 때에는 원본 배열의 길이만큼만 복사배열이 존재 할 수 있다. 
int i;
for (i=0;i<a.length;i++){
b[i] = a[i] //원본 배열을 복사배열로 할당
}

 

int[] a = { 1, 2, 3, 4, 5 }; // 원본 배열 생성
int[] b = new int[a.length]; // 복사 될 배열 - 복사 배열은 원본 배열과 동일 한 크기로 생성
int i;

		for (i = 0; i < a.length; i++) {
			b[i] = a[i]; // 원본 배열 요소를 b에 복사

		}

		System.out.println("원본배열");
		for (i = 0; i < a.length; i++) {
			System.out.println(a[i] + "\t");
		}
		System.out.println();
		System.out.println("복사배열");
		for (i = 0; i < b.length; i++) {
			System.out.println(b[i] + "\t");
		}
		System.out.println();

		System.out.println("배열 a의 참조값" + a);
		System.out.println("배열 b의 참조값" + b);

		b[1]=20;
		
		System.out.println("b[1]변경후 배역 a 요소");
		for (i = 0; i < a.length; i++) {
			System.out.println(a[i] + "\t");
		}
		System.out.println();

		System.out.println("b[1]변경후 배역 b 요소");
		for (i = 0; i < b.length; i++) {
			System.out.println(b[i] + "\t");
		}
		System.out.println();

해당 코드를 실행해 보면 알 수 있는 것 처럼. 배열의 요소만 같을 뿐, 참조값과 값 변경 후의 값이 다르다. 

 

 

-API 메서드를 사용 

시스템클래스에 arraycopy()를 활용 
System.arraycopy(a, 0, b, 0, a.length);
System.arraycopy(원본배열, 원본배열 복사 시작위치, 복사대상배열, 복사 시작위치, 복사요소 갯수)

        int[] arr1 = {10, 20, 30, 40, 50};
        int[] arr2 = {1, 2, 3, 4, 5};

        // 복사할 배열, 복사할 첫 위치, 대상 배열, 붙여 넣을 첫 위치, 복사할 요소 개수
        System.arraycopy(arr1, 3, arr2, 1, 2);

        for(int i = 0; i < arr2.length; i++)
            System.out.println(arr2[i]);