본문 바로가기
프린이(프로그래머가 되고 싶어요)를 위한

7. 진법과 진수

by 아코미스트 2025. 5. 8.

아마 제목만 봐도 벌써 머리가 지끈 지끈 아파오시는 분이 있을 겁니다.


'진법과 진수'하면 떠오르는 기억이 아주 오래전에 공부 좀 하신다는 친구놈 아들님께서 이 아콤 아저씨를 찾아와서 학교에서 진법에 관한 과정을 공부하는데 도저히 모르겠다고 특별 과외를 신청해서 열심히 가르쳐 준 적이 있는데 어쨋던 좋은 대학 가고 좋은 직장 다니고 얼마전에 장가도 갔습니다. 내 덕인가? ㅋㅋ


아뭏든 그 공부 잘한다는 녀석도 힘들어 하는 걸 보니까 이게 좀 어려운 내용인가 싶긴 하더라고요.
하지만 완전한 이해는 하지 않더라도 어느 정도는 알고 있어야 할 것 같아서 강좌에 넣었습니다.


아무리 해도 이해가 안되면 할 수 없지만 아주 쉬운 예를 들고 쉽게 설명하려고 노력했으니 기본적인 개념 정도는 아시고 가는게 좋을 것 같습니다.

우선 진법은 무엇인가?

'진법'하면 전쟁에서 진을 짜는 법을 떠오르시는 분들이 있을 것입니다.
아마 삼국지나 무협지를 매우 사랑하시는 분들일 것이라 생각됩니다.


우리가 컴퓨터 프로그램과 관련해서의 진법은 '숫자의 전진법' 이라고 생각하시면 됩니다.

 

'숫자가 발이 달린 것도 아닌데 무슨 전진을 해?' 라고 물음표를 다실 수도 있겠지만, 수의 전진이란 아무 것도 없는 0의 상태에서 수가 하나씩 증가하고 진법상의 한계에 다다를 때 왼쪽으로 한 자리가 만들어 지며 점점 커져가는 것을 의미합니다.


즉 우리가 일상에서 숫자를 세는 경우 0부터 9까지 세고 다음은 10이되어 한자리 수에서 두자리 수로 왼쪽으로 늘어나고 99까지 세고 나면 100으로 다시 왼쪽으로 한 자리가 늘어나게 되죠?


이렇게 왼쪽으로 늘어나는 것을 수의 전진이고 이 전진하는 방법을 진법이라고 합니다. 참 쉽죠?


이렇게 9가 한계이고 9 다음에 10이 오는 것을 십진법이라고 합니다.

 

우리는 평상에서 모두 10진법을 사용하고 있습니다.
왜냐하면 손가락이 10개이기 때문이죠. 다른 이유는 없습니다.

컴퓨터 프로그램 강좌 중 진법을 설명하기 위해 10진법을 이해 시키기 위해 손가락을 사용하는 그림

 

문자나 숫자가 없는 원시 시절에도 숫자를 표현할 필요가 있었을 테고 그때 가장 요긴하게 쓰이는 것이 손가락이죠.
아니 지금도 우리가 항상 숫자를 헤아리고 표현할 때 손가락을 사용하고 있지 않습니까?

 

그런데 이 손가락으로 숫자를 표현하는 데는 한계가 있죠? 예 0 부터 10까지는 표현할 수 있지만 그 이상은 한사람으로는 한번에 표현할 수 없다는 것입니다.

 

뭐 손가락을 다 펴서 두번 흔들면 20이고 손가락 세개를 펴서 23을 표현할 수는 있겠지만 그건 그냥 한 순간의 표현이고 숫자의 표시를 지속시킬 수 없습니다.


그때 만약 옆에 친구가 있어서 '넌 손가락을 모두 접고 있다가 내가 10까지 세면 너는 손가락 하나씩 펴' 라고 하면 최대 100까지 표현할 수 있습니다.


또 한 친구를 옆에 세우고 두번째 친구가 10까지 다 펴면 손가락 하나씩 펴도록 시키면 세명이 표현할 수 있는 숫자는 1000 까지 늘어날 것입니다.


만약 인간의 팔이 하나만 있어서 한 손으로만 수를 세야 했다면 십진법이 아니라 오진법을 사용되었을 것입니다.
또한 인간의 손가락이 12개라면 십이진법이 사용되었을 것입니다.


이렇게 진법은 하나의 개체가 표현할 수 있는 최대의 숫자를 기준으로 결정되게 됩니다.


그런데 가만히 살펴보면 십진수로 표현될 수 있는 최대 숫자는 숫자를 헤아리는 사람의 숫자만큼 승으로 증가하는 것을 볼 수 있습니다.


즉 한명이면 10의 1승인 10까지, 두명이면 10의 2승인 100까지, 세명이면 10의 3승인 1000까지 이렇게 증가되는 것입니다.
이 단순한 사실은 앞으로 진법을 공부할 때 중요한 부분이기 때문에 잘 기억하시기 바랍니다.

그럼 진수은 무엇인가?


