A 코드스테이츠/FE부트캠프

원시자료형과 참조자료형

DEV_29 2022. 7. 11. 11:13
원시자료형 참조자료형
string, number, boolea, undefined, null & bigint, symbol 배열( [] ), 객체( {} ), 함수( function(){} )
데이터 보관함 한 칸(=변수)에 하나의 데이터만 넣을 수 있음 변수에 데이터(데이터 보관함, heap)의 주소를 담는다.
값 자체에 대한 변경이 불가능하지만, 변수에 다른 데이터를 할당할 수는 있다. (const 키워드로 선언하면, 재할당 불가)  
고정된 데이터 공간을 사용 데이터 사이즈가 동적으로 변함 
보관되는 데이터의 양이 엄청날 수 있음. 
결론: 변수에는 원시값 혹은 주소만 지정할 수 있고,
원시자료형이 할당될 떄는 변수에 값 자체가 담기고 참조자료형이 할당될 때는 보관함의 주소가 담긴다
let score = 80;
function doStuff(value) {
  value = 90;
}

doStuff(score)

다음 코드가 실행된 후, score의 값은? 답: 80
let player = { score: 3 };
function doStuff(obj) { 
  obj.score = 2;
}

doStuff(player);

다음 코드가 실행된 후, player.score의 값은? 답: 2
<해설>
1. 함수 doStuff에 score의 값을 인자로 전달하여 실행
2. 매개변수 value에 score의 값 80이 전달되고, value=90에서 value에 90이 할당됨
3. 단 변수 score의 값 80은 값 자체를 복사하여 전달하기 때문에 함수에서 어떤 일이 발생했던가와 관련 없이 초기 할당된 값 80이 그대로 유지됨
<해설>
1. 함수에 변수 player을 인자로 전달하여 호출
2. 함수가 호출, 실행되면 매개변수 obj에 변수 player의 값이 할당
-> 변수 player의 값은 {score: 3}의 주소값
3. 함수로 들어가면 obj.score에 2를 할당하고, obj와 player은 같은 주소값을 가짐
4. player.score은 2가 됨
<내 생각/틀릴 수도 있음>


변수 score은 80이라는 고정된 값이 담긴 원시자료형이다.
함수 doStuff는 매개변수 value를 가지며, value에 90이라는 값을 할당한다. 
함수 doStuff에 전달인자를 score로 하여 호출하면, score의 값 80이 전달되지만, 값만 복사하여 전달되기 때문에 변수 score자체에는 영향이 없다. 
따라서 변수 score의 값은 변함없이 80이 된다.
<내 생각/틀릴 수도 있음>

변수 player는 객체로 참조자료형이다
함수에 변수 player를 넣어 호출하는 경우 그 주소값이 담긴다. 
함수 doStuff는 매개변수의 score값을 2로 할당하는데
변수 player를 전달인자로 받은 결과, 그 주소로 가서 score를 2로 바꾸어놓았다.
그 결과 player.score은 2가 된다.