자바스크립트로 프로그래밍 입문 5. 비트(Bit), 바이트(Byte) 그리고 자료형(Data Type)

비트(Bit)와 바이트(Byte)

앞서 컴퓨터의 연산장치는 2진수 체계로 연산한다고 설명했었습니다. 이때 2진수의 0 혹은 1 하나의 수를 비트(Bit)라고 하고 8개의 비트를 모은 것, 즉 8자리의 2진값을 바이트(Byte)라고 합니다.

컴퓨터는 바이트를 최소 단위로 하여 2진수를 처리(전송, 연산, 저장 및 호출)합니다.

예를 들어 숫자 3은 2진수로 나타내면 11, 즉 2자리 수(2비트)이지만 실제로 컴퓨터 내에서는 최소 1바이트, 즉 8자리 2진값 00000011로 간주됩니다.

다양한 자료(데이터)의 표현

1바이트에는 0부터 255(00000000부터 11111111)까지 2의 8승 개의 값을 저장할 수 있습니다. 255보다 큰 수를 저장하고 싶다면? 바이트의 수를 늘리면 됩니다. 2바이트는 16비트이므로 2의 16승 개의, 즉 0부터 65,535까지의 수를 나타낼 수 있습니다.

음수는 어떻게 나타낼까요? 음수는 2의 보수로 표현합니다. 2의 보수는 조금 어려울 수도 있는데, 반드시 이해하거나 기억해야 하는 부분은 아닙니다. 그냥 이러한 방법이 있구나 정도로만 보고 넘어가도 됩니다.

2의 보수를 구하는 방법은 각 비트의 0을 1로, 1을 0으로 바꾼 후 1을 더해주면 됩니다.

예를들어 00000001의 2의 보수를 구하는 방법은 아래와 같습니다.

1) 0을 1로, 1을 0으로 바꿈.. : 11111110
2) 1을 더해줌............... : 11111111

이런 이상한 방식으로 표현하는 이유는 컴퓨터가 연산을 쉽게 하기 위해서입니다. 이 방식으로 음수를 표현하면 음수와 음수, 혹은 음수와 양수 간의 덧셈뺄셈을 간편하게 할 수 있습니다.

(-1) + (-1) 은 11111111(8비트) + 11111111(8비트) 으로 표현할 수 있고 이것을 그냥 2진수로 간주하여 값을 더하면 111111110(9비트)가 됩니다. 한자리가 늘어났죠. 현재 1바이트(8비트)를 기준으로 연산을 하고 있으므로 이 늘어난 가장 앞자리 비트를 무시해버리면 11111110(8비트)가 되고 이 값은 -2를 나타내는 값이 됩니다.

이 방식을 사용하면 첫번째 자리의 값은 양수인 경우 언제나 0, 음수인 경우 언제나 1이 되는 특징이 있습니다.

문자의 경우 문자와 숫자 사이 변환 값을 약속해 놓고 문자를 수로써 저장하고 읽어옵니다. ASCII(아스키) 테이블을 예로 들어 살펴봅시다.

ASCII 테이블은 0부터 127까지 수를 사용해 영문 대소문자와 문장부호, 몇몇 특수 문자를 가지고 있습니다.


a를 ASCII로 저장하면 위 테이블에 따라 숫자 97에 해당하는 1바이트 2진수 01100001가 저장됩니다. 위 테이블에 없는 문자나 기호(한글및 외래어나 특수문자)를 저장하려면 ASCII가 아닌 다른 방식을 통해서 문자를 2진수로 변경하여 저장할 수 있습니다. 대표적으로 Unicode 방식이 있죠.

지금까지 우리는 양수, 음수 그리고 문자를 컴퓨터가 어떻게 2진법으로 표현하는 지를 배웠는데요, 컴퓨터는 01100001이 ASCII로 a를 나타내는지 숫자 97을 나타내는지, 11111111이 양수 127을 나타내는지 음수 -1을 나타내는지, 0000001 0000001이 2바이트로 저장된 257인지 아니면 1바이트로 저장된 1과 또다른 1을 나타내는지 어떻게 구별 할 수 있을까요?

이를 알려 주는 것이 자료형입니다.

자료형

자료형(Data Type 혹은 Type)이란 컴퓨터에 저장된 2진수를 어떻게 해석해야 하는지를 나타내는 방법입니다. 자료형보다는 타입이라는 말로 더많이 씁니다.

예를들어 다음과 같은 가상의 4바이트 메모리가 있습니다. 0이나 1을 32개까지 담을 수 있습니다.

0....... 1....... 2....... 3.......
00000000 00000000 00000000 00000000

