2014년 3월 25일 화요일

1) 컴퓨터의 내부를 알자

프로그램 만드는 것에 대해 가르쳐 주려고 생각하니, 할 수 없이 수학에서 배운 내용을 같이 설명할 수 밖에 없다. 역시 뭘 하든 수학을 잘 해야 해. 컴퓨터 내부에는 어떤 부품이 들어 있고 이 것들이 각각 어떤 일을 어떤 방식으로 하는 지에 대해서 어느 정도 감이 있어야 앞으로 공부할 내용들에 대해 이해할 수 있을 꺼야.

컴퓨터의 내부 구조


컴퓨터에 대한 책은 거의 대부분 위와 같은 그림에 대한 설명으로 시작하게 되는데, 컴퓨터는 하늘색 사각형 안에 그려져 있는 부분을 말하는 것이고(이걸 본체라고 함) 나머지 부품들은 컴퓨터에 연결해서 우리가 사용하는 것들이야. 여기서 가장 중요한 것이 CPU라고 하는 것인데 컴퓨터에서 일어나는 모든 일들이 이것을 중심으로 동작하고 있다고 생각하면 틀리지 않아. CPU는 미국에 있는 인텔(Intel)이라는 회사에서 만드는 것들이 가장 많이 사용되고 있는데 이 회사에서 계속 연구를 해서 점점 더 빠르고 강력한 제품들을 내놓고 있고 그 때마다 이름이 붙여지지.

CPU

CPU는 (미리 만들어서 넣어 놓은) 프로그램을 실행시키는 일을 하는데, 그 과정은 기억장치(RAM)에서 명령을 한 개 읽어 와서 그걸 처리하고 다시 다음 명령을 한 개 읽어 와서 그걸 처리하고... 이걸 계속 반복하는 식이야. 아주 간단하지. CPU가 읽고 처리하는 명령어라고 하는 것이 모두 숫자로 이루어져 있어. 사실 요즘 우리가 사용하는 전자 장치들은 모두 숫자들을 조합해서 만들어지는 것이지. 컴퓨터의 부품들을 보면 아주 많은 전선들이 서로 연결되어 있는 것을 볼 수 있는데, 각각의 전선에 전기가 흐르는 경우가 1, 흐르지 않는 경우가 0이 되는 거야. 1과 0 이렇게 두 가지 만으로 구분되는 것이지.
위의 그림처럼 어떤 부품에 전선이 8개 붙어 있는 데 빨간 번개 표시가 전기가 들어와 있는 상태라고 하면 위로부터 1, 0, 1, 1, 0, 1, 0, 1 이렇게 8개의 정보를 나타내고 있는 것이야. CPU가 처리해야 할 명령을 이런 수의 조합으로 읽게 되고, 그 다음 명령은 일정 시간이 지난 후에 각각의 전선에서 전기의 유무를  다시 읽고, 또 일정 시간이 지난 후에 각각의 전기 유무를 다시 읽고... 이런 식으로 진행되는 것이야. 전선의 전기 유무의 조합이 사람 눈으로는 도저히 구별할 수 없을 정도로 매우 빠른 박자를 타고 바뀌는데, 이 박자의 빠르기가 우리가 이야기하는 CPU의 속도를 말하는 거야. 1GHz(기가헤르쯔) 속도의 CPU는 1초에 10억 번 숫자의 조합을 바꾸어가면서 처리할 수 있는 거지!

2진수와 16진수

