[혼공컴운] CH 02 데이터

sookyoung.k·2024년 1월 6일
0

🤓 [혼공학습단] 

목록 보기
3/23
post-thumbnail

🔢 0과 1로 숫자를 표현하는 방법

🕹️ 정보단위

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)
  • 바이트: 여덟 개의 비트를 묶은 단위
    • 2⁸(256)개의 정보를 표현
  • 킬로바이트: 1바이트 1000개를 묶은 단위
  • 메가바이트: 1킬로바이트 1000개를 묶은 단위
  • 기가바이트: 1메가바이트 1000개를 묶은 단위
  • 테라바이트: 1기가바이트 1000개를 묶은 단위

* 워드
CPU가 한 번에 처리할 수 있는 데이터 크기
→ 현대 컴퓨터의 워드 크기는 대부분 32비트 또는 64비트

🕹️ 이진법

0과 1만으로 모든 숫자를 표현하는 방법

우리가 일반적으로 숫자를 사용할 때 사용하는 표현 방법은 십진법
→ 숫자가 9를 넘어가는 시점에 자리 올림을 하여 0부터 9까지, 열 개의 숫자로 모든 수를 표현하는 방법

➡️ 이진법으로 표현한 수를 이진수, 십진법으로 표현한 수를 십진수라고 한다

혼동을 예방하기 위해 이진수 끝에 이진수 끝에 아래첨자 ⑵를 붙이거나(수학적 표기) 이진수 앞에 0b를 붙인다(코드 상의 표기)

✔️ 이진수의 음수 표현: 2의 보수

주로 사용하는방법은 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로 변환해야 비로소 컴퓨터가 이해할 수 있다문자 인코딩

  • 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

한글 - 음절 하나하나가 초성, 중성, 종성의 조합으로 이루어져 있다

완성형 인코딩

초정, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드 부여

조합형 인코딩

초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당

EUC-KR은 KS X 1001, KS X 1003이라는 문자 집합을 기반으로 하는 대표적인 완성형 인코딩 방식

→ 초성, 중성, 종성이 모두 결합된 한글 단어에 2바이트 크기의 코드 부여
→ 2바이트 코드는 16비트가 필요 → 네 자리 십육진수로 표현 가능
➡️ EUC-KR로 인코딩 된 한글은 네 자리 십육진수로 나타낼 수 있다

* 이것도 모든 한글 조합을 표현할 수 있을 정도의 많은 양은 아니다

🗃️ 유니코드와 UTF-8

* 만약 모든 나라 언어의 문자 집합과 인코딩 방식이 통일되어 있다면?! 언어별로 인코딩을 해야 하는 수고로움을 덜 수 있지 않을까?!

🕹️ 유니코드

훨씬 다양한 한글을 포함하며 대부분 나라의 문자, 특수문자, 화살표나 이모티콘까지도 코드로 표현할 수 있는 통일된 문자 집합!!!

유니코드 문자 집합에서는 아스키 코드나 EUC-KR과 같이 각 문자마다 고유한 값이 부여된다

'한' → D55C⒃
'글' → AE00⒃

아스키 코드나 EUC-KR은 글자에 부여된 값을 그대로 인코딩 값으로 삼았지만,
유니코드는 부여된 값 자체를 인코딩 된 값으로 삼지 않고 이 값을 다양한 방법으로 인코딩한다!!!
➡️ UTF-8, UTF-16, UTF-32 등의 방식으로 유니코드 문자에 부여된 값을 인코딩한다

UTF-8

통상 1바이트부터 4바이트까지의 인코딩 결과를 만들어 낸다
크기는 유니코드 문자에 부여된 값의 범위에 따라서 결정된다

코드포인트 범위인코딩 방법크기
0000~007F그대로 인코딩1 byte
0080~07FF110xxxxx 10xxxxxx2 byte
0800~FFFF1110xxxx 10xxxxxx 10xxxxxx3 byte
10000~1FFFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx4 byte

'한' → D55C⒃
'글' → AE00⒃

모두 0800과 FFFF 사이에 있다 ➡️ 인코딩 시 3바이트임을 알 수 있다

코드포인트 범위인코딩 방법크기
0800~FFFF1110xxxx 10xxxxxx 10xxxxxx3 byte

각각 이진수로 변환한, 즉 UTF-8 방식으로 인코딩한 결과는 아래가 된다.

'한' → 1101 0101 0101 1100⑵

'글' → 1010 1110 0000 0000⑵

profile
영차영차 😎

0개의 댓글