복사의 종류
객체를 복사하는 유형은 객체의 주소를 복사하는 얕은 복사(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가지가 있습니다.
- 반복문
- java.util.Object.clone()
- java.util.Arrays.copyOf()
- java.util.Arrays.copyOfRange()
- java.lang.System.arraycopy()
2차원 배열의 깊은 복사 방법으로는 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);
}
반응형
'Java' 카테고리의 다른 글
[Java] 배열을 ArrayList로 변환 (0) | 2020.06.30 |
---|---|
[Java] 자바 날짜, 시간 API의 형변환 방법 (0) | 2020.06.29 |
[Java] LocalDateTime (0) | 2020.06.28 |
[Java] Wrapper class와 Auto Boxing (0) | 2020.06.16 |
[Java] java.util.Date와 java.sql.Date의 차이점 및 변환 (0) | 2020.06.14 |