본문 바로가기
Dev/Java

2차원 배열의 값 복사하기

by IMSfromSeoul 2021. 12. 10.

1차원 배열에서 값 복사하기

▸ System.arraycopy()

public class Main{
    public static void main(String[] args) {
        int[] cloneArr = new int[5];
        int[] arr = new int[]{1,2,3,4,5};
        System.arraycopy(arr,0,cloneArr,0,5);
        System.out.println(Arrays.toString(cloneArr));
        }
}
  • 복사 화살표의 방향 →
  • 왼쪽에 있는 배열에서 오른쪽에 있는 배열로 복사가 일어난다.

그런데 System.arraycopy()는 인자의 값도 많고, 순서도 헷갈린다. 더 간단하게 구현할 방법은 없을까?

▸ clone()

clone() 메서드를 이용하면 간편하게 1차원 배열의 값을 복사해 올 수 있다. 대신 간편한 대신, 단서가 붙는다. 모든 멤버 변수가 원시타입이거나, 불변해야 한다 ( Primitive and Immutable ). 왜냐하면 clone() 메서드는 단순히 객체 안에 있는 값을 복사해오기 때문이다. 참조 변수를 갖고 있다면, 참조 변수의 주소 값을 복사해오기 때문에 매우 위험하다.

 

그러나 1차원 int 배열에서의 값을 복사해온다면, 문제 없다.

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

        System.out.println(arr);
        System.out.println(cloneArr);
        System.out.println(Arrays.toString(cloneArr));
    }
}

2차원 배열에서의 값 복사하기

clone() 메서드는 단순히 객체안에 있는 값을 복사해오기 때문에, 참조 변수가 있을 경우 clone()을 사용하면 안된다고 위에서 언급했다. 1차원 배열은 참조 변수이다. 2차원 배열은 1차원 배열들을 여러 개 갖고 있는 형태이기 때문에, 2차원 배열을 복사하기 위해서 clone()을 쓰는 것은 안된다.

 

그래서 다른 방법으로, 2차원 배열에서 값을 가져오려면 1차원 배열들의 값을 clone()으로 복사해서 가져오면 된다.

다만 이 때도, 1차원 배열안에 있는 값들이 참조 타입이면 문제가 생길 수 있음을 유념하자.

public class Main {
    public static void main(String[] args) {
        int[][] arr = new int[][]{
                {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
                {13,14,15,16}
        };
        int N = arr.length;
        int[][] cloneArr = new int[N][N];
        for(int i=0;i<N;i++){
            cloneArr[i] = arr[i].clone();
        }

        cloneArr[0][2] = 999;

        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                System.out.print(arr[i][j] + " ");
            }
            System.out.println();
        }
    }
}

▸ 참조 링크들

clone은 단순히 객체 안의 값을 복제한다.
https://ktko.tistory.com/entry/%EC%9E%90%EB%B0%94-Clone%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C

implements cloneable 사용법
https://developer-youngjun.tistory.com/20

댓글