Skip to content

01. 디지털과 진법


학습 목표

  1. 아날로그와 디지털의 차이를 설명할 수 있다.
  2. 비트(Bit), 니블(Nibble), 바이트(Byte)의 개념과 관계를 이해한다.
  3. 2진수, 10진수, 16진수 사이의 변환을 자유롭게 수행할 수 있다.
  4. 8421 가중치 체계를 이용해 2진수를 10진수로 빠르게 변환할 수 있다.
  5. 16진수가 실무에서 어디에 사용되는지 파악한다.

전체 구조

아래 다이어그램은 이 장에서 다루는 핵심 개념들의 관계를 보여준다.


1. 디지털이란?

핵심 개념

컴퓨터 내부에서 모든 정보는 0과 1, 단 두 가지 상태로 표현된다. 이것이 바로 디지털(Digital) 신호의 본질이다.

왜 0과 1인가? 컴퓨터는 전기로 작동하는 기계다. 전기가 흐르면 ON(1), 흐르지 않으면 OFF(0). 마치 방의 전등 스위치와 같다. 스위치를 올리면 불이 켜지고(1), 내리면 불이 꺼진다(0). 컴퓨터는 이런 스위치를 수십억 개 모아놓은 것이라고 생각하면 된다.

아날로그 vs 디지털

구분아날로그(Analog)디지털(Digital)
신호 형태연속적인 파형불연속적인 0과 1
실생활 비유수은 온도계 - 수은이 연속적으로 올라감디지털 온도계 - 36.5도처럼 끊어서 표시
또 다른 비유아날로그 시계 - 초침이 부드럽게 움직임디지털 시계 - 숫자가 1초 단위로 바뀜
장점자연 현상을 그대로 표현복사해도 품질 저하 없음, 처리가 정확
단점복사할수록 품질 저하원래 신호를 근사치로 표현

아날로그 신호는 물결처럼 부드럽게 이어지는 연속적인 값이다. 예를 들어 사람의 목소리는 아날로그 신호인데, 음파가 끊김 없이 연속적으로 변한다.

반면 디지털 신호는 계단처럼 뚝뚝 끊어지는 값이다. 컴퓨터는 아날로그 세계의 소리, 빛, 온도 같은 것들을 0과 1의 조합으로 바꾸어 저장하고 처리한다.

실생활 비유: 경사로(아날로그)와 계단(디지털)을 떠올려 보자. 경사로는 어디서든 멈출 수 있어 높이가 무한히 많지만, 계단은 정해진 높이에만 발을 디딜 수 있다. 디지털은 이 "계단"과 같다.


2. 비트(Bit) - 정보의 최소 단위

비트란 무엇인가

비트(Bit)Binary digit의 줄임말로, 0 또는 1 하나를 담는 정보의 최소 단위다. 전등 스위치 1개가 표현할 수 있는 상태는 꺼짐(0)과 켜짐(1), 딱 2가지다. 이것이 1비트다.

비트가 늘어나면?

스위치가 2개 있다고 생각해 보자. 첫 번째 스위치와 두 번째 스위치를 각각 끄거나 켤 수 있으므로 총 4가지 조합이 나온다.

스위치 1스위치 2상태 번호
0 (OFF)0 (OFF)0번
0 (OFF)1 (ON)1번
1 (ON)0 (OFF)2번
1 (ON)1 (ON)3번

스위치(비트)가 하나 추가될 때마다 경우의 수는 2배로 늘어난다. 이 패턴을 공식으로 쓰면 다음과 같다.

n비트로 표현 가능한 경우의 수 = 2^n

비트 수별 경우의 수 표

비트 수경우의 수계산실생활 비유
1비트22^1동전 던지기 (앞/뒤)
2비트42^2사거리 방향 (동/서/남/북)
3비트82^3팔방위
4비트162^416진수 한 자리
8비트2562^8영문 알파벳 + 숫자 + 특수문자 전부
16비트65,5362^16옛날 컴퓨터 한 번에 처리하던 양
32비트약 43억2^32IPv4 주소 전체 개수

