0과 1을 나타내는 가장 작은 정보 단위를 비트라고 한다
→ n비트는 2ⁿ가지 정보를 표현할 수 있다
단위 | 크기 |
---|---|
1바이트(byte) | 8비트(8bit) |
1킬로바이트(1kB) | 1,000바이트(1,000byte) |
1메가바이트(1kB) | 1,000킬로바이트(1,000kB) |
1기가바이트(1GB) | 1,000메가바이트(1,000MB) |
1테라바이트(1TB) | 1,000기가바이트(1,000GB) |
워드
CPU가 한 번에 처리할 수 있는 데이터 크기
→ 현대 컴퓨터의 워드 크기는 대부분 32비트 또는 64비트
0과 1만으로 모든 숫자를 표현하는 방법
우리가 일반적으로 숫자를 사용할 때 사용하는 표현 방법은 십진법
→ 숫자가 9를 넘어가는 시점에 자리 올림을 하여 0부터 9까지, 열 개의 숫자로 모든 수를 표현하는 방법
➡️ 이진법으로 표현한 수를 이진수, 십진법으로 표현한 수를 십진수라고 한다
혼동을 예방하기 위해 이진수 끝에 이진수 끝에 아래첨자 ⑵를 붙이거나(수학적 표기) 이진수 앞에 0b를 붙인다(코드 상의 표기)
주로 사용하는방법은 2의 보수를 구해 이 값을 음수로 간주하는 방법이다
(완벽한 방식은 아니다)
➡️ '어떤 수를 그보다 큰 2ⁿ에서 뺀 값'을 의미
하지만... 뭔 소린지 1도 모르겠죠?
'모든 0과 1을 뒤집고, 거기에 1을 더한 값'으로 이해하면 된다! (휴 다행 ^^)
하지만 2진수만 봐서는 이게 음수인지 양수인지 구분하기 어려운 경우가 많다!!!
그럴 때 사용하는 것이 바로 플래그(flag)이다!
➡️ 컴퓨터 내부에서 어떤 값을 다룰 때 부가 정보가 필요한 경우 플래그를 사용한다
수가 15를 넘어가는 시점에서 자리 올림을 하는 숫자 표현 방식
십진수 10, 11, 12, 13, 14, 15를 십육진법에서는 각각 A, B, C, D, E로 표기한다
→ 숫자 뒤에 아래첨자 ⒃를 붙이거나(수학적 표기 방식) 숫자 앞에 0x를 붙여 구분한다(코드상 표기 방식)
굳이 십육진법을 사용하는 이유는??
➡️ 이진수를 십육진수로, 십육진수를 이진수로 변환하기 쉽기 때문!
십육진수는 한 글자당 열여섯 종류(1~9, A~F)의 숫자를 표현할 수 있다
→ 십육진수를 이루는 숫자 하나를 이진수로 표현하기 위해서는 4비트가 필요(2⁴=16)
십육진수 한 글자를 4비트의 이진수로 간주한다!
십육진수를 이루고 있는 각 글자를 따로따로 (4개의 숫자로구성된) 이진수로 변환하고, 그대로 이어 붙이면 십육진수가 이진수로 변환된다
이진수 숫자를 네 개씩 끊고, 끊어준 네 개의 숫자를 하나의 십육진수로 변환한 뒤 그대로 이어붙이면 된다
문자 집합 - 컴퓨터가 인식하고 표현할 수 있는 문자의 모음
문자 집합에 속한 문자라고 해서 컴퓨터가 그대로 이해할 수는 없다 문자를 0과 1로 변환해야 비로소 컴퓨터가 이해할 수 있다 → 문자 인코딩
0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정 → 문자 디코딩
아스키(ASCII) - 초창기 문자 집합 중 하나
영어 알파벳과 아라비아 숫자, 그리고 일부 특수 문자 포함
➡️ 아스키 문자들은 각각 7비트로 표현: 표현할 수 있는 정보의 가짓수 2⁷개(128개)
실제로는 8비트(1바이트)를 사용하지만 8비트 중 1비트는 패리티 비트라고 불리는 오류 검출을 위해 사용되는 비트
0부터 127까지 총 128개의 숫자 중 하나의 고유한 수에 일대일로 대응된다
아스키 문자에 대응된 고유한 수를 아스키 코드라고 한다
→ 아스키 코드를 이진수로 표현함으로써 아스키 문자를 0과 1로 표현
ex. 'A' → 십진수 65(이진수 1000001⑵)로 인코딩, 'a' → 십진수 97(이진수 1100001⑵)로 표현됨
글자에 부여된 고유한 값을 코드 포인트라고 한다
단점! 한글을 표현할 수 없다 (확장 아스키가 등장하기도 했지만 턱없이 부족)
→ 한국을 포함한 영어권 외의 나라들은 고유한 문자 집합과 인코딩 방식의 필요성을 느낀다 ➡️ EUC-KR)
한글 - 음절 하나하나가 초성, 중성, 종성의 조합으로 이루어져 있다
초정, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드 부여
초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당
EUC-KR은 KS X 1001, KS X 1003이라는 문자 집합을 기반으로 하는 대표적인 완성형 인코딩 방식
→ 초성, 중성, 종성이 모두 결합된 한글 단어에 2바이트 크기의 코드 부여
→ 2바이트 코드는 16비트가 필요 → 네 자리 십육진수로 표현 가능
➡️ EUC-KR로 인코딩 된 한글은 네 자리 십육진수로 나타낼 수 있다
이것도 모든 한글 조합을 표현할 수 있을 정도의 많은 양은 아니다
만약 모든 나라 언어의 문자 집합과 인코딩 방식이 통일되어 있다면?! 언어별로 인코딩을 해야 하는 수고로움을 덜 수 있지 않을까?!
훨씬 다양한 한글을 포함하며 대부분 나라의 문자, 특수문자, 화살표나 이모티콘까지도 코드로 표현할 수 있는 통일된 문자 집합!!!
유니코드 문자 집합에서는 아스키 코드나 EUC-KR과 같이 각 문자마다 고유한 값이 부여된다
'한' → D55C⒃
'글' → AE00⒃
아스키 코드나 EUC-KR은 글자에 부여된 값을 그대로 인코딩 값으로 삼았지만,
유니코드는 부여된 값 자체를 인코딩 된 값으로 삼지 않고 이 값을 다양한 방법으로 인코딩한다!!!
➡️ UTF-8, UTF-16, UTF-32 등의 방식으로 유니코드 문자에 부여된 값을 인코딩한다
통상 1바이트부터 4바이트까지의 인코딩 결과를 만들어 낸다
크기는 유니코드 문자에 부여된 값의 범위에 따라서 결정된다
코드포인트 범위 | 인코딩 방법 | 크기 |
---|---|---|
0000~007F | 그대로 인코딩 | 1 byte |
0080~07FF | 110xxxxx 10xxxxxx | 2 byte |
0800~FFFF | 1110xxxx 10xxxxxx 10xxxxxx | 3 byte |
10000~1FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 4 byte |
'한' → D55C⒃
'글' → AE00⒃
모두 0800과 FFFF 사이에 있다 ➡️ 인코딩 시 3바이트임을 알 수 있다
코드포인트 범위 | 인코딩 방법 | 크기 |
---|---|---|
0800~FFFF | 1110xxxx 10xxxxxx 10xxxxxx | 3 byte |
각각 이진수로 변환한, 즉 UTF-8 방식으로 인코딩한 결과는 아래가 된다.
'한' → 1101 0101 0101 1100⑵
'글' → 1010 1110 0000 0000⑵