[JavaScript] 얕은복사 vs 깊은복사 feat. 참조복사

2024. 11. 8. 20:04·Front end/JavaScript

참조복사

객체의 참조 복사는 같은 메모리 주소를 복사한다. 즉, 원본 데이터를 참조복사한 다른 객체의 값이 바뀌게 된다면 원본에 문제가 생길 가능성이 매우 높다. 

let message = '문자 값은 프리미티브 데이터 타입으로 값이 복사됩니다.';
let messenger = {
  name: 'kakao talk',
  manufacture: 'kakao',
};

let text = message;
let conversationTool = messenger;

// 비교 (복사 vs. 참조)
console.log(message == text);
console.log(message === text);
console.log(messenger == conversationTool);
console.log(messenger === conversationTool);

 

위와 같은 방식으로 복사하게 된다면 데이터의 무결성이 침해된다. 그렇다면 메모리 주소가 다른 변수에 해당 내용을 복사해서 옮기면 이런 문제가 생기지 않을까?

얕은 복사

이렇게 저장되는 메모리 주소가 다르면 다른 변수에서 값이 변한다고 하더라도 원본은 침해되지 않는다. 얕은 복사를 하는 방법은 다양하다.

1. for문을 사용한 복사

const cloneObject = {};

for (let i in messenger) {
  cloneObject[i] = messenger[i];
}

2. Object.assign()을 이용한 복사 

const copyObject = Object.assign({}, messenger);

3. 전개 연산자 (...)를 사용한 복사

const spreadObject = { ...messenger };

 

 

위와 같은 방법으로 얕은 복사를 할 수 있다. 하지만 깊이가 2 이상인 객체의 경우 또 다시 참조되는 문제가 발생한다. 이를 해결하기 위해 깊은 복사를 사용한다. 

 

깊은복사

깊은 복사를 구현하기 위해서는 재귀 또는 다양한 라이브러리를 사용할 수 있다.

 

1. 재귀를 통한 깊은 복사

function cloneDeep(object) {
  return Object.fromEntries(
    Object.entries(object).map(([key, value]) => {
      let type = typeof value;
      if (value && type === 'object') {
        value = cloneDeep(value);
      }
      return [key, value];
    })
  );
}

 

2. Lodash 라이브러리 활용

_.cloneDeep(value)

 

반응형
저작자표시 (새창열림)

'Front end > JavaScript' 카테고리의 다른 글

[JavaScript] 음악 스펙트럼 플레이어 만들기  (12) 2024.11.10
[JavaScript] 가비지 컬렉션  (1) 2024.11.09
[JavaScript] 구조분해 할당  (0) 2024.11.07
[JavaScript] for in과 for of  (1) 2024.11.05
포켓몬 MBTI Test 만들기  (0) 2023.05.12
'Front end/JavaScript' 카테고리의 다른 글
  • [JavaScript] 음악 스펙트럼 플레이어 만들기
  • [JavaScript] 가비지 컬렉션
  • [JavaScript] 구조분해 할당
  • [JavaScript] for in과 for of
re-hwi
re-hwi
재휘의 개발일기
    반응형
  • re-hwi
    Dvelopment blog
    re-hwi
  • 전체
    오늘
    어제
    • 재휘의 개발일기 (168)
      • 개발 (1)
        • 소프트웨어 공학 (25)
      • Python (18)
        • numpy (8)
      • OS (23)
        • 쉽게 배우는 운영체제 (23)
      • Front end (1)
        • HTML (6)
        • CSS (9)
        • JavaScript (18)
        • React (2)
        • Vue.js (5)
        • TypeScript (5)
        • Sass (3)
      • Algorithm (1)
        • 파이썬 알고리즘 인터뷰 (2)
        • 자료구조와 함께 배우는 알고리즘 (20)
      • Android (2)
        • 안드로이드 앱 프로그래밍 with 코틀린 (2)
      • Project (15)
      • Network (0)
      • etc (12)
        • 이것저것 (10)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    pwa
    HTML
    sass
    REACT
    프론트엔드
    표
    typeScript
    자료흐름도
    연결리스트
    티스토리챌린지
    numpy
    TS
    알고리즘
    vue
    FE
    리액트
    정보처리기사
    컴포넌트
    플레이리스트
    자료구조
    오블완
    파이썬
    JavaScript
    뷰
    scss
    CSS
    정처기
    개발
    타입스크립트
    js
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
re-hwi
[JavaScript] 얕은복사 vs 깊은복사 feat. 참조복사
상단으로

티스토리툴바