본문 바로가기

JS

JavaScript| 변수(primitive) 타입과 object의 차이점

변수 : 데이터를 담는 곳

- 자세한 정보를 담고있는 이름이 좋다.

 

 

변수를 선언하면 그 변수를 위한 공간이 생긴다. 그 공간안에는 데이터가 담겨있다.

 

 

 

여기서, number2의 변수 데이터 값을 변경하면 

number2만 변경이 된다. number에 있는 값만 복사해서 붙여넣은거라

number에는 영향이 가지 않는다.

 

 

 

object

오브젝트는 number, string, boolean, null, undefined를 제외한 모든 것이다.

오브젝트란? 최소한 한 두 가지의 다양한 데이터를 한 곳에 묶어 놓은 것.

(배열, 리스트, 함수등 모두가 오브젝트다.)

오브젝트는 적어도 한 두 가지 이상의 큰 데이터가 들어있기 때문에

단순하게 변수를 선언해서 담아 놓을 수 없다.

 

 

오브젝트 안에 있는 name과 age의 key에도 각각 공간이 생겨

그 안에 각각에 해당되는 값이 들어가 있다.

그리고 그것을 묶어 123이라는 주소가 생기고,

그 주소를 obj처럼 원하는 이름으로 정의 할 수 있다.

 

 

 

이렇게 쓰면 obj안에 name이라는 key를 말하는것인데

name의 key 값은 ellie이기때문에

출력을 해보면 ellie가 출력이 된다.

 

 

오브젝트에서

let obj2 = obj ;은 변수와 조금 달라진다.

 

 

변수를 할당할때는 무조건 그 변수가 들어있는 값이 복사 되어서 들어온다.

그래서 obj의 주소를 obj2에 그대로 복사하게 되는데,

이때, 123의 값을 복사하는게 아니라 123이라는 주소자체를 복사해서

가져오는 것이라 123 값 자체를 수정하게 되면 

그것을 가리키고 있는 obj, obj2 모두 값이 수정된 것으로 출력된다.

 

 

 

때문에 obj의 name을 james로 바꾸면

obj, obj2의 name값이 모두 james로 출력되는 것이다.

 

 

 

여기에서 변수 선언을 하는 let과 const의 차이점이 있다.

 

 

let은 값을 변경할 수 있지만,

const는 값을 변경할 수 없다. (위 사진 처럼 에러가 뜸)

 

 

 

여기서 object의 경우 좀 헷갈릴 수 있다.

const는 값 변경이 불가능하다.

때문에 obj자체의 값을 위에 사진처럼 변경을 하면 에러가 난다.

 

하지만,

 

 

이렇게 obj가 가리키고 있는 key 값을 다른 것으로 

바꾸는 것은 가능하다.

 

왜냐하면 오브젝트는 오브젝트 자체가 담겨져 있는것이 아니라,

오브젝트는 따로 어딘가에 저장이 되어있고

그것을 가리키고 있는 레퍼런스가 들어있기때문에

레퍼런스 자체를 다른 오브젝트로 변경하는 것은 불가능 하지만,

레퍼런스가 가리키고 있는 오브젝트의 안에 내용은 변경이 가능하다.