이번 주 핵심 질문
컴퓨터는 숫자와 문자를 어떻게 저장하고, 복잡한 정보를 어떻게 다룰까?
컴퓨터는 숫자, 문자, 사진, 소리 등 다양한 자료를 비트의 조합으로 표현한다.
비트(Bit)는 0 또는 1을 나타내는 기본 단위이다. 바이트(Byte)는 일반적으로 비트 8개를 묶은 단위이다.
| 단위 | 의미 | 예시 |
|---|---|---|
| 비트(Bit) | 0 또는 1을 표현하는 단위 | 1 |
| 바이트(Byte) | 비트 8개를 묶은 단위 | 01000001 |
비트가 하나라면 두 가지 상태를 표현할 수 있다. 비트가 두 개라면 네 가지 상태를 표현할 수 있다.
0, 100, 01, 10, 11즉, n비트로 구분할 수 있는 비트 조합은 2ⁿ개이다.
다만 그 조합을 숫자, 문자, 색상 중 무엇으로 해석할지는 사용하는 규칙에 따라 달라진다.
우리가 일상에서 사용하는 십진수는 0부터 9까지 열 개의 숫자를 사용한다. 이진수는 0과 1만 사용한다.
십진수에서 각 자릿값이 1, 10, 100으로 커지는 것처럼, 이진수의 자릿값은 오른쪽부터 1, 2, 4, 8로 커진다.
예를 들어 이진수 1101을 십진수로 바꾸면 다음과 같다.
| 자릿값 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|
| 비트 | 1 | 1 | 0 | 1 |
| 계산 | 8 | 4 | 0 | 1 |
8 + 4 + 0 + 1 = 13
따라서 이진수 1101은 십진수 13이다.
정해진 비트 수 안에서 음수를 표현하는 대표적인 방법이 2의 보수이다.
8비트로 −5를 표현하는 과정을 살펴보자.
000001011111101011111011따라서 8비트 2의 보수 표현에서 11111011은 −5이다.
같은 비트열도 해석 방식에 따라 값이 달라진다.
| 비트열 | 해석 방식 | 값 |
|---|---|---|
11111011 | 부호 없는 8비트 정수 | 251 |
11111011 | 2의 보수 부호 있는 8비트 정수 | −5 |
핵심은 비트열만으로 의미가 정해지는 것은 아니라는 점이다.
소수점이 있는 수는 흔히 부동소수점(Floating Point) 방식으로 표현한다.
부동소수점은 제한된 비트 안에 수를 표현하므로 모든 실수를 정확하게 저장할 수는 없다. 특히 십진수에서 간단한 소수라도 이진수에서는 무한히 이어질 수 있다.
예를 들어 0.1은 일반적인 이진 부동소수점에서 정확하게 표현되지 않는다. 따라서 계산 결과에 아주 작은 오차가 생길 수 있다.
정수와 실수는 표현 방식이 다르며, 이 차이를 이해하면 프로그램의 계산 결과를 해석하는 데 도움이 된다.
컴퓨터는 문자에도 번호를 부여해 저장하고 처리한다. 이때 사용하는 규칙이 문자 인코딩(Character Encoding)이다.
ASCII는 영문자, 숫자, 기호, 제어 문자 등을 표현하는 문자 코드이다.
| 문자 | ASCII 십진수 코드 | 8자리로 적은 이진수 |
|---|---|---|
A | 65 | 01000001 |
B | 66 | 01000010 |
a | 97 | 01100001 |
0 | 48 | 00110000 |
ASCII 자체는 7비트 코드이며, 위 표에서는 보기 쉽게 8자리로 표시했다.
여기서 숫자 0과 문자 '0'은 다르다. 하나는 계산에 사용하는 수이고, 다른 하나는 숫자 모양의 문자이다.
ASCII만으로는 한글을 비롯한 세계의 다양한 문자를 표현하기 어렵다.
Unicode는 다양한 문자에 코드 포인트라는 고유한 번호를 부여하는 표준이다. UTF-8은 그 번호를 바이트열로 표현하는 인코딩 방식 중 하나이다.
| 구분 | 역할 |
|---|---|
| Unicode | 문자에 코드 포인트를 부여 |
| UTF-8 | 코드 포인트를 바이트열로 표현 |
UTF-8에서는 문자에 따라 1~4바이트를 사용한다. 영문 기본 문자는 보통 1바이트, 완성형 한글 음절은 3바이트로 표현된다.
따라서 문자열의 바이트 수가 화면에 보이는 글자 수와 항상 같지는 않다.
자료형(Data Type)은 값의 종류와 범위, 그리고 사용할 수 있는 연산을 정하는 데 도움을 준다.
C 언어의 대표적인 자료형을 살펴보자.
| 자료형 | 주요 용도 | 예시 |
|---|---|---|
int | 정수 | 학생 수, 점수 |
float | 부동소수점 수 | 측정값 |
double | 일반적으로 float보다 높은 정밀도의 부동소수점 수 | 평균값, 과학 계산 |
char | 문자 코드 등을 담는 정수형 | 영문 문자 한 개 |
자료형의 크기는 구현 환경에 따라 달라질 수 있다. C에서는 sizeof로 자료형이나 객체가 차지하는 바이트 수를 확인할 수 있다.
자료형을 정한다는 것은 단순히 저장 공간을 고르는 일이 아니다. 데이터가 어떤 의미를 가지며, 어떤 연산을 할 것인지 함께 결정하는 일이다.
학생 한 명을 표현하려면 학번, 이름, 성적처럼 서로 다른 종류의 자료가 필요하다.
C에서는 구조체(Structure)를 이용해 관련 자료를 묶을 수 있다.
struct Student {
int id;
char name[30];
double score;
};
| 코드 | 의미 |
|---|---|
struct Student | 학생 정보를 담는 구조체 정의 |
int id; | 정수형 학번 저장 |
char name[30]; | 이름을 저장할 문자 배열 |
double score; | 성적 저장 |
name[30]은 char 원소 30개를 저장할 공간이다. C 문자열은 끝에 종료 문자 '\0'이 필요하므로, 이 배열에는 종료 문자를 제외하고 최대 29바이트의 내용을 담을 수 있다.
한글처럼 여러 바이트를 사용하는 문자가 포함되면 저장 가능한 글자 수는 더 적어진다.
또한 실제 시스템의 학번은 앞자리 0이나 문자 포함 여부를 고려해 문자열로 저장하는 것이 적합할 수도 있다.
추상화(Abstraction)는 목적에 필요한 특징을 골라 표현하고, 불필요한 세부 사항을 감추는 과정이다.
성적 관리 프로그램에서 학생을 표현한다고 생각해 보자.
실제 학생은 다양한 특징을 가지고 있지만, 성적 관리에는 주로 다음 정보가 필요하다.
반면 신발 색이나 좋아하는 음식은 성적 관리의 목적과 직접 관련이 없다.
추상화에서는 “모든 정보를 담을까?”보다 “이 문제를 해결하는 데 어떤 정보가 필요한가?”를 먼저 묻는다.
구체화는 추상적으로 정한 개념과 기능을 실제로 동작하는 형태로 만드는 과정이다.
| 단계 | 학생 성적 관리 예시 |
|---|---|
| 추상화 | 학생은 학번, 이름, 성적을 가진다고 정함 |
| 구체화 | C 구조체의 각 멤버와 자료형으로 구현 |
| 처리 | 학생 정보를 추가하고 성적을 조회하는 코드 작성 |
같은 학생 정보라도 프로그램의 목적과 환경에 따라 다른 방식으로 구현할 수 있다.
스택 역시 “마지막에 넣은 것을 먼저 꺼낸다”는 규칙을 먼저 정하고, 실제 저장 방식은 배열이나 연결 리스트로 구현할 수 있다.
이처럼 추상화와 구체화를 구분하면 내부 구현이 바뀌어도 필요한 기능을 중심으로 생각할 수 있다.
| 핵심 개념 | 한 문장 정리 |
|---|---|
| 비트 | 0 또는 1을 표현하는 기본 단위 |
| 바이트 | 일반적으로 비트 8개를 묶은 단위 |
| 이진수 | 0과 1을 사용하는 수의 표현 |
| 2의 보수 | 정해진 비트 수에서 부호 있는 정수를 표현하는 방식 |
| 문자 인코딩 | 문자를 바이트열로 표현하는 규칙 |
| 자료형 | 값의 종류와 표현 범위, 연산을 정하는 기반 |
| 구조체 | 관련 있는 여러 자료를 하나로 묶는 C의 기능 |
| 추상화 | 목적에 필요한 특징과 기능을 골라 표현하는 과정 |
| 구체화 | 정한 개념과 기능을 실제 구현으로 옮기는 과정 |
컴퓨터의 자료를 이해하려면 저장된 비트뿐 아니라, 그 비트를 해석하는 규칙도 함께 알아야 한다.
1010을 십진수로 바꾸면 얼마인가?'0'은 어떻게 다른가?이번 주에는 개별 자료의 표현과 관련 자료를 묶는 방법을 살펴보았다.
다음에는 여러 데이터를 순서대로 저장하는 배열을 학습한다. 배열의 인덱스, 메모리 배치, 삽입과 삭제를 살펴보며 자료구조가 실제 프로그램에서 어떻게 동작하는지 확인한다.
태그: 자료구조 자료표현 이진수 자료형 추상화 C언어 수업노트 2주차