반응형

 

모 대학교 에타 캡쳐본. 지금 이해 못 하더라도 걱정 마라! 10분 뒤 당신은 이 문장을 이해할 것이다!

 

 

오늘 낮 지인이 내게 보낸 한 사진이다. 이게 왜 이런지 설명해달라고 했다.

 

 

 

 

실제로 찾아보니 21억~~~~ 컴공에게는 많이 익숙한 숫자이지만 어디서부터 설명하랴....!

그래서 30분 정도 기나긴? 전화를 했고 드디어! 그분은 이해를 하셨다....! 그 위대한 여정을 지금부터 기록해보려 한다....!

여기서의 핵심 문장은 아래이다.

 

"변수32비트짜리 정수라서 그랬던거구나....!!!"

 

이 문장만 이해하면 완벽히 이해하리라!

 

독해의 핵심은 뭐다? 단어다! 이해를 위해 필요한 단어와 개념을 정리해보겠다.

 

문과무시 멈춰!

 

우리가 알아야 할 단어는 변수, 비트, 정수, 그리고 필요한 개념은 2진법, 컴퓨터가 숫자를 저장하는 방식이다.

 

지금부터 나름? 통했던 방식으로 설명해보겠다.

 

우리는 이해하기 가장 쉬운 정수부터 알아볼 것이다.

그리고 변수라는 단어를 알아본 다음

2진법이라는 개념을 알아볼 것이다.

그리고 비트라는 단어를 알아볼 것이고

마지막으로 컴퓨터가 숫자를 저장하는 방식을 알아볼 것이다. 이 모든 단어와 개념을 이해하면? 당신도 컴잘알 쌉파써블!

 

 

시간 없으니 바로 시작!

정수란?

 

 

네이버 표준국어대사전에 따르면 정수란

1. [수학] 자연수, 자연수의 음수 및 영을 통틀어 이르는 말. 즉 ……, -2, -1, 0, 1, 2, …… 따위의 수이다.

 

즉, 0에서 1씩 더하면 1, 2, 3, 4, 5....가 될 것이고 0에서 1씩 빼면 -1, -2, -3, -4, -5....가 될 것이다. 이 수들을 통틀어서 정수라고 한다. 벌써 하나 끝!!!! 이제 변수를 알아보자.

 

변수란?

여기서도 우리의 친구 네이버 표준국어대사전에 따르면 변수란

2. [수학] 어떤 관계나 범위 안에서 여러 가지 값으로 변할 수 있는 수.

 

흠... 이걸 바로 이해했고 컴퓨터에서 변수란 개념을 아시는 분들은 2진법으로 넘어가주시면 됩니다. 만약 이게 확 와닿지 않는다면? 조금만 더 읽읍시다. 몇 줄 안 되니까!

 

일단 변수변하는 수의 줄임말이다. 그리고 바구니라고 생각하면 된다.

 

마시께땅 ㅠㅠㅠㅠ

 

잉? 갑자기 무슨 바구니냐고? 저런 어려운 개념이 바구니일 리 없다고?! 아니다! 바구니 맞다! 우리는 이 바구니에 체리 대신 다른 것을 담을 것이다. 예컨대 숫자, 이름, 시간 등등!

 

 

그림을 보고 생각해보자.

 

1번 바구니에는 칼로리라는 이름을 붙이고 숫자를 담자. 내용물은 1537

2번 바구니에는 획득포인트라는 이름을 붙이고 숫자를 담자. 내용물은 2147203218

3번 바구니에는 현재시간이라는 이름을 붙이고 시간을 담자. 내용물은 13:30:50

4번 바구니에는 이름?이라는 이름을 붙이고 문자들을 담자. 내용물은 홍길동

 

우리는 어떤 바구니에는 꽃만 담고 어떤 바구니에는 식품만을 담고는 한다. 개발자들이 프로그램을 짤 때도 이런 식으로 꽃(숫자)만을 담을 바구니(변수)를 만들고 쓴다. 조금 전에 변수는 바구니라고 했다. 자. 다시 처음의 문장을 보자.

 

 

 

 

