코어 자바스크립트 01.데이터 타입(데이터 타입의 종류, 변수 선언과 데이터 할당)

주히 🌼·2021년 2월 19일
0

※ 코어 자바스크립트책을 공부하며 정리하는 글입니다.

1. 데이터 타입

🎯 목표
ㅁ 기본형 타입과 참조형 타입이 서로 다르게 동작하는 이유 이해하기

1-1. 데이터 타입의 종류

자바 스크립트에서 데이터 타입에는 크게 두 가지가 있다.
기본형참조형 이다.

  • 기본형 : 숫자(number), 문자열(string), 불리언(boolean), null, undefined, 심볼(symbol)
  • 참조형 : 객체(object)

❔ 기본형과 참조형을 구분하는 기준은 무엇일까?
기본형은 값이 담긴 주솟값을 복제한다는 점
참조형은 값이 담긴 주솟값들로 이루어진 묶을을 가르키는 주솟값을 복제한다는 점

기본형과 참조형을 구분하는데 중복되어서 사용되는 용어는 주소값인데, 주소값이란 도대체 무엇일까?

1-2. 데이터 타입에 관한 배경지식

1-2-1. 메모리와 데이터

컴퓨터는 모든 데이터를 0과 1로 바꿔 기억하는데, 0 또는 1만 표현할 수 있는 하나의 메모리 조각을 비트(bit)라고 한다.
메모리는 매우 많은 비트들로 구성되어 있는데, 각 비트는 고유한 식별자를 통해 위치를 확인할 수 있다.
그러나 0과 1만 표현할 수 있는 비트 단위로 위치를 확인하는 것은 매우 비 효율적으로, 여러 비트를 묶어 한 단위로 표현하려고 하니, 표현할 수 있는 데이터 개수는 늘어남과 동시에 낭비되는 비트가 생기기도 하였다.
그래서 표현 가능한 개수에 어느 정도 제약이 따르더라도 크게 문제가 되지 않을 적정한 공간을 묶는 편이 낫다는 결과가 도출되었고, 8개의 비트로 구성되어있는 바이트(byte)라는 개념이 생겼다.
바이트 역시 시작하는 비트의 식별자로 위치를 파악할 수 있는데, 모든 데이터는 바이트 단위의 식별자, 즉 메모리 주솟값을 통해 서로 구분하고 연결할 수 있다.

❔ 식별자

어떤 데이터를 식별하는데 사용하는 이름(=변수명)을 말한다.

🚨 변수 vs 식별자

가끔 변수와 식별자를 혼용하는 경우가 있다.

  • 변수(変数)는 말 그대로 변할 수 있는 수로, 컴퓨터 용어로는 변할 수 있는 데이터를 말한다.

1-3. 변수 선언과 데이터 할당

1-3-1. 변수 선언

변수 선언의 동작원리를 알아보자.

위의 코드는 "변할 수 있는 데이터를 만드는데, 이 데이터의 식별자는 a로 한다" 와도 같다.
즉, 변수란 변경 가능한 데이터가 담길 수 있는 공간 이라고 볼 수 있다.

변수가 선언되면 컴퓨터는 메모리에서 비어있는 공간을 확보하고 공간의 이름(식별자)을 a라고 지정하고, 이후에 사용자가 a에 접근하고자 하면 컴퓨터는 메모리에서 a라는 이름을 가진 주소를 검색해 해당 공간에 담긴 데이터를 반환한다.

1-3-2. 데이터 할당

데이터 할당의 동작원리를 알아보자.

이렇게 변수가 선언되고 데이터가 할당된다면,

비어있는 값에 'abc'가 저장될 것 같지만, 실제로는 그렇지 않다.
데이터를 저장하기 위한 별도의 메모리 공간에 문자열 'abc'를 저장하고, 그 주소를 변수 영역에 저장하는 식으로 이뤄진다.

즉, 아래와 같이 할당된다.

순서는 아래와 같다.

① 변수 영역에서 빈 공간(@102)를 확보
② 확보한 공간의 식별자를 a로 지정
③ 데이터 영역의 빈 공간(@504)에 문자열 'abc' 저장
④ 변수 영역에서 a라는 식별자 검색
⑤ 앞어 저장한 문자열의 주소(@504)를 @102의 값에 대입

❔ 왜 직접 대입하지 않을까?

데이터 변환을 자유롭게 할 수 있게 함과 동시에 메모리를 더욱 효율적으로 관리하기 위함인데,
문자열 같은 경우 특별히 정해진 규격이 없기 때문에 필요한 메모리 용량이 가변적이다.
만약 미리 확보한 공간 내에서만 데이터 변환을 할 수 있다면 확보된 공간을 변환된 데이터 크기에 맞게 늘리는 작업이 필요할 것이고, 메모리의 마지막에 있으면 모를까, 중간에 있다면 해당 공간보다 뒤에 저장된 데이터를 모두 뒤로 옮기고, 이동시킨 데이터의 메모리 주소를 다시 연결해야하는 작업이 필요하다.
그러면 컴퓨터가 처리해야할 연산이 많아지므로, 효율적으로 문자열 데이터의 반환을 처리하려면 변수와 데이터를 별도의 공간에 나누어 저장해야한다.

🚨 만약 문자열의 값이 변동될 때에는, 무조건 새로 만들어 데이터 영역의 별도의 공간에 저장하고 그 주소를 변수 공간에 연결한다.

만약, 100개의 변수에 같은 숫자를 할당한다고 할 때, 숫자형은 8바이트가 필요하니까 총 800(100*8)바이트가 필요하다.
그러나 숫자를 하나의 별도의 공간에 저장하고 해당 주소를 입력하게 된다면, 100(변수갯수)*주소공간크기+8 바이트 만큼만 이용하면 된다.

이처럼 변수 영역과 데이터 영역을 분리하면 중복된 데이터에 대한 처리 효율이 높아진다.

profile
하면 된다! 프론트앤드 공부 중 입니당 🙆‍♀️

0개의 댓글