SO데이터가 든 List를 복사해서 사용할려고 하다보니 얇은 복사와 깊은복사에대해 알게되었다.
얕은 복사(Shallow Copy)
- 정의: “컨테이너(예: List, 배열 등)만 새로 복제”하고, 그 안에 든 각 요소(객체) 자체는 그대로 공유하는 복사 방식입니다.
- 특징
- 리스트만 분리되어 서로 다른 인스턴스로 존재
- 리스트의 요소들은 모두 같은 객체(참조) 를 가리킴
- 요소(객체)의 필드를 수정하면, 복사본·원본 리스트 모두에 영향
- C# 예시
// originalArtifacts: 원본 List<ArtifactData>
var shallowCopy = new List<ArtifactData>(originalArtifacts);
// 둘은 다른 리스트지만…
Debug.Log(Object.ReferenceEquals(shallowCopy, originalArtifacts)); // False
// 요소는 같은 인스턴스를 가리킨다
Debug.Log(Object.ReferenceEquals(shallowCopy[0], originalArtifacts[0])); // True
깊은 복사(Deep Copy)
- 정의: “컨테이너 뿐 아니라, 그 안의 각 요소(객체)도 전부 새로 복제”하는 방식입니다.
- 특징
- 컨테이너와 요소 모두 별도의 인스턴스 → 완전 분리
- 복제본에서 객체 필드를 바꿔도 원본 SO 에 전혀 영향 없음
- 비용(메모리·시간) 면에서 얕은 복사보다 더 무거움
- Unity C# 예시
// SO인 ArtifactData를 Instantiate로 복제
var deepCopy = originalArtifacts
.Select(data => UnityEngine.Object.Instantiate(data))
.ToList();
// 이제 요소들끼리는 전혀 다른 인스턴스
Debug.Log(Object.ReferenceEquals(deepCopy[0], originalArtifacts[0])); // False
구분 얕은 복사 (Shallow Copy) 깊은 복사 (Deep Copy)
복제 대상 | 컨테이너(List, 배열 등) | 컨테이너 + 그 안의 각 요소(객체) |
요소 참조 | 원본과 동일한 인스턴스(참조 공유) | 완전히 새로운 인스턴스 |
수정 영향 | 객체 필드 수정 시 원본에도 반영 | 복제본만 변경, 원본은 안전 |
성능/메모리 | 가볍게 복사(참조만 복사) | 무겁게 복사(객체 생성 × 요소 수) |
사용 시기 | “컨테이너만 분리하고, 객체는 변경하지 않을 때” | “객체 자체도 분리해서 완전한 독립본이 필요할 때” |
언제 어떤 복사를 쓸까?
- 얕은 복사: 리스트에서 추가·제거만 하고, 요소 내부 데이터(필드)를 절대 수정하지 않을 경우.
- 깊은 복사: 복제본에서 요소 필드를 수정하거나, 런타임마다 원본 에셋을 절대 건드리고 싶지 않을 때
'개발 TIL' 카테고리의 다른 글
내일배움캠프TIL 76일차 정리 (0) | 2025.05.19 |
---|---|
내일배움캠프TIL 75일차 정리 (0) | 2025.05.16 |
내일배움캠프TIL 73일차 정리 (0) | 2025.05.14 |
내일배움캠프TIL 72일차 정리 (0) | 2025.05.13 |
내일배움캠프TIL 71일차 정리 (0) | 2025.05.12 |