Java

[Java] 배열을 복사하는 방법

📝 작성 : 2020.06.17  ⏱ 수정 : 
728x90

복사의 종류

객체를 복사하는 유형은 객체의 주소를 복사하는 얕은 복사(Shallow Copy)와 객체를 완전히 복사하는 깊은 복사(Deep Copy)가 있습니다.

 

얕은 복사

객체의 주소를 복사하기 때문에 여러 객체가 같은 주소를 참조합니다. 그렇기 때문에 한 객체의 값을 변경하면 다른 객체의 값도 변경됩니다. 그렇기 때문에 대개 복사한다는 말은 깊은 복사를 의미합니다.

int[] a = {1, 2, 3};
int[] b = a;
print(b);

a[0] = 100;
print(b);

Output

1, 2, 3
100, 2, 3

 

깊은 복사

객체의 실제 값을 새로운 객체로 복사합니다. 값만 같고 완전히 다른 객체이기 때문에 한 객체를 변경해도 다른 객체에 영향이 없습니다.

1차원 배열의 깊은 복사 방법으로는 5가지가 있습니다.

  1. 반복문
  2. java.util.Object.clone()
  3. java.util.Arrays.copyOf()
  4. java.util.Arrays.copyOfRange()
  5. java.lang.System.arraycopy()

 

2차원 배열의 깊은 복사 방법으로는 2가지가 있습니다.

  1. 2중 반복문
  2. 반복문 + java.lang.System.arraycopy()

 

1차원 배열의 깊은 복사

1.  반복문

int[] a = {1, 2, 3};
int[] b = new int[a.length];

for (int i = 0; i < a.length; i++) {
    b[i] = a[i];
}

 

2.  java.util.Object.clone()

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

 

3.  java.util.Arrays.copyOf()

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

Arrays.copyOf(원본, 복사할 길이)

 

4.  java.util.Arrays.copyOfRange()

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

Arrays.copyOfRange(원본, 원본 복사 시작할 인덱스, 복사할 길이)

 

5.  java.lang.System.arraycopy()

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

System.arraycopy(원본, 원본 복사시작할 인덱스, 복사본, 복사본에 값을 채워넣기 시작 할 인덱스, 복사할 길이)

 

2차원 배열의 깊은 복사

1.  2중 반복문

int[][] a = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int[][] b = new int[a.length][a[0].length];

for (int i = 0; i < a.length; i++) {
    for (int j = 0; j < a[i].length; j++) {
        b[i][j] = a[i][j];
    }
}

 

2.  반복문 + java.lang.System.arraycopy()

int[][] a = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int[][] b = new int[a.length][a[0].length];

for (int i = 0; i < a.length; i++) {
    System.arraycopy(a[i], 0, b[i], 0, a[i].length);
}
반응형