0. 배열의 깊은 복사, 얕은 복사
- Java의 복사
- 얕은 복사(Shallow copy):
원본 배열이나 복사된 배열이 변경될 때 상대 배열의 값이 같이 변경된다. - 깊은 복사(Deep copy):
원본 배열이나 복사된 배열이 변결될 때 서로간의 값은 바뀌지 않는다.
- 얕은 복사(Shallow copy):
- primitive type의 변수:
얕은 복사로도 문제 없이 진행된다. - reference type(객체, 배열 등)의 변수:
깊은 복사를 사용해야지만 객체의 실제 데이터를 복사할 수 있다.
1. 얕은 복사(Shallow Copy)
- 정의: 주소값이 복사되는 것을 말한다.
- 장점
- 같은 객체를 공유하므로 메모리를 절약하고, 빠르다.
(참조에 의한 호출(Call By Reference)에서 얕은 복사가 이루어 지는 이유 중 하나)
- 같은 객체를 공유하므로 메모리를 절약하고, 빠르다.
- 단점
- 두 개 이상의 객체가 같은 대상을 가르키고 있기 때문에,
의도치 않게 여러 개의 객체가 동시에 수정될 수 있다.
- 두 개 이상의 객체가 같은 대상을 가르키고 있기 때문에,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int[] a = {1, 2, 3, 4};
int[] b = a;
System.out.println(Arrays.toString(a)); // [1, 2, 3, 4]
System.out.println(Arrays.toString(b)); // [1, 2, 3, 4]
// 원본 배열 값 변경
a[1] = 10;
System.out.println(Arrays.toString(a)); // [1, 10, 3, 4]
System.out.println(Arrays.toString(b)); // [1, 10, 3, 4]
// 복사한 배열 값 변경
b[3] = 1111;
System.out.println(Arrays.toString(a)); // [1, 10, 3, 1111]
System.out.println(Arrays.toString(b)); // [1, 10, 3, 1111]
얕은 복사에서는 =연산자를 사용해 해당 변수에 담겨있는 값을 복사한다. 배열의 경우 해당 변수에 heap의 데이터를 가리키는 참조값이 저장되어있기 때문에 참조값이 복사되어 같은 원본 배열을 가리키게 되는 것이다.
2. 깊은 복사(Deep Copy)
- 정의: 새로운 메모리 공간에 값(Value)을 복사하는 것이다.
- 장점
- 여러 객체가 동시에 수정되는 일이 발생하지 않아, 변경에는 안전하다.
- 단점
- 객체 생성 비용이 비싸며, 메모리를 많이 점유한다.
- 특정 객체를 깊은 복사하는 경우 Clonable 인터페이스를 활용하여,
clone()메소드를 Overring 해주어야 깊은 복사가 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int[] a = {1, 2, 3, 4};
int[] b = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = a[i];
}
System.out.println(Arrays.toString(a)); // [1, 2, 3, 4]
System.out.println(Arrays.toString(b)); // [1, 2, 3, 4]
// 원본 배열 값 변경
a[1] = 10;
System.out.println(Arrays.toString(a)); // [1, 10, 3, 4]
System.out.println(Arrays.toString(b)); // [1, 2, 3, 4]
// 복사한 배열 값 변경
b[3] = 1111;
System.out.println(Arrays.toString(a)); // [1, 10, 3, 4]
System.out.println(Arrays.toString(b)); // [1, 2, 3, 1111]
이렇게 for문을 이용해 복사를 하는 방법도 있지만 java에서 지원하는 다양한 메소드(method)들을 활용하면 더 편하게 깊은 복사를 할 수 있다.
(참고링크)
공부한 내용을 여러글과 책 읽은 내용을 바탕으로 정리하고 있습니다.
좋은 글로 저의 공부에 도움을 주시는 분들께 감사드립니다.