얕은복사(Shallow Copy) , 깊은 복사(Deep Copy)

2024. 1. 21. 17:37· Javascript
목차
  1. 자바스크립트에서의 데이터 타입
  2. 원시 타입(Primitive types) 
  3. 참조 타입(Reference Types)
  4. 얕은 복사와 깊은 복사의 필요성
  5. 얕은 복사(Shallow Copy)
  6. 깊은 복사(Deep Copy)

자바스크립트에서의 데이터 타입

자바스크립트에서는 기본적으로 두 가지 유형의 데이터 타입을 가지고 있습니다. 

원시 타입(Primitive types) 

원시 타입은 자바스크립트에서 가장 기본적인 데이터 타입입니다. 해당 타입에서 이들은 불변(immutable)하며, 메모리에 직접 저장되고 복사됩니다.

// 숫자(Number)
let num1 = 100;
let num2 = num1; // 값에 의한 복사

// num1을 변경해도 num2에 영향을 주지 않음
num1 = 200;
console.log(num1); // 200
console.log(num2); // 100 (변경되지 않음)

참조 타입(Reference Types)

참조 타입은 메모리 상의 객체를 가리키는 참조에 의해 변수에 저장되고 복사됩니다. 따라서 , 한변수를 다른 변수에 할당하면 객체의 참조가 복사됩니다. 이로 인해 두 변수가 동일한 객체를 가리키게 되어, 한 객체의 변경이 다른 객체에도 영향을 줄 수 있습니다.

// obj 객체
let obj = {
	a: 1,
    b: 2,
    c: 3
};

let newObj = obj;

newObj.a = 100; // a에 값 100을 재할당 합니다.

console.log(obj.a); // 100
console.log(newObj.a); // 100
// 두 객체는 동일한 주소를 참조하기 때문에 a값이 바뀌게 되고 반환하는 a의 값이 둘다 변경됩니다.

 

이처럼 원시 타입에는 숫자나 문자열, boolean, undefined,null, Symbol 과 같은 간단한 데이터입니다. 반면에 참조 타입은 객체(Object), 배열(Array), 함수(Function)와 같은 복잡한 데이터 구조를 가지고 있습니다.

 

얕은 복사와 깊은 복사의 필요성

원시 타입은 값에 의한 복사(Value Copy)를 통해 변수에 저장되고 복사됩니다. 이는 각 변수가 독립적인 값을 가지며, 하나를 변경해도 다른 하나에 영향을 주지 않습니다.

참조 타입은 메모리 상의 객체를 가리키는 참조에 의해 변수에 저장되고 복사됩니다. 따라서, 한 변수를 다른 변수에 할당하면 객체의 참조가 복사됩니다. 이로 인해 두 변수가 동일한 객체를 가리키게 되어, 한 객체의 변경이 다른 객체에도 영향을 줄 수 있습니다.

 

얕은 복사(Shallow Copy)

얕은 복사는 객체의 최상위 레벨만 복사합니다. 이는 중첩된 객체나 배열은 복사되지 않고, 원본과 복사본이 이 중첩된 객체에 대한 참조를 공유하는 것을 의미하고 있습니다.

// 얕은 복사 예시
let original = {
    a: 1,
    b: { c: 2, d: 3 }
};

// Object.assign을 사용한 얕은 복사
let shallowCopy = Object.assign({}, original);

// 원본 객체의 최상위 속성을 변경
original.a = 10;

// 원본 객체의 중첩된 객체를 변경
original.b.c = 20;

console.log("Original:", original); // { a: 10, b: { c: 20, d: 3 } }
console.log("Shallow Copy:", shallowCopy); // { a: 1, b: { c: 20, d: 3 } }

이 예시를 보면 original 객체의 a 속성을 변경했을 때 shallowCopy에 영향을 주지 않습니다. 하지만 b.c 속성을 변경하면 shallowCopy에서도 영향을 받습니다. 이는 b 가 중첩된 객체이기 때문입니다.

깊은 복사(Deep Copy)

