| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
- 간단
- 클러스터
- Kafka
- Redis
- Mac
- 자동
- Docker
- Jenkins
- 자바
- ec2
- 설정
- hive
- aws
- config
- fastcampus
- 젠킨스
- EMR
- java
- Zeppelin
- 예제
- gradle
- Cluster
- 머신러닝
- 레디스
- vue
- SpringBoot
- 로그인
- redash
- spring
- login
- Today
- Total
코알못
[문자인코딩] 01) 문자 인코딩이란? 본문

우리는 컴퓨터를 사용하면서 이런 의문을 가진다..
컴퓨터는 문자를 어떻게 저장할까?
컴퓨터는 우리가 보는 글자 그대로를 저장하지 않는다. 모든 정보를 0과 1로만 처리한다.
그 이유는 컴퓨터의 메모리는 반도체로 만들어져 있고
전기가 흐르냐(1) / 안 흐르냐(0) 두 가지 상태로만 데이터를 표현하기 때문이다.
그래서 컴퓨터는 모든 데이터를 이진수(0과 1) 로 표현한다.
컴퓨터에서 가장 작은 데이터 단위를 bit(비트) 라고 한다.
1bit는 0 또는 1 이진수 두 가지를 표현할 수 있다.
비트 별로 표현할 수 있는 가지수를 보자!
| 비트 | 표현 가능 수 |
| 1 bit | 0, 1 (2가지) |
| 2 bit | 00, 01, 10, 11 (4가지) |
| 3 bit | 000, 001, 011 .... (8가지) |
| 8 bit | 256가지 |
8bit는 256가지 경우를 표현할 수 있으며
이 8bit = 1byte(바이트) 라고 부른다.
그럼 숫자는 어떻게 저장할까 ?
예를 들어 10진수 100이라는 숫자를 저장한다고 해보자.
컴퓨터는 10진수를 직접 저장하지 않는다!
그래서 아래와 같이 10진수를 2진수로 변환하여 저장한다.
100 (10진수)
→ 1100100 (2진수)
이렇게 변환된 이진수 형태로 메모리에 저장된다.
그럼 음수는 어떻게 표현할까?
컴퓨터는 양수와 음수도 표현해야 한다. 그래서 보통 1bit를 부호 표현에 사용한다.
예를 들어 8bit를 사용한다고 해보자.
1bit → 부호
7bit → 숫자 표현
부호는 1bit 사용되며 양수는 0 , 음수는 1로 표현된다.
그래서 표현 범위는 이렇게 된다.
양수 : 0 ~ 127
음수 : -128 ~ -1
그럼 문자는 어떻게 저장할까?
숫자는 이진수로 바꾸면 된다. 하지만 문자는 어떨까?
A
B
a
b
위와 같은 문자를 0 과 1로 표현하기에는 어렵다.
여기서 등장하는 개념이 바로 문자 집합(Character Set) 이다.
문자 집합은 말 그대로 문자를 숫자에 매핑해 놓은 표이다.
예를 들어 이런 식이다.
A → 65
B → 66
a → 97
b → 98
그래서 컴퓨터는 문자 → 숫자 → 2진수 이렇게 변환해서 저장한다.
그리고 읽을 때는 반대로 2진수 → 숫자 → 문자 로 읽는다.
이 과정을 문자 인코딩, 디코딩이라고 표현한다.
문자 → 숫자 변환 = 문자 인코딩 (Encoding)
숫자 → 문자 변환 = 문자 디코딩 (Decoding)
그런데 문제가 발생했다..!
만약 컴퓨터마다 문자 집합이 다르면 어떻게 될까?
예를 들어
A = 65 (컴퓨터1)
A = 120 (컴퓨터2)
이러면 서로 데이터를 교환할 때 문자가 깨져버린다.
그래서 표준 문자 집합이 필요해졌다!
그래서 등장한 것이 바로
ASCII (American Standard Code for Information Interchange) 문자 집합이다.
ASCII는 7bit 문자 집합이다.
2^7 = 128개 문자를 표현할 수 있다.
대표적으로
- 영문 대문자
- 영문 소문자
- 숫자
- 기본 특수문자
같은 것들이 포함되어 있다.
하지만 문제점이 있었다. ASCII는 이름에서도 보이듯이 American 미국 중심 문자만 포함되어 있었다!
그래서 유럽에서 사용하기 위해 ISO-8859-1 (Latin-1) 이 등장했다.
ASCII는 7bit였지만 여기에 1bit를 추가해서 é 와 같은 라틴어을 포함하여 8bit로 만들었다.
2^8 = 256 문자
한국에서도 컴퓨터 사용이 늘어나면서 한글 표현 문제가 생겼다.
한글은 글자가 매우 많기 때문에 ASCII처럼 1byte로는 표현이 부족했다.
그래서 등장한 것이 EUC-KR 이다.
영문 → 1byte, 한글 → 2byte 로 표현 할 수 있으며 ASCII는 그대로 사용하여 호환이 가능하다.
그리고 2byte로도 충분히 공간이 남아서 한자와 일본어 일부도 포함되어있다.
윈도우에서는 EUC-KR을 확장한 MS949 인코딩을 사용한다.
EUC-KR이 표현하지 못하던 '쀍 등' 같은 잘 사용하지 않는 한글이 포함된다.
현재도 Windows 한글 시스템에서는 이전 윈도우 호환성을 위해 기본 인코딩으로 사용된다.
시간이 지나면서 문제가 생겼다.
컴퓨터가 전 세계적으로 사용되기 시작한 것이다.
그래서 모든 언어를 하나의 문자 집합으로 표현해야 했으며 그래서 등장한것이 유니코드(Unicode) 이다.
대표적인 인코딩 방식은 UTF-16, UTF-8 이 있다.
UTF-16은 기본으로 2byte 기반이며 일부 특수 문자(이모지, 고대문자 등)들은 4byte 를 사용한다.
하지만 ASCII 문자도 2byte 를 사용하기에 기존 ASCII(1byte를 사용하므로) 호환되지 않으며
저장 공간도 1byte > 2byte 로 늘어나게 되는 단점이 있다.
그래서 나온것이 UTF-8 이다.
UTF-8은 가변 길이 인코딩이다. 즉 문자에 따라 사용하는 byte가 달라진다.
1byte → ASCII, 영문, 기본 라틴 문자
2byte → 그리스어, 히브리어, 라틴 확장
3byte → 한글, 한자, 일본어
4byte → 이모지, 고대 문자
UTF-8 은 ASCII가 1byte 를 사용하기에 ASCII로 이전에 저장된 문자와 완벽히 호환되며
영문 문서의 경우 그대로 1byte 사용하므로 용량의 증가가 없고(대부분 문서가 영문, 코딩도 영문이므로 중요한 부분중 하나), 전세계 문자 표현도 가능하다.
그래서 현재까지 웹사이트, 앱, 서버, DB 와 같이 다양한 곳에서 가장 많이 사용하는 인코딩이 UTF-8가 되었다.
그래서 정리해보면
컴퓨터는 문자 → 숫자 → 이진수 로 데이터를 저장한다.
그리고 이 과정에서 필요한 것이 문자 집합, 문자 인코딩 이다.
ASCII에서 시작해서 EUC-KR, MS949를 거쳐
지금은 UTF-8이 사실상 표준 인코딩이 되었다.
'JAVA' 카테고리의 다른 글
| [문자인코딩] 02) 문자 인코딩/디코딩 실습 (0) | 2026.03.17 |
|---|---|
| [TDD] SpringBoot 를 통한 TDD 손쉬운 작성 - 05) 테스트 코드 품질 높이기! - 03 (0) | 2026.03.10 |
| [TDD] SpringBoot 를 통한 TDD 손쉬운 작성 - 04) 테스트 코드 품질 높이기! - 02 (0) | 2026.03.08 |
| [TDD] SpringBoot 를 통한 TDD 손쉬운 작성 - 03) 테스트 코드 품질 높이기! - 01 (1) | 2026.03.02 |
| [TDD] SpringBoot 를 통한 TDD 손쉬운 작성 - 02) TDD 작성 해보기! (0) | 2026.03.01 |