진수는 단순히 진법을 사용했을 때 표현되는 수를 뜻합니다.


즉 10진법에서의 진수는 0에서 9까지 10개 입니다.
0 → 1 → 2 → 3 .... 9 → 10 → 11 .... 99 → 100 → 101 이렇게 진행되면


5진법이라면 진수는 0에서 4까지 5개가 되며,
0 → 1 → 2 → 3 → 4 → 10 → 11 → 12 → 13....44 → 100 → 101 이렇게 진행되게 됩니다.


앞으로 설명드리겠지만 컴퓨터는 기본적으로 2진법을 사용하고
0 → 1 → 10 → 11 → 110 → 111 → 1110 → 1111 이렇게 진행되고


또 컴퓨터에서는 좀 큰 숫자를 표현하기 위해 8진법과 16진법을 사용합니다.
16진법의 진수는
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f 이렇게 16개의 진수를 사용해서
0 → 1 → 2 ... e → f → 10 → 11 .... fe → ff → 100 이렇게 진행됩니다.


어려운가요?

십진법에서 9 다음의 수는 십진법의 진수로 표현할 방법이 없어 자릿수를 왼쪽으로 늘이면서 10 으로 표현하고 99 다음은 100으로 표현하듯이 16진법에서는 f 다음의 수를 16진수로 표현할 수가 없어 10 이 되며 ff 다음은 100이 되는 것입니다.

 

이해하셨죠?

프로그램을 배우는데 진법과 진수를 왜 알아야 하는가?


컴퓨터는 기본적으로 손가락이 하나 밖에 없는 구조라는 특성 때문입니다.


컴퓨터가 연산을 하거나 표현을 하거나 기억을 할 때는 모두 숫자 형태를 사용하는 데 그 숫자를 표현하기 위해 사용하는 도구는 반도체 소자이고 이 반도체 소자에 전기가 들어왔나 안 들어왔나를 가지고 정하게 됩니다.


즉 전기가 들어오면 1이고 안 들어왔으면 0으로 오직 0과 1만 표현할 수 있는 반도체 소자를 무지 막지하게 많이 모아 놓아 아주 작은 수와 큰 수를 연산하고 표현하고 기억하도록 되어있습니다.


손가락 하나만 까딱 까딱할 수 있는 사람이 엄청 많이 모여서 숫자를 표현하고 있다고 생각하시면 됩니다.


따라서 컴퓨터가 기본적으로 표현할 수 있는 숫자는 0과 1 두개 밖에 없어서 2진법을 사용하고 진수는 0과 1밖에 없습니다.


즉 0 → 1 다음에는 2진법으로 표현할 진수가 없어서 10 이되고 11 다음에는 100 이되고 111 다음에는 1000 으로 표현할 수 밖에 없고 이것이 2진법입니다.


이 2진법을10진법과 비교하면
0=0, 1=1, 2=10, 3=11, 4=100, 5=101, 6=110, 7=111, 8=1000 입니다.


살펴보면 한자리 즉 반도체 소자가 한개가 있을 때는 0,1 두개의 숫자를 표현할 수 있고 - 2의 1승은 2
반도체 소자가 두개가 있을 때는 0,1,2,3 의 4개의 숫자를 표현할 수 있습니다. - 2의 2승은 4
반도체 소자가 세개가 있을 때는 0부터 7까지 8개의 숫자를 표현할 수 있고 - 2의 3승은 8
반도체 소자가 네개가 있을 때는 0부터 15까지 16개의 숫자를 표현할 수가 있는 것입니다 -2의 4승은 16


자 우리는 평상시에 십진수를 사용하고 있습니다.


따라서 컴퓨터도 우리가 사용하고 있는 십진수를 기본적으로 사용하면 좋겠고 최소 십진수는 표현할 수 있어야 할 것입니다.
그럼 최소 반도체 소자 네개를 묶어야 십진수를 표현할수 있게 되겠죠. - 세개를 묶으면 7까지 밖에 표현할 수 없으니까요 -


그래서 소자 네개를 묶어 숫자를 표현하도록 했는데 9 다음에 6개의 숫자를 더 표현할 수 있네요?


더 큰 숫자를 표현할 수 있는데 그걸 포기한다면 그건 자원 낭비가 될 것입니다. 지금은 반도체 소자가 엄청 싸지만 과거에는 무지 비싼 자원이었으니까요.


즉 십진법을 사용하면 반도체 소자 네 묶음 한세트로 9까지 표현할 수 있으나 십육진법은 0에서 15까지 표현할 수 있고, 255를 표현하기 위해서 십진법으로 하면 세 세트가 필요한데 16진법이면 두 세트만 필요하게 되는 것입니다.


따라서 컴퓨터내의 비싼 반도체 소자를 최대한 활용하기 위해 10진수를 16진수로 바꾸어 작업을 하고 다시 10진수로 바꾸어 표현하도록 하고 있습니다.


왜 어렵게 진법과 진수를 배워야 하는지의 문제의 근본 원인은 단순히 때문이었다고 보시면 됩니다.


