참조 복사 vs 얕은 복사 vs 깊은 복사

SeungHyun·2024년 4월 10일

etc

목록 보기
4/9
post-thumbnail

참조 복사(reference copy)

  • 정의: 한 변수가 가리키는 객체의 메모리 주소를 다른 변수에도 할당하는 것
  • 객체를 새로 생성하지 않음
  • 여러 변수들이 하나의 객체를 공유
  • 최상위 레벨 객체부터 내부 객체까지 전부 같은 메모리 주소를 공유함
    • 그렇기에 하나를 바꾸면 다른 하나도 값이 바뀜

  • 두 변수는 같은 메모리 주소를 공유함

  • 둘 중 하나의 내부 객체를 바꾸었더니 나머지 하나도 똑같이 변경됨


얕은 복사(shallow copy)

  • 정의: 객체의 최상위 레벨만 복사하는 것 (내부 객체는 복사 같은 메모리 주소를 참조함)
  • 새로운 객체가 생성됨
  • 두 변수가 각각의 객체를 갖음
  • 단, 최상위 레벨 객체만 생성될뿐 내부 객체까지 전부 같은 메모리 주소를 공유함
    • 내부 객체를 수정하면 원본도 수정됨

  • 최상위 객체는 서로 다르지만 내부 객체는 같은 주소를 참조
  • 최상위 객체는 서로 다른 주소를 참조하기 때문에 하나를 바꿔도 다른 하나는 변경되지 않음

  • 단, 내부 객체는 여전히 같은 주소를 참조하기 때문에 내부 객체를 수정할 경우 원본도 함께 변경됨


깊은 복사(deep copy)

  • 정의: 최상위 레벨 객체와 그 객체가 포함하고 있는 내부 객체까지 모두 새롭게 복사하는 것
  • 새로운 객체(내부 객체 포함) 새로 생성됨
  • 두 변수가 각각의 객체를 갖음
    • 내부객체도 함께 새로운 객체로 생성됨

  • 최상위 레벨 객체와 내부 객체 모두 서로 다른 주소를 가르킴
  • 그렇기 때문에 내부 객체를 수정하여도 다른 변수에서는 변경되지 않음


참조 복사 vs 얕은 복사 vs 깊은 복사

복사 종류최상위 객체 주소내부 객체 주소
참조 복사같은 주소같은 주소
얕은 복사다른 주소같은 주소
깊은 복사다른 주소다른 주소

장/단점 비교

참조 복사

  • 장점
    • 객체를 새로 생성하지 않기 때문에 메모리 사용량이 적고 처리 속도가 빠름
  • 단점
    • 원본 객체가 변경되면 모든 참조가 전부 변경됨

얕은 복사

  • 장점
    • 최상위 객체만 복사하기 때문에 참조 복사보다는 느리지만
      깊은 복사보다는 빠름
    • 메모리 사용량 또한 중간
  • 단점
    • 내부 객체들은 원본을 참조하기 때문에 변경시 원본도 변경됨

깊은 복사

  • 장점
    • 원본 객체와 복사본이 완전한 독립임
  • 단점
    • 최상위 레벨 객체와 내부 객체를 완전히 새로 생성하기 때문에 메모리 사용량이 상대적으로 크고 처리 속도가 오래 걸림
    • 순환 참조가 있는 객체를 깊은 복사할 경우 무한 루프에 빠질 수 있음
      (단, copy.deepcopy()를 사용하면 방지할 수 있으나 여전히 주의가 필요함)
profile
어디로 가야하오

0개의 댓글