✨ 1일 1개발지식

[비전공자 전공자 되기 Part 2] 💻 컴퓨터는 어떻게 데이터를 이해할까? — 비트(bit)부터 이미지까지

twoweekhee 2026. 3. 16. 21:57

안녕하세요. 트윅히입니다.

AI가 다 코드를 짜주는 시대에 CS 포스팅은.. 인기가 없나봅니다.

하지만 기초가 튼튼하지 못하면 브루즈칼리파는 서있을 수 없겠죠?

가끔은 요행으로 통하지 않는 것도 있죠!

 

 

"컴퓨터는 결국 전기 스위치의 집합이다."

 


1️⃣ 1비트(1bit) — 전기 스위치 하나의 세계

컴퓨터의 모든 것은 아주 단순한 물리 현상에서 시작됩니다. 바로 전기가 흐르냐, 흐르지 않느냐입니다.

전기가 흐른다 (ON)  → 1
전기가 흐르지 않는다 (OFF) → 0

이 스위치 하나가 바로 1비트(1bit) 입니다. 오직 두 가지 상태만 표현할 수 있죠.

이렇게 두 가지 상태만을 사용하는 체계를 2진수(Binary) 또는 디지털(Digital) 이라고 부릅니다.

"고작 0과 1로 뭘 할 수 있겠어?" 싶겠지만, 이 단순한 스위치를 수십억 개 모아놓으면... 지금 여러분이 보고 있는 이 화면이 만들어집니다. (이 사실은.. 언제나 다시 떠올려도 놀랍긴 합니다)


🔢 4비트와 16진수 — 더 효율적인 표현법

2진수는 컴퓨터 입장에서는 완벽하지만, 사람이 읽기에는 너무 불편합니다.

11110100 같은 숫자를 보면 머리가 아프죠.

그래서 등장한 게 16진수(Hexadecimal) 입니다.

4비트 = 16진수 한 자리

4비트 → 0000 ~ 1111 = 0 ~ 15 = 0x0 ~ 0xF (16가지)

예를 들어 0xF4 는 이렇게 분해됩니다:

0xF4 = F(4비트) + 4(4비트) = 8비트
     = 1111     + 0100

16진수, 어디서 쓰이냐고요?

실생활에서도 16진수를 꽤 자주 마주칩니다:

사용처 예시

RGB 색상 코드 #FF5733 → 빨강 FF, 초록 57, 파랑 33
하드웨어 메모리 주소 0x00400000
MAC 주소 A1:B2:C3:D4:E5:F6

CSS 작성할 때 색상 코드로 쓰던 그 #RRGGBB가 사실 16진수였던 거예요! 😄


💾 8비트 = 1바이트 — 관리의 최소 단위

비트를 8개 묶으면 1바이트(Byte) 가 됩니다. 그리고 이 1바이트가 컴퓨터에서 메모리를 관리하는 최소 단위입니다.

왜 8인지는 역사적인 이유가 있지만, 중요한 건 이겁니다:

영문자 한 글자 = 1바이트
한글 한 글자 = 2바이트

영어는 26글자 + 기호 정도라 1바이트(256가지 표현)로 충분합니다.

하지만 한글은 가, 나, 다... 수천 가지의 조합이 필요하니 최소 2바이트가 필요하죠.

(실제로 한글은 유니코드 기준 3바이트를 쓰기도 합니다.)


📊 데이터 단위의 계층 — KB부터 EB까지

1바이트부터 시작해서 단위는 계속 커집니다.

중요한 건 1024 배씩 늘어난다는 점이에요.

(2진수 기반이라 10의 배수가 아닌 2의 10승 = 1024입니다.)

1 bit
  ↓  × 8
1 Byte       (영문자 1글자)
  ↓  × 1024
1 KB  (킬로바이트)  ← 짧은 텍스트 파일
  ↓  × 1024
1 MB  (메가바이트)  ← MP3 한 곡 (~4MB)
  ↓  × 1024
1 GB  (기가바이트)  ← 영화 한 편 (~1.5GB)
  ↓  × 1024
1 TB  (테라바이트)  ← 외장하드 용량
  ↓  × 1024
