JAVA

배열의 복사 : clone() 메서드 자바

Meluu_ 2024. 9. 3. 09:31

✔️ 1차원 배열 깊은 복사


얕은 복사는 그냥 대입하면 되므로 깊은 복사를 중점으로 정리
 
1차원 배열 깊은 복사는 배열의 메서드인 clone() 을 사용하면 된다. 
 
int[] arr = {1,2};
int[] arr2 = arr.clone();
 
 

 Test

public class Main {
    public static void main(String[] args) throws IOException {

        int[] arr = {1, 2};
        int[] arr2 = arr.clone();

        arr[0] = 55555;
        for (int i : arr) {
            System.out.print(i + " ");
        }


        System.out.println();

        for (int i : arr2) {
            System.out.print(i + " ");
        }

    }
}
출력

 

 

 

✔️ 2차원 배열 깊은 복사


 2차원 배열 복사가 문제인데 

이때는 그냥 무작정 arr2 = arr.clone()을 하면 안된다. 

 

잘 생각해보자 2차원 배열은 각 1차원 배열에 대한 주소를 갖는다. 따라서 clone을 할 시 주소값이 넘어가기에 

완전한 복사가 되지 않는다. 

 

따라서 각 2차원 배열에 있는 1차원 배열 각각에 대하여 복사를 해야한다.

 

int[][] arr2 = new int[n][n];

for (int i = 0; i < arr.length; i++) {
    arr2[i] = arr[i].clone();
}

 

 

2차원 배열을 무작정 복사

public class Main {
    public static void main(String[] args) throws IOException {
        int[][] arr = {{1,2}, {3,4}};
        int[][] arr2 = arr.clone();

        arr[0][0] = 555;
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.println();
        }

        System.out.println();

        for (int[] ints : arr2) {
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.println();
        }

    }
}

결과

// arr
555 2 
3 4 

// arr 2
555 2 
3 4

 

 

 

 

정상적인 2차원 배열 복사

public class Main {
    public static void main(String[] args) throws IOException {
        int[][] arr = {{1,2}, {3,4}};
        int[][] arr2 = new int[2][2];

        // 깊은 복사
        for (int i = 0; i < arr.length; i++) {
            arr2[i] = arr[i].clone();
        }

        arr[0][0] = 555;
        
        for (int[] ints : arr) {
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.println();
        }

        System.out.println();

        for (int[] ints : arr2) {
            for (int anInt : ints) {
                System.out.print(anInt + " ");
            }
            System.out.println();
        }

    }
}

 결과

// arr
555 2 
3 4 

// arr2
1 2 
3 4

 

 

🔖 학습 참조