개발 TIL

내일배움캠프TIL 74일차 정리

yun-wj1126 2025. 5. 15. 21:24

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, 배열 등) 컨테이너 + 그 안의 각 요소(객체)
요소 참조 원본과 동일한 인스턴스(참조 공유) 완전히 새로운 인스턴스
수정 영향 객체 필드 수정 시 원본에도 반영 복제본만 변경, 원본은 안전
성능/메모리 가볍게 복사(참조만 복사) 무겁게 복사(객체 생성 × 요소 수)
사용 시기 “컨테이너만 분리하고, 객체는 변경하지 않을 때” “객체 자체도 분리해서 완전한 독립본이 필요할 때”

언제 어떤 복사를 쓸까?

  • 얕은 복사: 리스트에서 추가·제거만 하고, 요소 내부 데이터(필드)를 절대 수정하지 않을 경우.
  • 깊은 복사: 복제본에서 요소 필드를 수정하거나, 런타임마다 원본 에셋을 절대 건드리고 싶지 않을