방금 썼던 방식으로 위 내용을 써보겠다.

 

2번 변수에는 포인트라는 이름을 붙이고 정수를 담자. 내용물은 21억

 

여기서 잠깐! 포인트라는 변수에는 정수를 담을 수 있다고 했다. 그러면 ..., -2, -1, 0, 1, 2, ... 등을 담을 수 있다는 말인가? 맞다! 그렇기 때문에 우리는 포인트라는 변수에 10포인트, 50포인트, 150만포인트, 21억포인트를 담을 수 있다!! 그리고 이렇게 포인트라는 변수에 담긴 숫자를 변화시킬 수 있다. 아까 변수변하는 수라고 했다. 변수가 맞다!

 

우리는 이걸로 변수라는 개념을 알았다. 근데 정수는 엄청 큰 수(예를 들어 5조6억7천만)도 포함하는데 왜 저기서 최대라는 말이 나오냐고? 이걸 알기 위해서는 컴퓨터가 숫자를 저장하는 방식을 알아야 한다. 근데 이를 위해서는 비트라는 단어를 알아야 하고 이는 2진법이라는 개념을 알아야만 한다. 그렇기 때문에 2진법부터 설명하겠다. 변수를 이해했으면 여기서부턴 완전 쉬우니 빨리 가보자!!

 

2진법이란?

먼저 진법이란?

1.[수학] 수를 표기하는 기수법의 하나. 십진법, 이진법 따위가 있다.

 

이거 근데 말을 어렵게 써놨을 뿐이지 막상 설명 이해하면 쉽다.

우리는 숫자를 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 이렇게 10개로 표현한다. 이를 10진법이라고 한다. 무슨 말이냐고? 먼저 표를 보여주겠다.

 

어렵지 않다!!

 

 

뭐가 많아보이지만 어렵지 않다. 쉽다! 제일 왼쪽에 있는 o의 개수라고 한 것들을 보자. 컴돌이들은 같은 개수를 가지고도 다른 진법을 가지고 다르게 표현한다.

아까 10진법은 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 이렇게 10개로 표현한다고 했다.

그럼 9진법은? 0, 1, 2, 3, 4, 5, 6, 7, 8 이렇게 9개로 표현한다. 표를 다시 보자.

 

 

10진법에서는 숫자 1개로는 0부터 9까지 표현 가능하다. 근데 oo,oo,oo,oo,oo 는 숫자 1개로는 부족하다. 그래서 숫자를 1개 더 추가해 oo,oo,oo,oo,oo 을 10으로 표현했다. 이런 당연한 말을 왜 하냐면 다른 진법을 이해하기 위해서이다. 이제는 9진법으로 가보자.

 

9진법에서는 숫자 1개로는 0부터 8까지 표현 가능하다. 즉 oo,oo,oo,oo 까지는 8로 표현이 가능하지만 oo,oo,oo,oo,o 는 숫자 1개로는 부족하다! 그래서 숫자를 1개 더 추가해 oo,oo,oo,oo,o10으로 표현했다! 10진법으로는 9인데 9진법에서는 10이다!

 

 

----------이하 2진법까지 반복------------

8진법에서는 숫자 1개로는 0부터 7까지 표현 가능하다. 즉 oo,oo,oo,o 까지는 7로 표현이 가능하지만 oo,oo,oo,oo 는 숫자 1개로는 부족하다! 그래서 숫자를 1개 더 추가해 oo,oo,oo,oo 을 10으로 표현했다! 10진법으로는 8인데 9진법에서도 8, 8진법에서는 10이다!

...

...

...

2진법에서는 숫자 1개로는 0부터 1까지 표현 가능하다. 즉 o 까지는 1로 표현이 가능하지만 oo 는 숫자 1개로는 부족하다! 그래서 숫자를 1개 더 추가해 oo 을 10으로 표현했다! 10진법으로는 2인데 2진법에서는 10이다!

