백엔드 개발을 하다 보면, 한 객체를 복사해서 사용해야 하는 상황이 자주 발생합니다. 그런데 복사한 객체를 수정했더니 원본이 바뀌는 상황이 많이 발생하게 되는데. 이 문제는 대부분 얕은 복사와 깊은 복사를 혼동해서 생깁니다. 이번 글에서는 이 두 가지 복사 방식의 개념과 차이를 쉽게 설명해보겠습니다.
얕은 복사란
얕은 복사는 객체를 복사할 때, 내부 객체의 주소값(참조값)만 복사하는 방식입니다. 즉, 겉보기에는 새로운 객체지만, 내부에 포함된 객체는 원본과 같은 것을 공유하고 있습니다.
public Book shallowCopy() {
return new Book(this.name, this.author); // author는 복사 안 하고 공유함
}
Original: Author = 조슈아 블로크
Shallow Copy에서 Author 이름 수정 → Original Author도 같이 바뀜
얕은 복사를 한 객체를 수정을 하면 원본 객체의 필드도 수정되게 되는데, 이는 같은 인스턴스를 참조하고 있기 때문입니다.
깊은 복사란
깊은 복사는 객체를 복사할 때, 내부에 포함된 객체들까지 새로 만들어 완전히 분리된 복사본을 생성하는 방식
public Book deepCopy() {
Author copiedAuthor = new Author(this.author.getName()); // 새 객체 생성
return new Book(this.name, copiedAuthor);
}
Original: Author = 마틴 파울러
Deep Copy에서 Author 이름 수정 → Original Author는 그대로 유지됨
수정 시에는 Author 객체를 새로 만들었기 때문에 서로 독립적이기에 원본 객체는 수정되지 않습니다.
| 내부 객체 | 공유됨 (같은 참조) | 새로 생성됨 (별도 참조) |
| 복사 속도 | 빠름 | 느릴 수 있음 |
| 데이터 독립성 | 없음 (변경 시 원본도 영향 받음) | 있음 (완전히 독립된 복사본 생성됨) |
DTO, Entity 변환 시 불변 객체를 만들거나, 복사 후 별도로 다루어야 할 때는 깊은 복사가 안정적입니다. 반대로, 데이터 복사가 많고 성능이 중요하다면 얕은 복사가 유리할 수도 있습니다.
컬렉션을 포함한 복사에서는 clone(), copy constructor, ObjectMapper, Serialization 등을 활용한 깊은 복사 도구도 고려할 수 있습니다.
'CS' 카테고리의 다른 글
| 외부 서비스 장애에 대비하는 백엔드 설계 전략 (0) | 2025.05.08 |
|---|---|
| 자바에서의 동일성과 동등성, 그리고 원시형과 객체형의 차이 (0) | 2025.05.08 |
| 트랜잭션 고립수준 (1) | 2025.05.07 |
| 프록시와 리버스 프록시, 그리고 자바 스프링에서의 프록시 활용 정리 (0) | 2025.04.17 |
| 스프링 빈 생명주기(Bean LifeCycle)가 무엇인가요? (0) | 2025.04.14 |