첫번째 줄은 메모리의 바이트위치를 알아보기 쉽게 임의로 표시한 것이고, 2번째줄의 0들이 실제 메모리 상의 값들입니다.

이 메모리에 'abcd'라는 데이터를 ASCII타입으로 기록해 봅시다. 2진수로 97, 98, 99, 100가 각 바이트에 기록됩니다.

0....... 1....... 2....... 3.......
01100001 01100010 01100011 01100100

메모리가 이미 꽉차버렸습니다. 근데 위 메모리를 보면.. ASCII를 기록했다는 표시가 어디에도 없죠. 이처럼 메모리에는 데이터의 형식을 기록하지 않습니다. 이 말은 컴퓨터가 이 데이터를 읽어올 때 해당 데이터를 알맞게 해석해야 한다는 뜻입니다.

이를 위해 프로그래밍 언어에는 자료형이 존재하고 각 자료형은 바이트의 길이가 지정되어 있습니다. C언어의 char 타입(character의 약어로 char를 사용)과 'int' 타입(integer의 약어로 int)을 예로 들면, char는 1바이트, int는 4바이트로 길이가 정해져 있습니다. 그러므로 위 예제 메모리에서 0번위치의 데이터를 char 타입으로 읽어오면 1바이트만 읽어와서 'a'가 되고, int 타입으로 읽어오면 4바이트를 모두 읽어와서 1633837924가 됩니다.

프로그램은 타입을 사용해서 메모리의 값을 해석합니다.

C언어의 경우 숫자를 저장할 때 int 타입 외에도 작은 숫자를 저장하는 short 타입(2바이트), int보다 큰 숫자를 저장하는 long 타입(8바이트) 등 다양한 타입이 존재하는 반면, 자바스크립트에는 숫자를 저장할 때 number 타입(8바이트) 하나밖에 없는데요, 이처럼 언어에 따라 자료형은 차이가 있습니다.

프로그래밍에서는 문자와 숫자 이외에도 불리언(boolean), 배열, 객체(object)등등의 타입이 있지만 나머지는 차차 알아가도록 하고 이 강의에서는 자료형의 왜 필요한지만 알아두시면 되겠습니다.


** 여기서부터는 사족으로 왜 C언어는 다양한 숫자 타입들이 존재하지만 자바스크립트는 숫자 타입이 하나밖에 없는지 알아봅시다.

C언어는 컴퓨터 성능이 좋지 않은 시절에 개발된 언어라 작은 숫자는 적은 바이트를 차지하는 타입에 담고, 큰 숫자들은 많은 바이트를 차지하는 타입에 담아 컴퓨터 자원의 효율을 높혔습니다. 대신 여러가지 타입이 사용되므로 프로그래머가 신경써야 하는 부분이 많습니다.

하지만 자바스크립트에서는, C언어가 처음 나온 시절에 비해 컴퓨터 성능이 많이 향상되어 1바이트든 8 바이트든 크게 신경을 쓰지 않게 되었습니다. 1024바이트 -> 1메가바이트, 1024메가바이트 -> 1기가바이트이므로, 64기가바이트 램을 장착하고 있다고 가정하면 여기서 1바이트는 1/68,719,476,736에 해당하고 이는 0.0000000000145%에 해당합니다. 한프로그램에서 만약 8바이트 숫자대신 2바이트 숫자를 사용할 수 있는 부분이 만개가 있다고 하면 64기가바이트 램에서 0.000000873%를 절약할 수 있죠. 램이 1기가만 되도 절약되는 부분은 고작 0.0000558%입니다. 이처럼 0.001%도 안되는 자원(램/CPU/저장공간)을 절약하기 위해 개발자를 복잡하게 하는 것 보다, 이후에 나온 언어들은 프로그래머의 편의를 고려한 것이지요.

이는 자료형에 국한된 이야이가 아니라, 많은 부분에서 초기의 언어들 보다 나중에 나온 언어들이 성능보다는 프로그래머의 편의에 중점을 두고 있습니다.

댓글

K
Kim Yong Ki 2020.03.22
그동안 책에 나온 걸 이해하려다보니 암기수준의 이해 밖에 되지 않았는데 이글 자체로 제대로 이해가 되버렸네요 ㅎㅎ
I
Ian H 2020.03.22
@Kim Yong Ki,
사실 '데이터에 맞는, 알맞은 자료형을 사용해야한다'는 것만 알고 넘어가도 프로그래밍을 하는데는 문제가 없죠.
근데 개인적으로 위와같이 자세하게 아는 것에 흥미가 있다면 프로그래밍에 적성이 있다고 생각합니다!
댓글쓰기

이 글에 댓글을 다시려면 SNS 계정으로 로그인하세요. 자세히 알아보기

UP