Bit·Byte·KB·MB·GB 완벽 가이드 | 데이터 단위와 이진수 표현
이 글의 핵심
Bit, Byte, KB, MB, GB 등 데이터 단위를 완벽히 이해합니다. 이진수 표현, 2의 거듭제곱, KiB vs KB 차이, 네트워크 속도 표시 방식까지 실전 예제로 설명합니다.
들어가며
Bit, Byte, KB, MB, GB는 프로그래머가 매일 사용하는 기본 단위입니다. 하지만 1KB가 1000바이트인지 1024바이트인지, 100Mbps가 초당 몇 MB인지 헷갈리는 경우가 많습니다. 비유로 말씀드리면, Bit는 전구 하나(켜짐/꺼짐)이고, Byte는 전구 8개의 조합입니다. 이 조합으로 문자, 숫자, 색상 등 모든 데이터를 표현합니다.
이 글을 읽으면
- Bit와 Byte의 개념을 이해합니다
- KB, MB, GB 등 데이터 단위를 파악합니다
- 이진수와 십진수 변환을 익힙니다
- 네트워크 속도 표시 방식을 이해합니다
실전 경험에서 배운 교훈
이 기술을 실무 프로젝트에 처음 도입했을 때, 공식 문서만으로는 알 수 없었던 많은 함정들이 있었습니다. 특히 프로덕션 환경에서 발생하는 엣지 케이스들은 로컬 개발 환경에서는 재현조차 되지 않았죠.
가장 어려웠던 점은 성능 최적화였습니다. 처음엔 “동작만 하면 되겠지”라고 생각했지만, 실제 사용자 트래픽이 몰리면서 병목 지점들이 하나씩 드러났습니다. 특히 데이터베이스 쿼리 최적화, 캐싱 전략, 에러 핸들링 구조 등은 여러 번의 장애를 겪으면서 개선해 나갔습니다.
이 글에서는 그런 시행착오를 통해 얻은 실전 노하우와, “이렇게 하면 안 된다”는 교훈들을 함께 정리했습니다. 특히 트러블슈팅 섹션은 실제 장애 대응 경험을 바탕으로 작성했으니, 비슷한 문제를 마주했을 때 참고하시면 도움이 될 것입니다.
Bit와 Byte 기초
Bit (비트)
Bit는 컴퓨터가 다루는 가장 작은 단위입니다.
Bit = Binary Digit (이진수 숫자)
값: 0 또는 1
예시:
0 → 꺼짐 (전구 꺼짐, 스위치 OFF)
1 → 켜짐 (전구 켜짐, 스위치 ON)
Byte (바이트)
Byte는 8개의 Bit입니다.
1 Byte = 8 Bits
예시:
01001000 → 'H' (ASCII 코드 72)
01100101 → 'e' (ASCII 코드 101)
왜 8개인가?
역사적 이유:
- 초기 컴퓨터는 6비트, 7비트 등 다양
- IBM이 8비트를 표준화 (1960년대)
- 8비트 = 256가지 조합 (2^8)
- 영문 대소문자 + 숫자 + 특수문자 표현 충분
Bit와 Byte 표기
| 표기 | 의미 | 예시 |
|---|---|---|
| b (소문자) | Bit | 100Mbps (메가비트/초) |
| B (대문자) | Byte | 100MB (메가바이트) |
| 주의: 대소문자 구분이 매우 중요합니다! |
데이터 단위
2진수 기반 (컴퓨터 메모리)
2의 거듭제곱 사용:
| 단위 | 기호 | 값 | 계산 |
|---|---|---|---|
| Byte | B | 1 | 2^0 |
| Kibibyte | KiB | 1,024 | 2^10 |
| Mebibyte | MiB | 1,048,576 | 2^20 |
| Gibibyte | GiB | 1,073,741,824 | 2^30 |
| Tebibyte | TiB | 1,099,511,627,776 | 2^40 |
| 예시: |
RAM 8GB = 8 × 1,073,741,824 = 8,589,934,592 바이트
10진수 기반 (저장장치)
10의 거듭제곱 사용:
| 단위 | 기호 | 값 | 계산 |
|---|---|---|---|
| Byte | B | 1 | 10^0 |
| Kilobyte | KB | 1,000 | 10^3 |
| Megabyte | MB | 1,000,000 | 10^6 |
| Gigabyte | GB | 1,000,000,000 | 10^9 |
| Terabyte | TB | 1,000,000,000,000 | 10^12 |
| 예시: |
SSD 500GB = 500 × 1,000,000,000 = 500,000,000,000 바이트
KiB vs KB 차이
혼란의 원인:
1KB = 1,000 바이트 (10진수, SI 단위)
1KiB = 1,024 바이트 (2진수, IEC 표준)
차이: 1,024 - 1,000 = 24 바이트 (2.4%)
실제 영향:
| 용량 | 10진수 (GB) | 2진수 (GiB) | 차이 |
|---|---|---|---|
| 100GB | 100,000,000,000 | 93.13 GiB | 6.87% |
| 500GB | 500,000,000,000 | 465.66 GiB | 6.87% |
| 1TB | 1,000,000,000,000 | 931.32 GiB | 6.87% |
| 왜 500GB SSD가 465GB로 보이나요? |
제조사: 500GB = 500,000,000,000 바이트 (10진수)
OS: 500,000,000,000 ÷ 1,073,741,824 = 465.66 GiB (2진수)
이진수 표현
이진수 기초
10진수를 2진수로 변환:
10진수: 13
2진수: 1101
계산:
13 = 8 + 4 + 1
= 2³ + 2² + 2⁰
= 1×8 + 1×4 + 0×2 + 1×1
= 1101₂
2진수 → 10진수
1101₂ = ?
자릿수: 2³ 2² 2¹ 2⁰
값: 8 4 2 1
비트: 1 1 0 1
계산: 1×8 + 1×4 + 0×2 + 1×1 = 13
10진수 → 2진수
13을 2진수로 변환:
13 ÷ 2 = 6 ....나머지 1 ↑
6 ÷ 2 = 3 ....나머지 0 |
3 ÷ 2 = 1 ....나머지 1 |
1 ÷ 2 = 0 ....나머지 1 |
아래에서 위로 읽기: 1101₂
프로그래밍 언어별 표현
// C++
int x = 0b1101; // 2진수 리터럴 (C++14)
int y = 13; // 10진수
int z = 0xD; // 16진수
std::cout << std::bitset<8>(13); // "00001101"
# Python
x = 0b1101 # 2진수
y = 13 # 10진수
z = 0xD # 16진수
print(bin(13)) # "0b1101"
print(hex(13)) # "0xd"
// JavaScript
const x = 0b1101; // 2진수
const y = 13; // 10진수
const z = 0xD; // 16진수
console.log((13).toString(2)); // "1101"
console.log((13).toString(16)); // "d"
네트워크 속도
Mbps vs MB/s
가장 헷갈리는 부분:
Mbps = Megabits per second (메가비트/초)
MB/s = Megabytes per second (메가바이트/초)
변환: Mbps ÷ 8 = MB/s
실전 계산
100Mbps 인터넷:
// 실행 예제
100Mbps = 100 메가비트/초
= 100 ÷ 8 메가바이트/초
= 12.5 MB/s
1GB 파일 다운로드 시간:
1,000MB ÷ 12.5MB/s = 80초
1Gbps 인터넷:
1Gbps = 1,000Mbps
= 1,000 ÷ 8 MB/s
= 125 MB/s
1GB 파일 다운로드 시간:
1,000MB ÷ 125MB/s = 8초
네트워크 속도 비교
| 속도 | Mbps | MB/s | 1GB 다운로드 |
|---|---|---|---|
| 느린 ADSL | 10 | 1.25 | 13분 20초 |
| 일반 인터넷 | 100 | 12.5 | 1분 20초 |
| 기가 인터넷 | 1,000 | 125 | 8초 |
| 10기가 인터넷 | 10,000 | 1,250 | 0.8초 |
왜 8로 나누나?
네트워크 전송 구조:
데이터 전송 단위:
[시작 비트][데이터 8비트][패리티 비트][정지 비트]
실제 데이터: 8비트
오버헤드: 시작/정지/패리티 비트
따라서: 1 Byte 전송 ≈ 10 Bits 필요
간단히: Mbps ÷ 8 = MB/s
실전 계산
파일 크기 계산
텍스트 파일:
"Hello" = 5글자
ASCII 인코딩:
H = 01001000 (1 Byte)
e = 01100101 (1 Byte)
l = 01101100 (1 Byte)
l = 01101100 (1 Byte)
o = 01101111 (1 Byte)
총 크기: 5 Bytes
UTF-8 한글:
"안녕" = 2글자
UTF-8 인코딩:
안 = 11101010 10110000 10010000 (3 Bytes)
녕 = 11101010 10110001 10010101 (3 Bytes)
총 크기: 6 Bytes
이미지 크기 계산
RGB 이미지:
해상도: 1920 × 1080 (Full HD)
색상: RGB (각 8비트)
계산:
픽셀 수 = 1920 × 1080 = 2,073,600
각 픽셀 = R(1 Byte) + G(1 Byte) + B(1 Byte) = 3 Bytes
총 크기 = 2,073,600 × 3 = 6,220,800 Bytes
= 6,220,800 ÷ 1,024 = 6,075 KB
= 6,075 ÷ 1,024 = 5.93 MB
압축 효과:
원본: 5.93 MB
JPEG (80% 품질): 약 500 KB (91% 압축)
PNG (무손실): 약 2 MB (66% 압축)
WebP (80% 품질): 약 300 KB (95% 압축)
동영상 크기 계산
1분 Full HD 동영상:
해상도: 1920 × 1080
프레임: 30 FPS
시간: 60초
계산:
프레임 수 = 30 × 60 = 1,800
각 프레임 = 5.93 MB (위 계산)
총 크기 = 1,800 × 5.93 MB = 10,674 MB (압축 전)
H.264 압축 (일반):
10,674 MB → 약 100 MB (99% 압축)
메모리 사용량 계산
배열 메모리:
// C++
int arr[1000]; // int는 4바이트
메모리 사용량:
1,000 × 4 = 4,000 Bytes = 4 KB
구조체 메모리:
struct Person {
char name[20]; // 20 Bytes
int age; // 4 Bytes
double salary; // 8 Bytes
}; // 총 32 Bytes (패딩 제외)
Person people[1000];
메모리 사용량:
1,000 × 32 = 32,000 Bytes = 32 KB
트러블슈팅
1. 파일 크기가 다르게 표시됨
문제:
Windows: 파일 크기 1,024 KB
macOS: 파일 크기 1.0 MB
원인:
- Windows: 1,024 KB (2진수)
- macOS: 1.0 MB (10진수) 해결:
실제 크기: 1,048,576 Bytes
Windows: 1,048,576 ÷ 1,024 = 1,024 KB
macOS: 1,048,576 ÷ 1,000,000 = 1.05 MB
2. 네트워크 속도가 느림
문제:
인터넷: 100Mbps
다운로드 속도: 10 MB/s (예상: 12.5 MB/s)
원인:
- 네트워크 오버헤드 (프로토콜, 헤더)
- 실제 속도는 이론치의 80-90% 계산:
100Mbps ÷ 8 = 12.5 MB/s (이론)
12.5 × 0.8 = 10 MB/s (실제)
3. 메모리 부족 에러
문제:
int arr[1000000000]; // 10억 개
// 메모리 부족 에러
원인:
필요 메모리:
1,000,000,000 × 4 Bytes = 4,000,000,000 Bytes
= 4 GB
스택 메모리 제한: 보통 8 MB
해결:
// 힙 메모리 사용
vector<int> arr(1000000000); // 힙에 할당
// 또는 동적 할당
int* arr = new int[1000000000];
마무리
Bit, Byte, KB, MB, GB는 프로그래머의 기본 언어입니다. 핵심 요약:
- 1 Byte = 8 Bits
- 1 KiB = 1,024 Bytes (2진수, 메모리)
- 1 KB = 1,000 Bytes (10진수, 저장장치)
- Mbps ÷ 8 = MB/s (네트워크 속도) 실전 팁:
- 메모리 계산: 2의 거듭제곱 (1024)
- 파일 크기: 상황에 따라 다름
- 네트워크: 비트(b) vs 바이트(B) 구분 다음 단계:
- 비트 연산 완벽 가이드
- 진법 변환 가이드
- 메모리 구조 이해 이제 데이터 단위를 완벽히 이해했으니, 비트 연산으로 넘어가 보세요!
심화 부록: 구현·운영 관점
이 부록은 앞선 본문에서 다룬 주제(「Bit·Byte·KB·MB·GB 완벽 가이드 | 데이터 단위와 이진수 표현」)를 구현·런타임·운영 관점에서 다시 압축합니다. 도메인별 세부 구현은 글마다 다르지만, 입력 검증 → 핵심 연산 → 부작용(I/O·네트워크·동시성) → 관측의 흐름으로 장애를 나누면 원인 추적이 빨라집니다.
내부 동작과 핵심 메커니즘
flowchart TD A[입력·요청·이벤트] --> B[파싱·검증·디코딩] B --> C[핵심 연산·상태 전이] C --> D[부작용: I/O·네트워크·동시성] D --> E[결과·관측·저장]
sequenceDiagram participant C as 클라이언트/호출자 participant B as 경계(런타임·게이트웨이·프로세스) participant D as 의존성(API·DB·큐·파일) C->>B: 요청/이벤트 B->>D: 조회·쓰기·RPC D-->>B: 지연·부분 실패·재시도 가능 B-->>C: 응답 또는 오류(코드·상관 ID)
- 불변 조건(Invariant): 버퍼 경계, 프로토콜 상태, 트랜잭션 격리, FD 상한 등 단계별로 문장으로 적어 두면 디버깅 비용이 줄어듭니다.
- 결정성: 순수 층과 시간·네트워크·스케줄에 의존하는 층을 분리해야 테스트와 장애 분석이 쉬워집니다.
- 경계 비용: 직렬화, 인코딩, syscall 횟수, 락 경합, 할당·GC, 캐시 미스를 의심 목록에 둡니다.
- 백프레셔: 생산자가 소비자보다 빠를 때 버퍼·큐·스트림에서 속도를 줄이는 신호를 어디에 둘지 정의합니다.
프로덕션 운영 패턴
| 영역 | 운영 관점 질문 |
|---|---|
| 관측성 | 요청 단위 상관 ID, 에러율·지연 p95/p99, 의존성 타임아웃·재시도가 대시보드에 보이는가 |
| 안전성 | 입력 검증·권한·비밀·감사 로그가 코드 경로마다 일관적인가 |
| 신뢰성 | 재시도는 멱등 연산에만 적용되는가, 서킷 브레이커·백오프·DLQ가 있는가 |
| 성능 | 캐시·배치 크기·커넥션 풀·인덱스·백프레셔가 데이터 규모에 맞는가 |
| 배포 | 롤백 룬북, 카나리/블루그린, 마이그레이션·피처 플래그가 문서화되어 있는가 |
| 용량 | 피크 트래픽·디스크·FD·스레드 풀 상한을 주기적으로 검증하는가 |
스테이징은 데이터 양·네트워크 RTT·동시성을 프로덕션에 가깝게 맞출수록 재현율이 올라갑니다.
확장 예시: 엔드투엔드 미니 시나리오
앞선 본문 주제(「Bit·Byte·KB·MB·GB 완벽 가이드 | 데이터 단위와 이진수 표현」)를 배포·운영 흐름에 맞춰 옮긴 체크리스트입니다. 도메인에 맞게 단계 이름만 바꿔 적용할 수 있습니다.
- 입력 계약 고정: 스키마·버전·최대 페이로드·타임아웃·에러 코드를 경계에 둔다.
- 핵심 경로 계측: 요청 ID, 단계별 지연, 외부 호출 결과 코드를 로그·메트릭·트레이스에서 한 흐름으로 본다.
- 실패 주입: 의존성 타임아웃·5xx·부분 데이터·락 대기를 스테이징에서 재현한다.
- 호환·롤백: 설정/마이그레이션/클라이언트 버전을 되돌릴 수 있는지 확인한다.
- 부하 후 검증: 피크 대비 p95/p99, 에러율, 리소스 상한, 알림 임계값을 점검한다.
handle(request):
ctx = newCorrelationId()
validated = validateSchema(request)
authorize(validated, ctx)
result = domainCore(validated)
persistOrEmit(result, idempotentKey)
recordMetrics(ctx, latency, outcome)
return result
문제 해결(Troubleshooting)
| 증상 | 가능 원인 | 조치 |
|---|---|---|
| 간헐적 실패 | 레이스, 타임아웃, 외부 의존성, DNS | 최소 재현 스크립트, 분산 트레이스·로그 상관관계, 재시도·서킷 설정 점검 |
| 성능 저하 | N+1, 동기 I/O, 락 경합, 과도한 직렬화, 캐시 미스 | 프로파일러·APM으로 핫스팟 확인 후 한 가지씩 제거 |
| 메모리 증가 | 캐시 무제한, 구독/리스너 누수, 대용량 버퍼, 커넥션 미반납 | 상한·TTL·힙/FD 스냅샷 비교 |
| 빌드·배포만 실패 | 환경 변수, 권한, 플랫폼 차이, lockfile | CI 로그와 로컬 diff, 런타임·이미지 버전 핀 |
| 설정 불일치 | 프로필·시크릿·기본값, 리전 | 스키마 검증된 설정 단일 소스와 배포 매트릭스 표준화 |
| 데이터 불일치 | 비멱등 재시도, 부분 쓰기, 캐시 무효화 누락 | 멱등 키·아웃박스·트랜잭션 경계 재검토 |
권장 순서: (1) 최소 재현 (2) 최근 변경 범위 축소 (3) 환경·의존성 차이 (4) 관측으로 가설 검증 (5) 수정 후 회귀·부하 테스트.
배포 전에는 git add → git commit → git push 후 npm run deploy 순서를 권장합니다.
자주 묻는 질문 (FAQ)
Q. 이 내용을 실무에서 언제 쓰나요?
A. Bit, Byte, KB, MB, GB 등 데이터 단위를 완벽히 이해합니다. 이진수 표현, 2의 거듭제곱, KiB vs KB 차이, 네트워크 속도 표시 방식까지 실전 예제로 설명합니다. Start now. 실무에서는 위 본문의 예제와 선택 가이드를 참고해 적용하면 됩니다.
Q. 선행으로 읽으면 좋은 글은?
A. 각 글 하단의 이전 글 또는 관련 글 링크를 따라가면 순서대로 배울 수 있습니다. C++ 시리즈 목차에서 전체 흐름을 확인할 수 있습니다.
Q. 더 깊이 공부하려면?
A. cppreference와 해당 라이브러리 공식 문서를 참고하세요. 글 말미의 참고 자료 링크도 활용하면 좋습니다.
같이 보면 좋은 글 (내부 링크)
이 주제와 연결되는 다른 글입니다.
- 진법 변환 완벽 가이드 | 2진수·8진수·10진수·16진수 변환과 활용
- C++ Memory Pool | ‘메모리 풀’ 가이드
- C++ Object Pool | ‘객체 풀’ 가이드
이 글에서 다루는 키워드 (관련 검색어)
CS기초, Bit, Byte, 이진수, 데이터단위, KB, MB, GB 등으로 검색하시면 이 글이 도움이 됩니다.