데이터 타입

minho·2021년 10월 9일
0

기본형과 참조형

기본형

Number, String, Boolean, null, undefined등 데이터를 직접적으로 배당해준다.

참조형

객체형으로 Array, Function, RegExp등 데이터를 간접적으로 배당해준다.

  • 여기서 직접적인배당과 간접적인 배당은 무엇일까??
    이를 알기위해서는 데이터가 어떻게 할당되는지에 대한 원리를 알아야 한다.


그림과 같이 기본형데이터는 정적할당이며, 참조형 데이터는 동적할당이다.

정적 할당


위의 사진과 같이 a를 선언하면 어떤일이 일어날까?
1. var a;를 하면 주소들 중에 한개(1003)에 이름"a"가 할당된다.
2. a = 'abc'라는 값을 넣으면 다른 주소(5004)에 'abc'가 저장된다.

  • 그럼 주소 1003에 값은 뭘로 표시될까?


    사진과 같이 'abc'의 값이 저장되어있는 주소 5004를 가리키게 된다.

  • 그렇다면 a = 'abcdef'로 바꾸면 어떨까?


    새로운 주소값(5005)을 할당하게 되며 1003의 값은 'abcdef'를 가리키는 5005를 가리키게 된다.

동적 할당

  • 그렇다면 객체는 데이터를 어떻게 할당할까?

첫번째로 obj라는 이름을 데이터에 할당한다. 여기까지는 기본데이터와 같다.
그러나 obj는 여러값을 넣어야 하기때문에 충분한 데이터 할당공간을 확보해야한다. 그래서 7100대에 공간을 할당한다.
그런다음 a를 선언하면 7100번대에 데이터가 할당된다. 그리고 a에 값을 1을 넣어주면 a에대한 값은 5000번대에 할당된다.
그결과 7103에 있는 a의 값은 5003을 가리키게 된다.

이러한 식으로 b가 할당되는 과정도 같다.

  • 그렇다면 obj에 있는 a의 값을 바꾸면 어떻게 될까?


    2의 값은 새로운 주소에 할당하고 a가 있는 주소의 값은 2를 가리키는 5005를 가리키게 된다.

  • 참조형 데이터에 또 참조형 데이터를 넣으면 어떻게 되나?


    arr는 참조형 데이터인 배열로 선언하였으므로 충분한 데이터 할당공간(8100~)을 확보한다.
    그런다음 배열 0부터 값을 할당한다.
    이때 값이 기존데이터가 있으면 그 주소를 쓴다.
    예를들어 x: 3으로 값을 정해두고 3이 어떤주소(5003)에 저장되어 있는경우에 arr[0]에 3을 할당하고 싶으면 값에 5003번 주소를 넣는다.

왜 참조형 데이터에는 데이터를 직접 할당하지 않는걸까?

만약에 x=3으로 정해놓은 상태에서 arr[0]을 3으로 지정한다면, 컴퓨터는 3이 있는지 없는지 찾는다.

그러나 만약 3이 아닌 긴 문자열로 되어 있는경우라면?!?

그림과 같이 이렇게 긴 문자열이면 데이터 할당에 많은 문자가 들어간다.
문제는 if(x===arr[0]) 을 확인하는 경우에 컴퓨터는 저 많은 문자들을 하나하나 확인해야한다. -> 효율성이 떨어진다.

비록 처음 할당하는데 다른주소를 써야해서 비효율적일수는 있지만 위와 같이 비교시에는 주소만 확인하면 되므로 확인하기가 쉬워진다.

변수 복사

  • 위와같이 a = 10 이라 선언하고 b = a라고 선언하면 어떻게 될까?
    a는 10의 주소인 5002를 값의 주소로 정해놓고 b의 값은 a라고 했으니 결국, b도 5002를 값의 주소로 갖는다.

  • 그렇다면 객체를 복사하면 어떻게 될까?

  1. obj1에 객체를 할당하므로 5003에 7100~의 여유로운 공간을 할당한다.
    1-1. 그후에 7103에 이름 c를 할당하고 값으로 10을 할당하는데 10이라는 값은 이미 5002에 있으므로 c의 값은 5002을 향한다.
    1-2. 마찬가지로 7104에 이름 d를 할당하고 값으로 'ddd'를 넣는다.
    c와 다르게 d의 값인 'ddd'는 없으므로 5004에 'ddd'값을 할당한다.

  1. obj2 = obj1이라 정의하므로 obj2의 값은 obj1의 값의 주소인 5003을 향한다.

여기서 b =15, obj2.c =20으로 바꾸면 어떻게 될까?

  • b =15
    b가 a의 값인 5002를 향하고 있었지만 15로 바꾸므로 새로운 저장소(5004)에 15를 할당한다.
    그러므로 b의 값은 5004를 향한다.

  • obj2.c = 20
    obj2s.c 는 7103에 있다. 이는 obj1.c도 마찬가지이다.
    **즉, obj2s.c의 값을 20이 할당되어 있는 5005로 바꾸면 obj1.c의 값도 20으로 바뀌게 된다!!!!

결론

기본형 데이터의 복사와 변환은 원래의 데이터에 영향을 끼치지 않지만, 객체형 데이터의 복사와 변환은 원래의 데이터에 영향을 끼친다.

profile
Live the way you think

0개의 댓글