본문 바로가기
JS

얕은 복사 vs 깊은 복사

by 개발자doc 2024. 4. 29.
목차
1. 얕은 복사
2. 깊은 복사
3. 뭐가 더 좋을까?
1. 얕은 복사
  • 하나의 데이터에 대한 주소를 다른 변수가 공유하는 형태

참조타입의 데이터를 다룰 때 변수에 할당된 데이터의 주소를 통해 값을 가져오거나 변경을 한다. 그런데 때에 따라 같은 값의 데이터를 다룰때 또 다른 변수를 하나 생성하여 같은 주소를 할당하는 것이 얕은 복사다. 주로 단순 데이터 전달데이터 전달하는 것과 같이 원본이 수정되더라도 상관없을 때 사용된다.

예제를 통해 얕은 복사를 확인해보자.

const arr1 = [1,2,3];
const arr2 = arr1;

console.log(arr1); //1,2,3
console.log(arr2); //1,2,3

arr2.push(4);

console.log(arr1); //1,2,3,4
console.log(arr2); //1,2,3,4

arr1이라는 배열 하나를 생성하고 arr2를 생성하여 배열을 할당했다. 그 후 arr2에 값을 하나 추가했는데 arr1은 1,2,3을 갖고 arr2는 1,2,3,4를 갖고 있을 것 같지만 arr2는 arr1의 배열 데이터의 주소를 공유하고 있으므로 두개의 변수는 1,2,3,4를 갖는 배열의 출력한다.

2. 깊은 복사
  • 새로운 메모리 공간에 같은 데이터를 할당하는 형태

깊은 복사는 다른 값을 복사하지만 새로운 메모리 공간을 받아 그 메모리 주소를 통해 값을 할당한다. 따라서 실제로는 값만 같지 주소가 달라 서로 다르다고 할 수 있다. 상태를 관리하거나 객체의 데이터가 자주 바뀌는 경우 사용하는 것이 좋다.

예제를 통해 깊은 복사를 확인해보자.

 const arr1 = [1, 2, 3];
 const arr2 = JSON.parse(JSON.stringify(arr));
 
 console.log(arr1)//1,2,3
 console.log(arr2)//1,2,3

 arr2.push(4)
 
 console.log(arr1)//1,2,3
 console.log(arr2)//1,2,3,4

arr2를 선언할 때 JSON을 통해 문자열로 변환했다가 객체로 만드는 방식으로 새로운 메모리에 복사하는 방법을 사용하여 arr2에 새로운 값을 추가해도 arr1은 변하지 않는다. 이 외에도 깊은 복사를 가능하게 하는 여러 메소드가 있기때무네 그러한 방법들을 사용해도 된다.

3. 뭐가 더 좋을까?

사실 무엇이 더 좋고 안좋은 건 없다. 얕은 복사는 원본 데이터가 훼손되면 돌이키지 못한다는 단점이 있지만 메모리를 추가적으로 사용하지않는다. 하지만 깊은 복사는 원본 데이터가 유지되어 신뢰성은 높을 수 있지만 메모리 공간이 추가적으로 필요하기 때문에 메모리 관리 부분에서는 효율적이지 못할 수 있다.

따라서 경우에 따라 구분하여 사용하는 것이 좋다.

'JS' 카테고리의 다른 글

메모이제이션  (0) 2024.05.01
객체에 관해  (0) 2024.04.30
구조 분해 할당  (0) 2024.04.28
HTML요소를 동적으로 다룬다고? DOM  (0) 2024.04.27
원시타입vs참조타입  (0) 2024.04.26