실생활 비유: 자물쇠의 다이얼을 생각해 보자. 다이얼 한 칸이 0~9(10가지)인 자물쇠에서 다이얼이 3개면 000~999까지 1,000가지(10^3) 비밀번호가 가능하다. 비트도 같은 원리인데, 한 자리가 0~1(2가지)일 뿐이다. 비트가 8개면 2^8 = 256가지 조합이 나온다.


3. 니블(Nibble)과 바이트(Byte)

니블 (Nibble) - 4비트 묶음

니블(Nibble) 은 4개의 비트를 한 묶음으로 부르는 단위다. "nibble"은 영어로 "한 입 베어 물다"라는 뜻인데, byte(바이트)의 절반이라서 "반만 깨물다"는 재치 있는 이름이다.

  • 4비트 = 1니블
  • 표현 가능한 경우의 수: 2^4 = 16가지 (0000 ~ 1111)
  • 이 16가지가 바로 16진수 한 자리(0~F)에 정확히 대응한다.

바이트 (Byte) - 8비트 묶음

바이트(Byte) 는 8개의 비트를 한 묶음으로 부르는 단위다. 컴퓨터에서 데이터를 다루는 가장 기본적인 단위이며, 메모리 주소 하나가 가리키는 크기이기도 하다.

  • 8비트 = 1바이트 = 2니블
  • 표현 가능한 경우의 수: 2^8 = 256가지 (00000000 ~ 11111111)
  • 영문 알파벳 1글자를 저장하는 데 1바이트면 충분하다 (ASCII 코드: 0~127, 7비트)
  • 한글 1글자는 인코딩 방식에 따라 다르다:
    • EUC-KR: 2바이트
    • UTF-8: 3바이트 (가장 많이 사용)
    • UTF-16: 2바이트
    • UTF-32: 4바이트

데이터 크기 단위

단위크기실생활 비유
1 Byte8비트영문자 1글자
1 KB (킬로바이트)1,024 Byte짧은 텍스트 파일
1 MB (메가바이트)1,024 KBMP3 노래 1곡
1 GB (기가바이트)1,024 MB영화 1편 (표준 화질)
1 TB (테라바이트)1,024 GB외장 하드디스크 용량

4. 8421 가중치와 2진수

가중치란?

10진수에서 각 자리에는 자릿값(가중치) 이 있다. 예를 들어 10진수 365는 다음과 같이 분해된다.

3 × 100  +  6 × 10  +  5 × 1  =  365
  (백의 자리)  (십의 자리)  (일의 자리)

2진수도 마찬가지다. 다만 10진수의 가중치가 10의 거듭제곱(1, 10, 100, 1000...)인 것처럼, 2진수의 가중치는 2의 거듭제곱(1, 2, 4, 8, 16, 32, 64, 128...)이다.

4비트의 8421 가중치

4비트(1니블)에서 각 자리의 가중치를 왼쪽부터 나열하면 8, 4, 2, 1이다. 이것이 바로 8421 코드라 불리는 이유다.

비트 위치비트3 (최상위)비트2비트1비트0 (최하위)
가중치8421

변환 예시 1: 0110(2) -> 10진수

0 × 8  +  1 × 4  +  1 × 2  +  0 × 1  =  0 + 4 + 2 + 0  =  6

변환 예시 2: 1010(2) -> 10진수

1 × 8  +  0 × 4  +  1 × 2  +  0 × 1  =  8 + 0 + 2 + 0  =  10

변환 예시 3: 1111(2) -> 10진수

1 × 8  +  1 × 4  +  1 × 2  +  1 × 1  =  8 + 4 + 2 + 1  =  15

4비트로 표현할 수 있는 범위는 0000(0)부터 1111(15)까지, 총 16가지다.

8비트로 확장

8비트(1바이트)의 가중치는 왼쪽부터 다음과 같다.

비트 위치비트7비트6비트5비트4비트3비트2비트1비트0
가중치1286432168421

