Notice
Recent Posts
Recent Comments
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

HYEWON JUNG의 개발일지

데이터 타입 > 얕은 복사 , 깊은 복사 본문

JavaScript

데이터 타입 > 얕은 복사 , 깊은 복사

혜won 2023. 10. 27. 10:36

<데이터 타입의 분리>

데이터 타입 기본형 Number
String
Boolean
Null
undefined
symbol
참조형 > Object Array
Function
Date
RegExp
Map/WeakMap
set / WeakSet

<메모리의 기준>

변수 vs 상수 

변수 = 변수영역에서 메모리 변경 가능

상수 = 변수영역에서 메모리 변경 불가능

 

가변하다 vs 부변하다

가변하다 = 데이터 영역에서 메모리 변경 가능

불변하다 = 데이터 영역에서 메모리 변경 불가능

 

<가변 불변 /복제방식>

기본형

변수 영역 1002 1003 1004 1005 1006
빈칸을 찾아가기 origin / 4001>4002 print/4002 > 4003  
데이터 영역 4001 4002 4003 4004 4005
test real second    

불변 Ex)

let origin = test ;

origin = real;

↑↑ 기본형의 불변성을 볼 수 있다.

=>  origin에 새로운 값을 주었지만 데이터 영역의 test가 변하지 않고 real이 추가되었다. 

=> 데이터 영역이 변하지 않았으므로 불변성.

 

복제 Ex)

let print = origin ; 

print = second

기본형 복제

=> 값이 담김 주소값을 바로 복제 

=> 나중에 print 값에 다른 것을 할당해줘도 문제 없다.

 

변수 영역 1002 1003 1004 1005
obj/7014~ print/7014~    
데이터영역 4103 4104 4105 4106
15 20 25 30
데이터영역(obj) 7014 7015 7016 7017
a/4103 > 8104 b/4104 > 4106    
데이터 영역(a) 8104 8105 8106 8107
c /4103 d /4105    

참조형

가변 Ex)

let obj = {a : 15, b : 20}

obj.a = {c : 15, d : 25} ;

↑↑ 참조형의 가변성을 볼 수 있다. 

=> 데이터영역 obj가 변경되었다. 가변성

=>  중첨된 객체가 배열일 경우 데이터 영역에 인덱스로 표기

 

복제 Ex)

let print = obj ;

print.b = 30;

참조형 복사

=> 복사된 print의 b값으로 변경하면 원래의 obj의 b값도 변경된다. 

=> 하지만 print의 prop를 참조형으로 바꾼다면  괜찮지만 중첩된 객체를 변경하게 되면 동일하게 변경된다.

 

참조형 복사 방법 1.  ↑ 위 방법

let user = {name : "hyewon", age : 24};

let nameChange = function(user, newName){  // (user, newName) = input
	return{name : newName, age : user.age}  //output
};

let user2 = changeName(user, "hyeTwo")

if(user.name !== user2.name){console.log("change")} // change

=> 이름을 변경하는 함수 정의 / 아예 새로운 객체를 반환

input = 변경대상의 객체, 변경하고자 하는 것

output = 새로운 객체를 형성할 것

 

=> 객체가 중첩되어 있을 경우 복사본과 같아짐

=> 그리고 객체의 prop가 많을 경우 다 작성해야한다는 단점

 

참조형 복사방법 2. 반복문 만들기// 얕은 복사

let copyObject = function(target){
	let result ={};
    
    for(let prop in target){
    	result[prop] = target[prop]
    }
    return result;
}

사용해보기
let user ={name : "hyewon", age : 24};

let user2= copyObject(user);
user2.name="hyeTwo";

//user.name !== user2.name //true

=> 하지만 1번 방법에서 객체가 많아졌을 때 다 작성해야하는 단점만 해결

=> for in문을 이용해 객체의 모든 prop에 접근가능.

 

참조형 복사방법 3. 깊은 복사

let copyObjectDeep = function(target){
	let result = {};
    
    if(typeOf target ==='object' && target !== null){
    	for(let prop in taget){
        result[prop] = copyObjectDeep(target[prop])
        }
    }else{
    	return target;
    }
    return result;
}

재귀적으로 수행

=> 객체의 속성의 속성으로 계속 수행한다.