깊은 복사는 객체의 모든 수준을 재귀적으로 복사하여 완전히 독립된 복사본을 만듭니다. 중첩된 객체나 배열도 새롭게 복사됩니다.

이러한 깊은 복사는 객체의 완전한 독립성을 보장하기 위해 주로 사용되고 있습니다. 이는 중첩된 구조를 가진 객체를 다룰 때 중요하며, 객체의 한 부분이 다른 부분에 영향을 주지 않도록 하기 위해 사용됩니다.

// 깊은 복사 예시
let original = {
    a: 1,
    b: { c: 2, d: 3 }
};

// JSON 방법을 사용한 깊은 복사
let deepCopy = JSON.parse(JSON.stringify(original));

// 원본 객체의 최상위 속성을 변경
original.a = 10;

// 원본 객체의 중첩된 객체를 변경
original.b.c = 20;

console.log("Original:", original); // { a: 10, b: { c: 20, d: 3 } }
console.log("Deep Copy:", deepCopy); // { a: 1, b: { c: 2, d: 3 } }

 

이 예시를 보면 original 객체의 어떤 부분을 변경해도 deepCopy 에서는 아무런 영향이 없습니다. 이는 깊은 복사가 객체의 모든 수준의 데이터를 복사하기 때문입니다.

 

하지만 위의 JSON.parse(JSON.stringify()) 를 사용한 깊은 복사는 편리하지만 함수나 undefined, Symbol, 순환 참조 등 에서 올바르게 복사되지 않기에 이점을 참고해서 코드를 작성해야합니다.

'Javascript' 카테고리의 다른 글

Javascript의 이벤트 루프: 비동기 작업 이해하기  (1) 2024.02.04
Javascript에서의 이벤트 캡쳐링, 버블링 및 이벤트 위임 이해하기  (0) 2024.01.28
var, let, const 를 중복 선언 허용, 스코프, 호이스팅 관점에서 알아보기  (0) 2024.01.21
  1. 자바스크립트에서의 데이터 타입
  2. 원시 타입(Primitive types) 
  3. 참조 타입(Reference Types)
  4. 얕은 복사와 깊은 복사의 필요성
  5. 얕은 복사(Shallow Copy)
  6. 깊은 복사(Deep Copy)
'Javascript' 카테고리의 다른 글
  • Javascript의 이벤트 루프: 비동기 작업 이해하기
  • Javascript에서의 이벤트 캡쳐링, 버블링 및 이벤트 위임 이해하기
  • var, let, const 를 중복 선언 허용, 스코프, 호이스팅 관점에서 알아보기
trophy98
trophy98
새내기 프론트엔드 개발자의 걸음마 때기
trophy98
TrophyJourney
trophy98
전체
오늘
어제
  • 분류 전체보기 (31)
    • Javascript (4)
    • React (3)
    • 회고록 (1)
    • JS 알고리즘 문제풀이 (5)
    • 자유게시판 (0)
    • 우아한테크코스 (5)
    • 코드잇 스프린트 (1)
    • HTML (1)
    • CSS (2)
    • GIT (2)
    • CS,NetWork (2)
    • Nextjs (2)
    • 프로젝트 (2)
    • 인프라 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • GIT
  • 취업까지달린다
  • 우아한테크코스
  • javascript
  • css
  • 코드잇
  • 스프린트프론트엔드4기
  • 웹 어셈블리
  • os 설정
  • 중복선언
  • keyprop
  • 코드잇 스프린트 4기
  • CSR
  • SSR
  • 프론트엔드
  • 코드잇스프린트
  • 자바스크립트 알고리즘
  • next.js
  • 프로그래머스
  • 우테코
  • js 알고리즘
  • 자바스크립트
  • 자바스크립트 자료구조
  • SSG
  • 금융프로젝트
  • 이미지 컴포넌트
  • 우테코 6기
  • 우아한테크코스 6기
  • React
  • Image component

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
trophy98
얕은복사(Shallow Copy) , 깊은 복사(Deep Copy)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.