데이터 타입 of 자스

자바스크립트가 제공하는 데이터 타입은 7가지이며
요놈들은 크게 원시 타입 객체 타입으로 구분할 수 있다.

  • number (원시)
  • string (원시)
  • boolean (원시)
  • null (원시)
  • undefined (원시)
  • symbol (원시)
  • object (왕따 객체)

*잼있는 사실, BigInt 추가돼서 하나 더 있음 (원시)


크게 두가지

데이터 타입을 크게 원시와 객체로 구분할 수 있다.

이 둘은 여러 차이점들이 있으나 가장 핵심이라 생각하는 건
원시 타입의 값은 변경 불가능한 값, 객체 타입의 값은 변경 가능한 값 이라는 것이다.

뭐라노 변경 가능한뎅

let a = '문자열';

a = '변경 가능한데요 문자열';

이건 재할당이다!
변수 값이 변경되는 거랑 변수가 참조하는 메모리 값이 변경되는 거를 헷갈려할 수 있는데

자바스크립트에서 변수가 어떻게 메모리와 짝짝쿵하는지
동작 방식만 알면 만병통치이다.


변수에 값이 할당되는 방식

예시 코드를 보고 원시 타입과 객체 타입의 변수 값이 할당되는 과정을 알아보자.

원시 값

변수의 값을 수정할 수 있도록 let 키워드로 name 변수를 선언하고
'김태경'이라는 값으로 초기화 시켰다.

let name = '김태경';

name = '김김김';

여기서 중요한 점

  • 자바스크립트는 변수 선언 후 자동으로 undefined로 초기화됨.
  • 변수에 새로운 값을 재할당하면 재할당된 값의 메모리 주소와 재할당 전 값의 메모리 주소는 다르다.

그리고 과정을 더 상세하게 보면

  1. name 변수에 undefined를 할당한다.
  2. name 변수에 '김태경'이라는 값을 재할당한다. (undefined와 다른 메모리 주소)
  3. name 변수에 '김김김'이라는 값을 재할당한다. ('김태경'과 다른 메모리 주소)

이렇게 원시 값은 재할당이 일어날 때 마다 새로운 메모리 공간에 값이 할당되기 때문에
메모리에 남아있는 이전 값이 변하지 않는다 라고 할 수 있는 것이다!

이러한 원시 값의 특성을 보고 불변성을 가진다라고 하며 이는 데이터의 신뢰성을 보장한다.

*아무도 참조하지 않는 메모리의 이전 값들은 자바스크립트 가비지 컬렉터가 알아서 잘 처리해주니까 걱정 놉..

객체 값

자바스크립트는 객체기반의 프로그래밍 언어이며
자바스크립트를 구성하는 원시 값을 제외한 나머지는 모두 객체이다.

즉, 자바스크립트에서 객체는 졸라 중요한 놈이니까 제대로 알자!

객체 리터럴을 사용하여 person 변수에 name, age 프로퍼티와 eat 메서드를 가진 객체를 할당했다.

const person = { 
  name: 'kim tk', // 프로퍼티
  age: 19, // 프로퍼티
  eat: function () { // 메서드
  	console.log('먹방');
  }  
};
  • 객체 리터럴(표현식)이란 클래스 기반 객체지향 언어에는 없는 { } 중괄호를 사용하는 자바스크립트의 객체 생성 방법 중 하나이다.

  • 자바스크립트의 함수는 일급객체이므로 값으로 사용할 수 있기 때문에 프로퍼티 값으로 할당할 수 있다. 이때 일반 함수와 구분하기 위해 메서드라 부른다.

그래서 원시 값이랑 뭐가 다른겨?

person 객체에서 name 프로퍼티 값을 재할당하고 gender를 동적으로 생성했다.

person.name = 'kim kim kim'; // 프로퍼티 값 재할당
person.gender = 'male'; // 프로퍼티 동적 생성

만약, 객체도 원시 타입처럼 변하지 않는 값이라면 재할당이 일어났을 때
참조하는 메모리의 주소가 바뀌고 이전의 메모리의 값은 변경되지 않고 남아있을 것이다.

그러나, 여전히 객체가 참조하는 메모리의 주소는 같은데..?
메모리의 값도 변경이 된 것을 확인할 수 있다.

위와 같이 객체는 원시 값과는 다르게 속성의 값을 재할당한다고 새로운 메모리가 할당되지 않는다. 그렇기 때문에 객체의 값은 변경이 가능하다고 할 수 있다!


근데 둘은 왜 다른걸까...

객체도 원시 값처럼 재할당할 때 마다 복사해서 새로운 메모리를 할당해주면 데이터의 신뢰성을 확보할 수 있겠지만, 객체의 크기는 매우 커질 수도 있고 일정하지도 않기 때문에 결국 복사 비용이 커져 메모리의 효율적 소비가 어려울 수 있다.

따라서, 메모리의 효율적 사용과 복사 비용을 절감하기 위해 어느정도의 구조적인 단점을 감안한 설계라고 생각할 수 있을 것 같다!

*예를 들어 객체는 여러개의 식별자가 하나의 객체를 공유할 수 있다는 구조적인 단점이 있다.


평소 immutable, mutable 이라는 말이 나왔을 때 먼말인가 했는데
지금이라도 확실하게 알아서 다행이당

0개의 댓글