이와 같이 0과 1 두 가지만 가지고 표현하는 수를 2진수라고 해(예전에 이미 배운 것임). 2진수라는 것을 알아야 하는 이유는 앞에서 얘기한 것처럼 컴퓨터 내부에 존재하는 정보는 전기가 있다/없다의 2가지 상태를 조합해서 존재하는 것이기 때문에 수학에서 배운 2진수를 사용하면 참 편하기 때문이지.
일반적으로 우리가 사용하는 숫자(10진수)는 한 자리에 10개의 숫자(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)를 사용하고 11번째 숫자가 없기 때문에 자리 수를 올려 10, 11, 12, 13, ... 이런 식으로 쓰잖아? 2진수는 한 자리에 2개의 숫자(0, 1)만 사용하기 때문에 자리 수가 올라가는 속도가 장난이 아니야. 2진수로 0부터 숫자를 표시해 보면 아래와 같아.
2진수10진수
00
11
102
113
1004
1015
1106
1117
10008
10019
101010
101111
2진수는 컴퓨터의 내부 사정을 가장 정확하게 표현할 수 있는 장점이 있지만, 이걸 진짜 쓰려면 공간도 많이 차지하고 또 사람 입장에서는 엄청 헷갈리기 때문에 2진수를 4자리 씩 묶어서 16진수로 사용하는 것이 일반적이야. 2진수가 4자리이면 2*2*2*2=16이지? 수학에서 경우의 수 배울 때를 생각하면 알 수 있어. 16진수는 한 자리에 16개의 숫자를 사용하는데 0에서 9까지는 보통 숫자와 같고 그 뒤의 6개는 알파벳 A에서 F까지를 사용하지.
2진수10진수16진수
000
111
1022
1133
10044
10155
11066
11177
100088
100199
101010A
101111B
110012C
110113D
111014E
111115F
100001610
2진수, 16진수는 써 놓고 보면 이게 2진수인지 10진수인지 또 16진수인지 알 수 없기 때문에 컴퓨터 프로그래밍을 할 때에는 2진수는 앞에 0b, 16진수는 앞에 0x를 붙여서 쓰도록 되어 있어. 10진수는 평소처럼 그냥 편하게 쓰면 되. 예를 들면 13(10진수)는 0b1101(2진수) 혹은 0xD(16진수)처럼 되는 것이지.

수학 계산을 익숙하게 할 수 있으려면 구구단 정도는 외우고 있어야 하는 것처럼, 프로그램을 만드는 일을 하려면 16진수를 능수능란하게 읽고 쓸 수 있어야 해. 2진수 혹은 16진수를 10진수로 바꾸어 보는 연습을 하면 2의 거듭제곱이 되는 수가 자주 나오는데 이것도 눈에 익혀두어야 해.

문제

1. 다음의 10진수를 2진수로 표시하시오.
   (1)  21  (2) 42  (3) 128 (4) 255
2. 다음의 16진수를 10진수로 표시하시오.
   (1) 0x20  (2) 0xABC (3) 0x1000 (4) 0xFFFF
3. 위의 '어떤 부품' 그림에서 나타낸 값을 10진수로 표시하시오.

댓글 2개:

  1. 근데 진수가 뭐야?

    답글삭제
  2. 우리 손가락이 다 합쳐서 10개니까 우리가 1에서 10까지 손가락으로 셀 수 있잖아? 10이 넘어가면 예를 들어 발가락 하나를 접어 놓고 다시 손가락으로 20까지 셀 수 있지. 20이 넘어가면 발가락 두 개를 접고... 이런 식으로 숫자가 커지면 "자리 수"를 올려서 표현하게 되지.

    같은 자리 수 내에서 표현할 수 있는 기호가 10개인 것을 10진수라고 하는데 평소에 우리가 쓰는 수가 10진수야. 10진수는 0에서 9까지 10가지 기호를 숫자로 사용해.

    조금 어렵게 보일 수도 있는데 숫자라고 하는 것이 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 이렇게 되는 것을 당연하게 생각하지 않고 왜 '9' 다음이 '1''0'이 되는 것인 가를 이해하면 돼.

    같은 자리에 표현하는 기호가 10개가 아닌 경우가 있는 데 가장 가까운 예가 달(month)이야. 어떤 기간을 셀 때 1개월, 2개월, 3개월, ..., 11개월, 12개월=1년, 13개월=1년 1개월, 14개월=1년 2개월 이렇게 되지? 이런 경우 12진수라고 할 수 있지.

    답글삭제