----------이상 2진법까지 반복------------

 

 

이런 식으로 우리는 진법간 변환을 할 수 있게 되었다. 세자리수로 올라가는 것도 똑같다. 해당 진법이 가지고 있는 수로 o의 개수를 표현할 수 없으면 앞에 수를 더 붙여서 표현하면 된다. 그러니 이진법이 10진법으로 작은 수라도 11011001 이런 식으로 길게 표현되는 것이다....

헷갈리면 표를 보면 된다. "10진법으로 9는? 2진법으로 1001이다." 이런식으로 위 표에서 찾아보면 된다. 이걸로 진법은 끝! 그러면 이제 남은 건 비트라는 단어와 컴퓨터가 숫자를 저장하는 방식이다. 다 왔다. 비트를 알아보자.

 

비트란?

2진법에서의 자릿수를 비트라고 한다. 아래 예시를 보면 잘 이해할 수 있을 것이다.

우리는 53219라는 수에서 일의 자릿수는 9, 십의 자릿수는 1, 백의 자릿수는 2, 천의 자릿수는 3, 만의 자릿수는 5라고 표현한다. 이걸 2진법에 적용해보자.

우리는 10110이라는 이진법 수에서 일의 자릿수는 0, 십의 자릿수는 1, 백의 자릿수는 1, 천의 자릿수는 0, 만의 자릿수는 1이라고 한다.

이때 우리는 자릿수가 5개라고 표현할 수 있지만! 컴돌이들은 2진법에서의 자릿수비트라고 한다! 저 10110은 5비트짜리다. 그리고 각 비트에는 0과 1만 들어갈 수 있다! 2진법은 0과 1만 쓸 수 있으니까! 다 왔다! 컴퓨터가 숫자를 저장하는 방식을 보자!

 

 

8비트 10011011

 

 

컴퓨터가 숫자를 저장하는 방식?

사실 처음에는 컴퓨터가 숫자를 저장하는 방식이라고 했지만 여기까지 정독했다면 변수의 개념을 알았을 것이다. 그러니 표현을 컴퓨터가 변수를 저장하는 방식으로 정정하겠다. 그리고 사실 알아볼 것도 없다! 이미 비트 개념을 익혔으니! 다시 처음으로 가보자.

 

 

돌고 돌아 다시 여기로 왔다 ㅠㅠㅠㅠ

 

위 글에는 변수가 32비트짜리 정수라서 그랬던거구나....!!!라고 써있다.

변수 설명에서는 위 글을

 

2번 변수에는 포인트라는 이름을 붙이고 정수를 담자. 내용물은 21억

 

이라고 했다. 여기에 32비트짜리를 추가해주자.

 

2번 변수에는 포인트라는 이름을 붙이고 32비트짜리 정수를 담자. 내용물은 21억

 

여기서 32비트란? 자릿수가 32개가 있다는 뜻이다.

 

0000 0000 0000 0000 0000 0000 0000 0000

     4     8     12    16    20    24    28    32

 

그렇다. 컴돌이들은 변수를 선언할 때 이 변수한테 줄 비트(최대 자릿수)를 미리 말해준다! 넌 오늘 용돈 얼마! 이런 것과 비슷한 것이다.(그리고 32비트 운영체제라고 함은 이렇게 변수를 저장할 수 있는 최대 자릿수가 32비트라는 뜻이다. 64비트 운영체제는 변수를 저장할 수 있는 최대 자릿수가 64비트라 더 큰 수를 저장할 수 있다.)

 

여기서 문제!

32비트에는 숫자를 최대 몇까지 담을 수 있을까?

 

Ans. 21억. 왜냐면 저기 위에 최대 포인트가 21억점이니까!

 

 

이것도 생각보다 쉽게 계산이 가능하다. 10진법에서부터 출발하면 된다.