모든 비트가 1인 경우: 11111111(2)

128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

따라서 1바이트로 표현할 수 있는 범위는 0 ~ 255이다.

실생활 비유: 8421 가중치는 화폐 단위와 비슷하다. 만원짜리, 오천원짜리, 천원짜리, 오백원짜리 지폐가 각각 있거나(1) 없거나(0)로 금액을 조합하는 것처럼, 128, 64, 32, 16, 8, 4, 2, 1짜리 "비트 화폐"로 0~255 사이의 모든 숫자를 조합할 수 있다.


5. 16진수 표기

왜 16진수를 쓰는가?

2진수는 컴퓨터에게 자연스럽지만, 사람이 읽기엔 너무 길다. 예를 들어 11110100이라는 8비트 값을 읽고 외우기는 쉽지 않다. 그런데 이것을 16진수로 쓰면 F4, 단 두 글자로 줄어든다.

핵심은 이것이다: 4비트가 16진수 한 자리에 정확히 대응한다. 4비트로 표현 가능한 경우의 수가 16가지(0~15)이고, 16진수 한 자리가 나타내는 값도 0~15이기 때문이다.

16진수 대응표

2진수 (4비트)10진수16진수
000000
000111
001022
001133
010044
010155
011066
011177
100088
100199
101010A
101111B
110012C
110113D
111014E
111115F

10~15를 한 자리로 표기하기 위해 알파벳 A~F를 빌려 쓴다. 대문자와 소문자 모두 사용 가능하다(A = a, B = b, ...).

0x 접두어

C, Java, JavaScript, Python 등 대부분의 프로그래밍 언어에서 16진수 앞에 0x 를 붙여 16진수임을 표시한다.

0xFF    -> 16진수 FF
0x1C    -> 16진수 1C
0xB7    -> 16진수 B7

"0x"가 없으면 FF가 변수 이름인지, 16진수인지 구분할 수 없기 때문이다.

16진수 글자 수로 비트 수 추론하기

16진수 한 글자 = 4비트이므로:

16진수 글자 수비트 수바이트 수
1글자 (예: 0xF)4비트0.5바이트(니블)
2글자 (예: 0xFF)8비트1바이트
4글자 (예: 0xFFFF)16비트2바이트
6글자 (예: 0xB71C1C)24비트3바이트
8글자 (예: 0xFFFFFFFF)32비트4바이트

공식: 16진수 글자 수 x 4 = 비트 수

변환 예시: 0xF4

F = 1111  (15를 4비트로)
4 = 0100  (4를 4비트로)

0xF4 = 1111 0100 (8비트, 즉 1바이트)

6. 진법 변환 실전

2진수 -> 16진수 변환

방법: 2진수를 오른쪽부터 4비트씩 묶어서 각 묶음을 16진수 한 자리로 변환한다.

예시: 11001011(2) -> 16진수

1100  1011
 C      B

결과: 0xCB

16진수 -> 2진수 변환

방법: 16진수 각 자리를 4비트로 풀어서 나열한다.

예시: 0xA3 -> 2진수

A = 1010
3 = 0011

결과: 10100011(2)

16진수 -> 10진수 변환

방법: 각 자릿수에 16의 거듭제곱 가중치를 곱해서 합산한다.

16진수에서 가중치는 오른쪽부터 1(16^0), 16(16^1), 256(16^2), 4096(16^3), ... 순으로 증가한다.

예시 1: 0xB7 -> 10진수

B = 11,  7 = 7
11 x 16  +  7 x 1  =  176 + 7  =  183

예시 2: 0x1C -> 10진수

1 = 1,  C = 12
1 x 16  +  12 x 1  =  16 + 12  =  28

예시 3: 0xFF -> 10진수

F = 15,  F = 15
15 x 16  +  15 x 1  =  240 + 15  =  255

예시 4: 0x3A -> 10진수

3 = 3,  A = 10
3 x 16  +  10 x 1  =  48 + 10  =  58

