본문 바로가기

객체와 메모리 , 얕은 복사과 깊은 복사 본문

필요 없어진 항목들/프로그래밍 기본

객체와 메모리 , 얕은 복사과 깊은 복사

jaegomhoji 2022. 2. 5. 01:30

** 변수는 객체의 메모리 주소를 저장하고 이를 이용해서 객체를 참조한다 

변수 <------객체의 메모리 주소 참조 ------> 객체 

 

** 주로 객체를 복사할 때 나타나는 현상

 

** 얕은 복사 : 기존 변수를 새롭게 선언한 다른 변수에 할당했을때, 새롭게 선언된 변수는 메모리에 직접 접근하는 것이 아닌,

기존 변수의 주소값만을 복사해오는 방식으로 접근한다. 따라서 기존 레퍼런스 변수를 수정해도 새로운 변수에서 똑같은 내용이 호출된다. 

** 객체 자체가 복사되는 것이 아니다!!

 

** 깊은 복사 : 객체 자체를 복사하는 것으로, 또 하나의 객체가 만들어진다. 새로운 주소의 메모리에 복사본을 생성하는 것. 

** 객체 자체가 기존 변수의 메모리 주소와는 다른 위치에 복사되는 것이다.

** 여러가지 방법이 있음, 우선은 (모듈 copy 를 이용한다. import copy )

* copy.copy(group1)을 통해서 group2는 group1을 깊은 복사한 상태. group 2의 string 속성만 'new'로 바꾼 상태.

* 이때 group2를 출력하면 바뀐 값 new가 출력되지만, group1에서는 원래 값 original이 출력된다. 다른 주소에 저장되었기 때문!

 

** 리스트에서 원본을 유지하고 깊은 복사를 시행하는 방법

* id()로 메모리 주소 확인 

* 얕은 복사를 시행한 상태에서는, 두 변수명이 같은 주소를 참조하고 있다는 사실을 확인 가능하다. 

 

* for문으로 각각의 아이템들을 list.append()로 새롭게 써주게 되면, 깊은 복사가 되는데, 서로 다른 주소를 참조하고 있는것 확인. 

 

* copy 모듈의 copy 함수로 손쉽게 깊은 복사 가능. 

변수명 = 리스트.copy(대상 리스트)

 

* 슬라이싱한 데이터를 새롭게 할당하는 것 역시 깊은 복사 

ex) 변수명 = 리스트[3:5]  

'필요 없어진 항목들 > 프로그래밍 기본' 카테고리의 다른 글

개체 속성 변경  (0) 2022.02.04
클래스와 객체 생성  (0) 2022.02.04
객체지향 프로그래밍  (0) 2022.02.04
Comments