1 PB  (페타바이트)  ← 대규모 데이터센터
  ↓  × 1024
1 EB  (엑사바이트)  ← 인터넷 전체 트래픽 수준
  ↓  × 1024
1 ZB  (제타바이트)
  ↓  × 1024
1 YB  (요타바이트)

요즘 AI 데이터셋이나 클라우드 스토리지를 다루다 보면 PB, EB 단위를 실제로 마주치게 됩니다.

불과 20년 전엔 GB도 "엄청 크다"고 했는데, 세상이 참 빠르게 변했죠. 🚀


🔤 컴퓨터가 글자를 다루는 방법 — ASCII와 바이너리

컴퓨터는 모든 것을 숫자로 저장합니다. 글자도 예외가 아닙니다.

그렇다면 어떤 숫자가 어떤 글자인지 약속이 필요하겠죠? 그 약속이 바로 ASCII(아스키 코드) 입니다.

ASCII — 미국 표준 코드 체계

ASCII는 미국에서 만든 표준 코드 체계로, 알파벳·숫자·기호에 각각 번호를 붙여놓은 일종의 대조표입니다.

십진수 65  →  'A'  →  16진수 0x41
십진수 66  →  'B'  →  16진수 0x42
십진수 97  →  'a'  →  16진수 0x61

 

그럼 당연히 생겨야 할 질문

"숫자 65는 어떻게 표현해요?"

아스키코드에서 숫자 문자 '0'~'9' 는 48~57에 해당해요.

그래서 문자 65를 아스키코드로 표현하려면 문자가 2개 필요합니다.

 

눈치 빠른 사람들은 알았겠지만

아스키는 숫자 자체를 저장하는 게 아니라, 모든 것을 "문자"로 표현하는 방식입니다.

정수 65를 저장하려면 아스키가 아닌 이진수(binary) 표현을 사용해야 해요.

 

문자아스키코드
'6' 54(십진수)
'5' 53(십진수)

즉, 숫자 65 → 아스키 문자열 "65" → 54, 53 입니다.

 

근데 결국 컴퓨터는 이걸 바이너리로 치환할거고 바이너리 레벨에서는 둘 다 완전히 동일해요.

65 (정수)  →  01000001
'A' (문자) →  01000001

 

완전히 같은 비트열입니다.

그러면 어떻게 구분하냐? → 컨텍스트(context) 로 구분해요:

구분 주체설명
데이터 타입 int a = 65 vs char a = 'A' → 프로그래머가 타입으로 의미 부여
프로토콜/포맷 HTTP, TCP 등에서 "이 필드는 문자열이다" 라고 사전에 약속
파일 포맷 .txt면 문자, 바이너리 파일이면 정수로 해석

즉, 비트 자체는 아무 의미가 없고, 그걸 어떻게 해석하느냐가 의미를 만들어요.

이게 바로 컴퓨터 과학의 근본 개념 중 하나인:

"데이터는 해석(interpretation)에 의해 의미를 가진다"

 

입니다. C언어에서 (char)65 하면 'A'가 나오는 것도 이 원리예요.

 

몇 가지 자주 등장하는 특수 코드도 알아두면 유용합니다:

0x20      = 스페이스 (빈칸)
0x0D 0x0A = 개행 (줄바꿈, Windows 방식 CRLF)
0x0A      = 줄바꿈 (Unix/Mac 방식 LF)

텍스트 파일을 Windows에서 만들면 개행이 \r\n, Unix에서 만들면 \n인 이유가 바로 이것 때문입니다.
코드 리뷰하다가 줄 끝마다 ^M 문자가 보이면? 바로 이 차이 때문이에요. 😅

숫자와 문자는 다르다!

중요한 개념 하나:

"1" ≠ 1

화면에 보이는 문자 "1"과 정수값 1은 컴퓨터 내부에서 완전히 다른 값입니다.

  • 문자 "1" = ASCII 코드 49 (0x31)
  • 정수 1 = 그냥 1 (0x01)

이걸 헷갈리면 프로그래밍할 때 버그가 생깁니다. 특히 사용자 입력을 숫자로 변환할 때 반드시 타입 변환이 필요한 이유죠.