10진법에서는 1개의 자릿수에 10개를 담을 수 있다. 0~9까지.

그렇다면 2개의 자릿수에는? 100개를 담을 수 있다. 0~99까지.

3개의 자릿수에는? 1000개를 담을 수 있다. 0~999까지.

4개의 자릿수에는? 10000개를 담을 수 있다. 0~9999까지.

 

규칙이 보이는가? 자릿수가 1개가 추가될 때마다 담을 수 있는 숫자가 10배씩 늘어난다. 이는 10진법이기 때문에 그렇다. 그렇다면 2진법에서는? 바로 해보자.

 

1개의 자릿수(1비트)에서는? 2개를 담을 수 있다. 0~1까지.

2개의 자릿수(2비트)에서는? 4개를 담을 수 있다. 0~11까지.

3개의 자릿수(3비트)에서는? 8개를 담을 수 있다. 0~111까지.

...

10개의 자릿수(10비트)에서는? 2^10개(1024개)를 담을 수 있다. 0~111111111까지

 

근데 언제 이걸 일일이 32비트까지 다 하랴? 지수 법칙을 쓰자!

 

 

위에서 2^10은 1024이니 대략 1000으로 잡으면

 

2^32 = 2^2 * 1000 * 1000 * 1000

 

1000을 3번 곱하면? 1,000,000,000(10억)이다.

그러면 2^32 = 2^2 * 10억 = 40억......? 아까는 분명 21억이랬는데......?

 

근데 여기에 사실 함정이 있다.

우리는 정수라고 말했다. 정수는? 음수도 포함한다!

 

0000 0000 0000 0000 0000 0000 0000 0000

     4     8     12    16    20    24    28    32

 

 

여기서 컴퓨터는 정수를 저장할 때 맨 앞의 비트를 숫자로 생각하지 않고 부호로 생각한다. 0이면 +, 1이면 -로.(이를 부호 크기 체계 (signed magnitude, sign and magnitude system)라고 한다.)

예를 들면 아래와 같다.

 

1000 0000 0000 0000 0000 0000 0000 1111 = -7

 

0000 0000 0000 0000 0000 0000 0001 0001 = +17

 

에 부호를 담는다. 그렇기 때문에 맨 앞의 1비트를 빼면 숫자를 저장할 공간은 31비트가 된다. 그래서 위의 저 답은 틀렸다.

 

 

답은 2^31 = 21억이다.

 

여기에 1024를 1000으로 근사해서 계산했으니 정확한 답은 2,147,483,648이다.(저 위의 분의 점수는 최고점이 아니었던걸로.....)

 

여기까지의 긴 여정을 통해 저 글쓴이의 깨달음을 해설해보자면 아래와 같다.

 

"프로그램 개발엔 변수가 쓰인다. 그리고 동물농장 게임을 개발할 때에도 포인트라는 변수를 선언했을 것이고 그것을 정수형으로 선언했을 것이다. 정수형은 최대로 표시할 수 있는 수가 21억이다. 그렇기 때문에 21억이 최대점수인 것이다."

 

 

 

 

이 길고 긴 노잼 스피드웨건의 설명을 따라오기 어려웠겠지만 만약 이 글을 다 읽으셨고 이해하셨다면 여기까지 온 당신의 노고에 깊은 찬사의 박수를 보냅니다. 이정도면 정확한 설명은 아니지만 당신은 컴퓨터의 원리를 대략적으로 파악하신 것입니다. 축하드립니다! 자부심 가져도 좋습니다!

 

 

 

 

P.S. 컴잘알분들께.. 변수의 정의, 함수형 프로그래밍, 부호 크기 체계는 정수 말고 실수 저장에만 쓰인다는 등 이 글은 반박할 여지가 수없이 많지만 이해의 편의를 위해 어느 정도 과감히 쳐냈으니 넓은 아량으로 읽어주시길 부탁 드립니다. 하하;;;;

반응형

+ Recent posts