이 레슨과 관련된 학습 키워드
컴퓨터 과학 & 프로그래밍 — 문제 해결의 도구 → C 프로그래밍 — 하드웨어에 가장 가까운 언어 → C 프로그래밍 — 하드웨어에 가장 가까운 언어 → 기초
Static arrays, multidimensional arrays, null-terminated strings, string functions, buffer overflow, safe string handling.
오늘은 배열과 문자열이 왜 필요한지 알아보겠습니다.
단일 변수만으로는 대량의 데이터를 다룰 수 없습니다.
그림 왼쪽 위를 보시면 변수를 하나씩 선언한 모습이 보입니다.
temp0, temp1처럼 1000개를 각각 따로 선언해야 합니다.
이건 완전히 관리가 불가능한 방식이죠.
배열을 쓰면 이 문제가 바로 해결됩니다.
float temp[1000]이라고 선언하면 끝입니다.
연속된 4000바이트를 한 번에 확보하는 겁니다.
그림 가운데 메모리 주소를 보시면, 0x1000부터 4바이트씩 늘어납니다.
각 원소가 정확히 4바이트 간격으로 배치되는 구조입니다.
그림 중간 수식을 보시면 랜덤 접근 공식이 나옵니다.
주소는 시작 주소 더하기 인덱스 곱하기 원소 크기입니다.
temp[500]에 접근하면 0x1000 더하기 500 곱하기 4, 즉 0x17D0입니다.
탐색 없이 딱 한 번의 연산으로 바로 접근합니다.
이것이 상수 시간 랜덤 접근의 힘입니다.
이제 문자열 부분으로 넘어가겠습니다.
C에는 문자열 타입이 따로 없습니다.
char 배열에 끝 표시 규약을 더한 것이 C의 문자열입니다.
그림 중간을 보시면 "hello"의 저장 구조가 나옵니다.
h, e, l, l, o 다섯 글자이지만 실제로는 6바이트입니다.
마지막 칸에는 널 종단 문자 '\0'이 들어갑니다.
'\0'을 만나야 문자열의 끝을 알 수 있습니다.
배열에는 길이 정보가 없기 때문에 '\0'이 꼭 필요합니다.
strlen(), printf() 같은 모든 함수가 이 규약에 의존합니다.
그림 하단 오른쪽을 보시면 C의 설계 철학이 정리되어 있습니다.
최소한의 추상화, 메모리 오버헤드 제로가 목표입니다.
char 배열과 '\0' 규약만으로 하드웨어에 가장 가깝게 표현합니다.
그림 맨 아래를 보시면 배열이 필수인 시스템 영역이 나옵니다.
OS 커널의 페이지 테이블, 임베디드 센서 버퍼가 모두 배열입니다.
네트워크 패킷 버퍼, 그래픽스 픽셀 버퍼도 마찬가지입니다.
연속 메모리는 상수 시간 접근, 캐시 친화성, 최소 오버헤드를 제공합니다.
이것이 C 배열이 시스템 프로그래밍의 근간인 이유입니다.