+ 세 언어의 핵심 구현과 함정을 정확히 설명했다.
- 내용이 충실하지만 핵심 목적에 비해 조금 길다.
구현하려는 언어나 코드 맥락을 넣으면 얕은 복사와 깊은 복사의 차이, 여러 언어의 예시, 흔한 함정을 설명합니다.
| 분류 | 개발 › 코딩 |
|---|---|
| 태그 | 초안작성분석개발자코드 |
Act as a Programming Expert. You are highly skilled in software development, specializing in data structure manipulation and memory management. Your task is to instruct users on how to implement deep copy functionality in their code to ensure objects are duplicated without shared references. You will: - Explain the difference between shallow and deep copies. - Provide examples in popular programming languages like Python, Java, and JavaScript. - Highlight common pitfalls and how to avoid them. Rules: - Use clear and concise language. - Include code snippets for clarity.
객체 공유 참조를 피하는 딥 카피 구현을 배울 때 쓰는 프로그래밍 설명 역할이다. Python, Java, JavaScript 예시를 포함하라고 되어 있다.
ChatGPT가 정확성과 간결성의 균형이 가장 좋다. Gemini는 심화 내용이 좋지만 코드 오류가 있고, [C]는 답변이 없다.
+ 세 언어의 핵심 구현과 함정을 정확히 설명했다.
- 내용이 충실하지만 핵심 목적에 비해 조금 길다.
+ 순환 참조와 사용자 정의 복사까지 구체적으로 다뤘다.
- 파이썬 memo 등록 순서 탓에 순환 참조 처리가 틀렸다.
| 기준 | ChatGPT | Gemini | 앞선 모델 |
|---|---|---|---|
| 지시 준수 | 10 | 10 | 동점 |
| 정확성 | 10 | 7 | ChatGPT +43% |
| 구체성 | 10 | 10 | 동점 |
| 구성·가독성 | 10 | 9 | ChatGPT +11% |
| 분량 적정성 | 9 | 8 | ChatGPT +13% |
gpt-5.6-sol가 모델 이름을 가린 채 1~10점으로 채점했습니다 (2026-09-25). 측정값이 아니라 AI 심사 결과입니다.
같은 입력을 세 모델에 넣어 받은 답을 그대로 옮겼습니다. 각 CLI(에이전트 하네스)에서 실행했습니다. ChatGPT·Claude 앱이나 웹에서는 답이 다를 수 있습니다.
원본 ──> 내부 객체
복사본 ──> 같은 내부 객체 // 얕은 복사
원본 ──> 내부 객체 A
복사본 ──> 별도의 내부 객체 B // 깊은 복사
original = [[1, 2], [3, 4]]
copied = original.copy()
copied[0].append(5)
print(original) # [[1, 2, 5], [3, 4]]
내부 리스트가 공유되므로 원본도 변경됩니다.
import copy
original = [[1, 2], [3, 4]]
copied = copy.deepcopy(original)
copied[0].append(5)
print(original) # [[1, 2], [3, 4]]
print(copied) # [[1, 2, 5], [3, 4]]
copy.deepcopy()는 중첩된 리스트와 객체까지 복사합니다.
Java의 clone()은 기본적으로 얕은 복사이므로, 깊은 복사를 직접 구현하는 것이 안전합니다.
class Address {
String city;
Address(String city) {
this.city = city;
}
Address(Address other) {
this.city = other.city;
}
}
class Person {
String name;
Address address;
Person(String name, Address address) {
this.name = name;
this.address = address;
}
// 복사 생성자
Person(Person other) {
this.name = other.name;
this.address = new Address(other.address);
}
}
사용 예:
Person original = new Person(
"Kim",
new Address("Seoul")
);
Person copied = new Person(original);
copied.address.city = "Busan";
System.out.println(original.address.city); // Seoul
System.out.println(copied.address.city); // Busan
String, Integer처럼 불변(immutable) 객체는 참조를 공유해도 안전한 경우가 많습니다. 반면 List, 배열, 사용자 정의 가변 객체는 직접 복사해야 합니다.
List<String> copied = new ArrayList<>(originalList);
단, 리스트 내부에 또 다른 가변 객체가 있다면 해당 요소까지 별도로 복사해야 합니다.
const original = {
name: "Kim",
address: {
city: "Seoul"
}
};
const copied = { ...original };
copied.address.city = "Busan";
console.log(original.address.city); // Busan
스프레드 문법은 최상위 속성만 복사합니다.
structuredCloneconst original = {
name: "Kim",
address: {
city: "Seoul"
}
};
const copied = structuredClone(original);
copied.address.city = "Busan";
console.log(original.address.city); // Seoul
structuredClone()은 중첩 객체, 배열, 순환 참조 등을 처리할 수 있어 일반적으로 권장됩니다.
const copied = JSON.parse(JSON.stringify(original));
간단한 데이터에는 사용할 수 있지만 다음 값이 손실되거나 변형될 수 있습니다.
DateMap, SetundefinedSymbol따라서 가능하면 structuredClone()을 사용하는 것이 좋습니다.
중첩된 가변 객체를 확인하세요.
최상위 객체만 복사하면 내부 배열이나 객체는 공유될 수 있습니다.
불변 객체와 가변 객체를 구분하세요.
불변 객체는 공유해도 안전하지만, 가변 객체는 별도 복사가 필요합니다.
순환 참조를 고려하세요.
객체가 자기 자신을 참조하면 단순한 재귀 복사는 무한 루프를 일으킬 수 있습니다.
깊은 복사의 비용을 고려하세요.
객체가 크거나 복잡하면 메모리와 실행 시간이 많이 필요합니다.
복사 대상에서 제외할 값을 확인하세요.
파일 핸들, 데이터베이스 연결, 네트워크 소켓 같은 리소스는 단순 복사로 정상적으로 복제되지 않습니다.
핵심은 복사 후 내부 객체를 변경했을 때 원본이 영향을 받는지 확인하는 것입니다. 영향을 받지 않아야 한다면 깊은 복사가 필요합니다.
| 방산 CV 12개월 로드맵 프롬프트 | |
| 2046 퍼즐 게임 제작 프롬프트 | |
| React 컴포넌트 통합 프롬프트 | |
| 3D 아바타 팩토리 요구 프롬프트 | |
| 3D FPS 게임 개발 프롬프트 |