다시 한번 설명하면 왜 반도체 소자 4묶음을 한개의 세트로 하는가는 10진법을 표현하기 위해서는 최소 4묶음이 필요한데 4묶음으로 표현할 수 있는 진수는 16개 이므로 16진법을 사용하게 된 것입니다.


필요에 따라서는 3개 묶음을 사용해서 8진수로 표현하기도 하는데 그리 많이 사용하지는 않습니다.


이 2진법을 Dec 이라고 하고 8진수를 Oct 라고 하고 16진수를 Hex 라고 표현합니다.
그리고 한개의 반도체 소자를 digit 라고 하는데 이 반도체 소자 digit 를 사용하는 모든 기기를 Digital 기기라고 합니다.
요즘 디지탈 디지탈 하는 데 그 말의 기원은 'digit를 이용한' 이라는 표현으로 이해하면 됩니다. 즉 '디지트할' 이라고나 할까요?


8진수는 대개 0o (숫자 0과 알파벳 소문자 o)를 앞에 붙히고 16진수는 0x (숫자 0과 알파벳 소문자 x)를 앞에 붙힙니다.
0o10 = 10진수로 8이고, 0xFF 는 10진수로 255입니다.


그럼 컴퓨터 프로그램과 진법의 관계는 무엇인가?


컴퓨터 프로그래밍을 하려면 많은 변수를 사용해야 하는데 이 변수는 어떤 값을 저장하기 위한 기억 공간이라고 생각하면 되고 복잡하게 여겨진다면 내가 들고 다니는 연장통 혹은 밥그릇 국그릇 같은 거라고 생가하시면 됩니다.


이 기억공간을 할당할 때 기억공간에 담을 자료의 크기에 따라 적절한 크기공간을 할당해야 합니다.


이 기억공간의 크기를 결정하는 것이 기본적으로 디지털 소자의 묶음의 규모를 알아야 하는데 이것이 진법과 관련되어 있다고 생각하시면 됩니다.


즉 디지털 소자 4개의 묶음을 기준으로 16의 세트승수의 숫자만큼 자료형의 크기가 결정된다고 이해하시면 됩니다.

끝으로 여러분은 컴퓨터가 매우 똑똑하다고 생각하시죠?


그런데 컴퓨터가 할수 있는 계산은 2진수의 덧셈과 디지탈 신호를 왼쪽 오른쪽으로 옮기는 것 밖에 못한다는 거.


2진수의 덧셈이래야 0+0=0, 0+1=1, 1+0=1, 1+1=0 이거 네개가 전부이고, 뻴셈도 뻬는 수의 2의 보수를 만들어 더하기 곱셈은 무조건 더하기 나눗셈은 무조건 빼기로 처리합니다.


컴퓨터는 우리처럼 구구단 못 왜웁니다.


단 이전 반복에서 설명했듯이 엄청 빠른 속도로 연산을 수행하기 때문에 상당히 큰 수의 연산도 순식간에 해낼 수 있는 것입니다.
즉 미련하고 무식하지만 일처리가 빠르고 정확한 마당쇠가 시키는 일을 묵묵히 빨리 빨리 처리하고 있다고 생각하시면 됩니다.

마무리


컴퓨터의 기본 구조는 디지털 소자에 전기가 흐르는가 아닌가를 기준으로하는 디지트 신호로 모든 연산을 수행합니다.


이 디지트 신호 하나를 1bit 라고 하며 0과 1 2개의 숫자만 표현할 수 있으므로 기본적으로 2진수를 사용합니다.


이 디지트 신호를 4개의 묶음으로 사용하면 0부터 15까지의 숫자를 표현할 수 있으므로 이때는 16진수을 사용합니다.


컴퓨터에서 16진수를 사용하는 이유는 반도체 소자의 사용을 최대화하기 위한 것으로 프로그램에서 사용하는 자료의 범위는 이 16진수의 승수으로 결정되어집니다.


다음 강좌는 변수와 자료형에 대해 설명해 보겠습니다.

 

8. 변수와 상수

이번 강좌는 어쩌면 프로그램 개발 교육 과정 중 가장 기본적이지만 가장 중요한 변수와 상수에 관한 내용을 설명해 드리도록 하겠습니다. 변수란 말 그대로 해석하면 '변하는 수'가 될 것이지

acompro.tistory.com

 

 

6. 보이지 않는 반복

지난 강좌에서 우리는 반복에 관해서 배워봤습니다.이번 시간에는 보이지 않는 반복에 관해서 알아보도록 하는 시간을 갖겠습니다..보이지 않는 반복은 또 뭐야?' 라는 의문이 들 것입니다.보이

acompro.tistory.com

 

'프린이(프로그래머가 되고 싶어요)를 위한' 카테고리의 다른 글

9. 배열  (0) 2025.05.12
8. 변수와 상수  (1) 2025.05.09
6. 보이지 않는 반복  (0) 2025.05.07
5. 반복에 관하여  (2) 2025.05.02
4. 조건분기에 대하여  (2) 2025.05.01