깊은 복사 와 얕은 복사

BackEnd_Ash.log·2020년 11월 28일
0

ComputerScience

목록 보기
2/8

https://wikidocs.net/16038

Pyhton

파이썬에서 객체를 비교할때 될때 두가지 방법이 있다.

value1 == value2
value1 is value2

두개는 다르다 .

value1 is value2

변수 value1 과 value2 가 참조하는 객체의 내용이 같은가 ?

value == value2

변수 value1 과 value2 가 참조하는 객체는 동일 객체인가??

라는 내용이다.

test1 = [1,2,3]
test2 = [1,2,3]

print(test1 is test2) # test1 과 test2 가 참조하는 객체는 같은 객체인가?
# False
print(test1 == test2) # test1 과 test2 가 참조하는 객체에 담긴 값은 같은가 ??
# True

얕은 복사

>>> a = [1,2,3]
>>> b = a[:]
>>> id(a)
4396179528
>>> id(b)
4393788808
>>> a == b
True
>>> a is b
False
>>> b[0] = 5
>>> a
[1, 2, 3]
>>> b
[5, 2, 3]

위 a , b 에서는 b 의 index 0 에 5라는 값을 넣기전까지는
a 와 b 의 값은 같다
하지만 둘의 참조하는 주소는 다르게 된다.

print(id(a)) , print(id(b)) 둘의 주소값은 다르다 .

깊은 복사

깊은 복사는 내부에 객체들까지 모두 새롭게 copy 됩니다.

import copy
a = [[1,2] , [3,4]]
b = copy.deepcopy(a)
a[1].append(5)
print(a) # [[1,2] , [3,4,5]]
print(b) # [[1,2] , [3,4]]

Javascript

자바스크립트도 마찬가지다 .
내용만을 복사하느냐 , 아니면 참조와 내용 모두 복사하느냐

얕은복사

const a = 100;
b = a;

b = 200

console.log(a); //100
console.log(b); //200
const obj = {
  a : 1 ,
  b : {
    c : 2 ,
  },
};

const copiedObj = {...obj}

copiedObj.b.c = 3 

obj === copiedObj // false
obj.b.c === copiedObj.b.c // true

깊은복사

깊은 복사는 객체의 요소 값 뿐만 아니라 참조하는 주소까지 모두 같은 복사를 의미한다.

lodash 라이브러리를 사용해야한다.


const obj = {
  a : 1 ,
  b : {
    c : 2 ,
  },
};

const copiedObj = _.cloneDeep(obj);
copiedObj.b.c = 3 
obj.b.c === copiedObj.b.c // false
profile
꾸준함이란 ... ?

0개의 댓글