[JAVA] 얕은 복사(Shallow Copy) vs 깊은 복사(Deep Copy) 개념 및 코드 정리
반응형
JAVA에는 얕은 복사와 깊은 복사라는 개념이 있다.
1. 얕은 복사
원본 객체와 복사본 객체가 동일한 내부 객체를 참조하는 복사 방식이다.
즉, 원본 객체를 복사본의 객체가 가리키고 있는 C에서 포인터와 유사한 개념이다.
ex)
int[] a = {1,2,3};
//1.
int[] b = a;
//2.
int[] b = a.clone();
int[][] a; //값이 정의 되어있다고 가정
//3.
int[][] b = Arrays.copyOf(a, a.length);
이처럼 쉽게 복사할 수 있지만 만약 b 배열의 값을 수정하면 같은 객체를 공유하고 있기 때문에 a 배열의 값도 바뀌게 된다.
2. 깊은 복사
깊은 복사는 우리가 일반적으로 사용하려는 그 복사가 맞다. 즉, 복사된 객체가 서로 독립적이라는 뜻이다.
블로그를 떠돌아다니다 어디선가 clone으로도 깊은 복사가 된다고 봤는데 아니었다.
ex)
int[][] a; //값이 정의되어 있다고 가정
int[][] b = new int[a.length][];
//1. Arrays.copyOf()
for (int i = 0; i < a.length; i++)
b[i] = Arrays.copyOf(a[i], a[i].length);
//2. 그냥 노가다
for (int i = 0; i < a.length; i++)
for (int j = 0; j < a[i].length; j++)
b[i][j] = a[i][j];
알고리즘을 풀다가 헷갈려서 낭패본 적이 한두 번이 아니라 간결하고 정확하게 정리해 봤다!
반응형
'Algorithm' 카테고리의 다른 글
[JAVA] sort 할 때 정렬 기준 만드는 법(feat. Comparator) (0) | 2023.09.02 |
---|---|
[JAVA] 백준 2470 두 용액 (0) | 2023.07.20 |
[JAVA] 백준 13699 점화식 (0) | 2023.05.03 |
[JAVA] 백준 20922 겹치는 건 싫어 (0) | 2023.04.11 |
[JAVA] 백준 2146 다리 만들기 (0) | 2023.03.04 |