바이너리(Binary)란?

숫자와 글자를 구별하지 않고 그냥 데이터 덩어리 자체를 말할 때 바이너리(Binary) 라고 합니다.

이미지 파일, 실행 파일처럼 텍스트가 아닌 데이터 형식이죠.


 

🖼️ 컴퓨터가 사진을 다루는 방법 — 픽셀과 비트맵

 

글자는 이해했는데, 사진은 어떻게 저장될까요?

픽셀(Pixel) — 화면의 최소 단위

모니터 화면을 아주 가까이서 들여다보면 아주 작은 점들이 빽빽하게 모여 있는 걸 볼 수 있습니다. 이 점 하나가 바로 화소(Pixel, 픽셀) 입니다.

픽셀 하나를 표현하는 데도 몇 비트를 쓸지 선택할 수 있습니다:

비트 수 표현 가능한 색상 수 용도

8비트 256가지 옛날 게임, GIF 애니메이션
16비트 65,536가지 일부 임베디드 디스플레이
24비트 16,777,216가지 일반적인 사진/이미지 (표준)
32비트 24비트 + 투명도(Alpha) PNG 투명 이미지

현재 우리가 가장 많이 사용하는 건 24비트(True Color) 방식입니다:

R (빨강, 8bit) + G (초록, 8bit) + B (파랑, 8bit) = 24bit
각 채널 0 ~ 255 범위 → 3채널 조합으로 1,600만 가지 색 표현 가능

rgb(255, 99, 71) 같은 CSS 색상 표기법도 이 원리에서 온 거예요!

 

비트맵(Bitmap) — 원본 그대로 저장

비트맵(BMP) 파일은 각 픽셀의 32비트 값을 그대로 쭉 나열해서 저장합니다. 1:1로 정직하게 저장하는 방식이죠.

장점: 화질 손실 없음
단점: 용량이 어마어마하게 큽니다 🗂️

예를 들어 1920 × 1080 해상도 이미지를 비트맵으로 저장하면:

1920 × 1080 × 4 bytes(32bit) ≈ 약 7.9MB

사진 한 장에 8MB... 스마트폰에 사진 1,000장만 찍어도 8GB가 날아가는 셈이죠. 😱

 

JPG, PNG, GIF — 압축의 마법

그래서 등장한 것들이 압축 이미지 포맷입니다. 픽셀을 일일이 나열하는 대신, 더 똑똑한 방법으로 정보를 저장합니다:

포맷 특징 주요 용도

JPG 손실 압축, 용량 매우 작음 사진, 복잡한 이미지
PNG 무손실 압축, 투명 지원 로고, 아이콘, 스크린샷
GIF 256색 제한, 애니메이션 지원 짧은 애니메이션, 밈 🐱
WebP JPG+PNG 장점 결합 웹 최적화

JPG는 사람 눈이 잘 인식하지 못하는 색 정보를 버려서 파일을 줄이고,

PNG는 반복되는 패턴을 압축 알고리즘으로 표현합니다.

덕분에 같은 이미지를 훨씬 작은 용량으로 저장할 수 있어요.


 

🎯 마치며

오늘 살펴본 내용을 한 줄로 정리하면:

컴퓨터는 0과 1밖에 모르지만,
그것을 쌓고 약속을 만들어서 글자도, 사진도, 영상도 표현해냅니다.

처음엔 전기 스위치 하나(1비트)에서 시작해서, 바이트가 되고, 킬로바이트가 되고, 테라바이트가 되고...

거기에 "이 숫자는 A야", "이 패턴은 빨간 픽셀이야" 하는 약속들이 쌓이면서 우리가 매일 쓰는 컴퓨터가 동작합니다.

어렵게 느껴지는 CS 지식도 결국 이런 단순한 원리에서 출발한다는 걸 기억해두면,

나중에 새로운 개념을 배울 때 훨씬 이해하기 쉬워집니다. 😊

 

여러분 오늘도 고생하셨습니다.!!

화이팅..!!

바쁨에 감사하는 하루가 됩시다~~