실생활 비유: 진법 변환은 외국 화폐 환전과 같다. 1달러 = 16원이라고 가정하면, 0xB7은 "B달러 7원"이다. B(11)달러를 원으로 바꾸면 11 x 16 = 176원, 여기에 7원을 더하면 183원. 이것이 16진수에서 10진수로의 변환이다.


7. 16진수가 사용되는 곳

CSS 색상 코드

웹 개발에서 색상을 지정할 때 16진수가 사용된다.

css
color: #B71C1C;
  • # 뒤에 16진수 6자리가 온다.
  • 2자리씩 나누면: B7 / 1C / 1C
  • 각각 빨강(R) / 초록(G) / 파랑(B) 의 강도를 나타낸다.
  • 범위: 00(가장 약함) ~ FF(가장 강함, 255)
  • #B71C1C는 빨강이 183(0xB7), 초록이 28(0x1C), 파랑이 28(0x1C)이므로 진한 빨간색이다.

메모리 주소

컴퓨터의 메모리 주소는 16진수로 표기한다.

0x00FF1234

2진수로 쓰면 32비트 전체를 나열해야 하지만, 16진수로 쓰면 8자리로 깔끔하게 표현된다.

C 언어 포인터

c
int *ptr = (int *)0x7FFF5FBFF8AC;
printf("주소: %p\n", ptr);  // 출력: 0x7fff5fbff8ac

포인터 변수가 가리키는 메모리 주소를 출력하면 16진수로 나온다.

디버거 메모리 창

프로그램을 디버깅할 때 메모리 내용을 확인하면 다음과 같이 16진수로 표시된다.

주소          내용 (16진수)                    ASCII
0x00401000   48 65 6C 6C 6F 20 57 6F   Hello Wo
0x00401008   72 6C 64 21 00 00 00 00   rld!....

왼쪽은 메모리 주소, 가운데는 각 바이트의 값을 16진수로, 오른쪽은 그에 대응하는 ASCII 문자를 보여준다.


핵심 암기 포인트

항목내용
1비트2가지 상태 (0, 1)
4비트 (1니블)16가지 상태 (0~15) = 16진수 한 자리
8비트 (1바이트)256가지 상태 (0~255) = 16진수 두 자리
n비트의 경우의 수2^n
0x 접두어"이것은 16진수입니다"라는 표시
8421 가중치4비트 각 자리의 자릿값: 8, 4, 2, 1
8비트 가중치128, 64, 32, 16, 8, 4, 2, 1
16진수 -> 비트 수16진수 글자 수 x 4 = 비트 수
1바이트 최대값11111111(2) = FF(16) = 255(10)
2진수 -> 16진수4비트씩 묶어서 변환
16진수 -> 10진수각 자리에 16^n 가중치를 곱해서 합산

확인 질문

문제 1

0x3A는 몇 비트인가?

정답 보기

8비트

0x3A는 16진수 2글자이다. 16진수 한 글자 = 4비트이므로, 2글자 x 4 = 8비트(1바이트) 이다.


문제 2

2진수 11001011을 16진수로 변환하면?

정답 보기

0xCB

4비트씩 묶는다: 1100 1011

  • 1100 = 8+4 = 12 = C
  • 1011 = 8+2+1 = 11 = B

따라서 0xCB


문제 3

16진수 FF는 10진수로 얼마인가?

정답 보기

255

F = 15이므로: 15 x 16 + 15 x 1 = 240 + 15 = 255

이는 1바이트로 표현할 수 있는 최대값이기도 하다.


문제 4

1바이트로 표현 가능한 최대 값은?

정답 보기

255

1바이트 = 8비트이고, 모든 비트가 1일 때 최대값이다. 11111111(2) = 128+64+32+16+8+4+2+1 = 255 16진수로는 0xFF이다.


문제 5

4비트로 나타낼 수 있는 경우의 수는?

정답 보기

16가지

n비트의 경우의 수 = 2^n 이므로, 2^4 = 16가지 0000(0)부터 1111(15)까지 총 16가지 조합이 가능하다.