개발 R.I.P.

5.28 Dev.Feedback(원시 자료형, 참조자료형)

편행 2021. 5. 28. 20:04
반응형

원시 자료형

number, boolean, null, undefined, string, symbol

이 여섯 유형을 원시 타입 데이터라고 부른다.

변수 a 를 선언했을 때, stack이라는 사물함에 a라는 이름이 붙고, 거기에 할당한 값이 저장된다.

a의 값을 찾을 때 사물함 a를 열어 그 안에 들어있는 1이라는 값을 꺼내서 가져온다.

특징으로는 데이터가 '하나'의 정보를 담고 있다는 것!

 

POINT**

원시 타입 데이터는 데이터를 복사해도 기존의 데이터에 영향을 미치지 않는다!

let a = 1;
let b = 2;
b = 2;
console.log(a) = 1;

즉 이미 a라는 이름을 가진 사물함 내부에는 1이라는 숫자가 할당이 되어 저장되어 있기때문에

a에 b를 할당하고, b에 2를 할당한다고 해서 a의 값이 2로 변경이 되지 않는다는 것이다.

참조자료형

array, object, function

이 세가지 유형을 참조 타입 데이터라고 부른다.

heap이라는 빈 공간을 만들어 변수 a 라는 이름을 가진 사물함에 주소를 저장한다.

a의 값을 찾을 때 heap에 저장되어 있는 주소에서 가져오게 되는데

그 말인 즉 원소를 빼거나 넣어도 그 주소지 내부에서 변화가 생기고, 찾아온다는 것이다.

 

POINT**

참조 자료형 데이터는 주소를 복사한 것이기에 데이터를 변경하게 되면 주소 안의 데이터가 변경이 되어

기존의 데이터에 영향을 준다.

 

let e = [10,20];
let f = e;
f[0] = 50;
console.log(e) = [50,20];

즉 e라는 이름을 가진 사물함 내부에 주소 값이 들어갔기에 데이터 값 그 자체가 유지되는 것이 아니다.

그렇기에 데이터를 변경하게 되면 그 주소 내부에 저장되어 있는 데이터 자체가 변하게 되는 것이고,

다시 불러왔을 때, 변경된 주소 내부에 저장되어 있는 데이터를 가져오게 되어 변경된 값이 나오게 되는 것이다.

 

원시 자료형, 참조 자료형 응용

//문제 1 //

let arr = [2,3,4,5];
let newArr = arr;
newArr[2] = 25;
newArr = undefined;

arr의 값은?


//문제 2 //

let x = { sleep: alive }
let y = x;
y= 2;

x.sleep의 값은??

 

먼저 문제 1의 값은 [2,3,25,5]이다. newArr에 arr를 할당해주었을 때,

주소값이 저장이 되므로 newArr[2]에 25를 할당하면

[2, 3, 25, 5]로 데이터가 변경이 된다.

하지만 마지막에 newArr에 undefined 데이터를 저장해 줌으로 인해

arr 주소에 접근을 할 수 없게 된다.

그리하여 arr가 undefined가 되는 것이 아니라, 기존에 변경된 데이터 [2, 3, 25, 5]가 되는 것이다.

원시 자료형을 덮어 씌우면 그 저장되는 데이터 자체가 우선이 되는 것으로 보인다.

 

문제 2를 살펴봐도 알 수 있다.

y에 2라는 데이터가 저장이 되어버려 x라는 주소에 접근할 수 없게 됐고, 따로 x의 데이터 값이 변경이 되지 않고

alive가 나오게 된다.

 

반응형

'개발 R.I.P.' 카테고리의 다른 글

5.31 Dev.Feedback(Spread 문법, Rest 문법)  (0) 2021.05.31
5.29 Dev.Feedback(Deep Copy, Shallow Copy)  (0) 2021.05.29
5/27 Dev.Feedback(CSS)  (0) 2021.05.27
5.26 Dev.Feedback(객체)  (0) 2021.05.26
5.25 Dev.Feedback(배열)  (0) 2021.05.25