깊은 복사와 얕은 복사를 공부하려면 immutable과 mutable에 대해 정확히 알고 있어야 한다.
mutable : 변할 수 있는
immutable : 변할 수 없는
1. 얕은 복사는 스택 메모리의 주소값을 복사 시킨다. mutable 객체일 경우 실제 데이터는 Heap영역에 저장된다.
그래서 스택영역의 메모리를 복사하는 얕은 복사일 경우에는 원본 데이터가 바뀌기 때문에 주의가 필요하다.
2. 깊은 복사는 힙 메모리의 데이터 까지 복사하기 때문에 Collection 프레임워크에 해당하는 구현체를 복사할 경우에 사용하면 좋다.
mutable 객체는 배열, 리스트, 딕셔너리 ( 맵 ), 객체 등 다양한 종류가 있고, 스택에 힙 메모리의 주소가 저장되며 힙 메모리에 실제 데이터가 저장된다.
immutable 객체는 불변 객체, 스택 영역에 실제 데이터가 저장되고 primitive 타입에 해당하는 변수가 저장된다.
정수 1, 2, 3 이 있다고 하면
int a = 1;
int b = 2:
a == b // true 결과가 나오게 되는데, 이는 a와 b가 동일한 메모리 주소를 가지고 있기 때문이다.
하지만 String은 primitive 타입 객체가 아니다. .char을 엮어서 만든 객체이다.
a == b를 하고 메모리 주소를 찍어보면 동일한 값이 나오는 것을 볼 수 있다.
이 이유는 String pool에 대해 알고 있어야 한다.
일반 Cat을 할당하면 같은 String pool에 할당되어 똑같은 메모리 주소를 가르키지만, new String()을 통한 객체 선언 시 다른 String pool이 만들어지면서 메모리 주소가 바뀐다.
'프로그래밍언어' 카테고리의 다른 글
CPU L1, L2 캐시와 자바 volatile (0) | 2023.02.18 |
---|---|
자바의 Object Class (0) | 2023.02.10 |
JIT 컴파일러 (0) | 2022.12.26 |
비동기, 동기 통신과 call back (0) | 2022.10.03 |
call by reference, call by value (0) | 2022.10.03 |