기본 콘텐츠로 건너뛰기

라벨이 참조인 게시물 표시

자바 객체 복사에서 얕은 복사와 깊은 복사는 무엇이 다를까

자바 객체 복사에서 얕은 복사와 깊은 복사는 무엇이 다를까 빠른 답 얕은 복사는 바깥 객체는 새로 만들지만, 내부의 다른 객체 참조는 원본과 공유할 수 있다. 깊은 복사는 복사 대상이 가진 가변 객체까지 새로 만들어, 한쪽 변경이 다른 쪽에 퍼지지 않게 한다. String 같은 불변 객체는 참조를 공유해도 상태 변경 문제가 거의 없지만, List , Author 같은 가변 객체는 결과가 달라질 수 있다. 복사 방식은 객체가 수정되는지, 어디까지 소유권을 분리해야 하는지, 복사 비용을 감당할 수 있는지에 따라 달라진다. 목차 한눈에 비교 왜 복사했는데 원본도 같이 바뀔까 예제로 확인하기 출력 결과로 참조 공유 확인하기 불변 객체와 가변 객체를 구분해야 하는 이유 컬렉션과 중첩 객체에서 생기는 함정 복사 정책을 코드 밖에서도 드러내기 복사 방식을 고를 때 보는 조건 한눈에 비교 복사 범위 얕은 복사는 보통 바깥 객체만 새로 만들고, 깊은 복사는 내부의 가변 객체까지 새로 만든다. 참조 공유 얕은 복사는 내부 참조를 원본과 공유할 수 있고, 깊은 복사는 필요한 참조 공유를 끊는다. 변경 영향 얕은 복사에서는 공유된 내부 객체를 바꾸면 원본과 복사본 모두에서 바뀐 상태가 보일 수 있다. 비용 깊은 복사는 더 많은 객체를 만들기 때문에 메모리 사용량과 실행 비용이 커질 수 있다. 사용 기준 읽기 전용 데이터나 불변 객체 중심이면 얕은 복사도 충분할 수 있고, 복사본이 독립적으로 수정되어야 하면 깊은 복사를 고려한다. 흔한 오해 new Book(...) 을 호출했다고 해서 Book 안의 모든 객체까지 자동으로 복제되는 것은 아니다. 왜 복사했는데 원본도 같이 바뀔까 자바에서 객체 변수에는 객체 자체가 들어 있지 않고, 객체를 가리키는 참조가 들어 있다. Book book2 = book1; 처럼 대입하면 Book 객체가 새로 만들어지는 것이 아니라 두 변수가 같은 객체를 바라본다. 얕은 복사는 단순 대입과는 다르다. 얕은 복사에서는 바깥 객체를 ...