흔히 우리가 아는 int, long, double 등 primitive type인 데이터들의 경우 메소드 호출이 끝나면 사라지는 stack 영역에 생성되기 때문에 깊은 복사가 이루어 집니다.
하지만 reference type의 경우 메모리 즉, heap 영역에 저장됨으로 주소값이 복사되어 얕은 복사가 이루어 지죠.
- 여기에는 String의 특성이 숨어있기 때문입니다.
String이 다른 reference type들과 다르게 깊은 복사처럼 동작하는 이유는
String객체를 가지고 있는 참조변수를 통해 String객체의 문자열값을 바꾸게 된다면 기존의 주소 즉, String클래스는 그대로 두고 새로운 String클래스 주소를 만들어 대채하는 특성을 가지고 있기 때문에 깊은 복사처럼 동작하는 것입니다.
이와 같은 String의 특성은 빠른 코드 효율성을 다투는 코딩테스트에서 String 대신 StringBuilder를 사용하게하는 이유이기도 합니다.
예를 들어 만약 배열의 문자들을 문자열로 합쳐야 하는 문제가 있다면 String 클래스는 문자열이 새로 합쳐질 때마다 새롭게 생성되어 OOM(Out-Of-Memory)을 야기하기 때문입니다.