기타 Lobsters · 2026-10-07

Rust 먼저 배운 개발자가 C 언어 공부하다 식겁한 점들

핵심 요약
  • 시스템 프로그래밍 언어로 Rust를 먼저 배웠던 한 개발자가 최근 C 언어를 독학하며 겪은 생소하고 기묘했던 경험담을 블로그에 공유했다.
  • 참/거짓(boolean)이 기본 원시 타입이 아니었던 역사, 널 종단 문자열로 인한 수동 메모리 계산, OS에 따라 달라지는 정수 크기, NULL 반환 처리를 강제하지 않는 허술함 등 Rust와 판이한 C의 특성들을 짚었다.
  • 저자는 크로스 플랫폼 호환성을 위해 고정 너비 정수 타입을 사용하고, 메모리 할당 실패 등 잠재적 오류를 개발자가 항상 직접 챙겨야 한다고 조언했다.
요약 시스템 프로그래밍 언어로 C나 C++ 대신 Rust를 가장 먼저 접했던 한 개발자가, 최근 C 언어를 독학하며 느낀 기묘하고 당황스러운 특징들을 정리해 블로그에 공유했습니다. 대다수 개발자가 C나 C++을 먼저 익힌 뒤 Rust로 넘어오기 때문에 인터넷에는 온통 'C 개발자를 위한 Rust' 안내서만 있을 뿐 반대 방향의 글은 거의 없다는 점에서 착안한 경험담입니다. 저자가 가장 먼저 꼽은 당혹스러운 점은 불리언(Boolean) 타입이었습니다. 초기 C 언어에는 불리언 원시 타입조차 없어 정수 0과 1을 사용했고, C99에 이르러서야 <stdbool.h> 헤더를 통해 도입되었으나 이마저도 1과 0으로 치환되는 매크로 정의에 불과했습니다. C23에 와서야 진정한 언어 원시 타입으로 편입되었습니다. 문자열 처리 방식 또한 큰 문화 충격이었습니다. Rust는 8바이트 메모리 주소와 8바이트 길이를 합친 16바이트 구조로 &str을 다루는 반면, C는 길이를 별도로 저장하지 않고 끝에 널 바이트('\0')를 붙여 종단을 표시합니다. 이 때문에 빈 문자열도 1바이트를 차지하며, 문자열 뒤집기 같은 간단한 작업에서도 널 종료 문자를 위한 공간(+1)을 잊지 않고 직접 할당해 넣어야 하고, 이를 빠뜨리면 메모리 범위 초과 읽기 오류가 발생합니다. 운영체제와 타깃 환경에 따라 정수형의 비트 크기가 제각각인 점도 혼란을 더했습니다. 대표적으로 'long' 타입은 64비트 유닉스에서는 64비트이지만 64비트 윈도우에서는 32비트에 불과합니다. 저자는 크로스 플랫폼 호환성을 확보하려면 <stdint.h>에서 제공하는 uint32_t, int64_t 같은 고정 너비 정수 타입을 써야 한다고 조언했습니다. 마지막으로 Result 타입과 패턴 매칭으로 컴파일 단계에서 완벽한 에러 처리를 유도하는 Rust와 달리, C는 -1이나 NULL 같은 매직 넘버 반환에 의존하고 언어 차원에서 에러 처리를 강제하지 않아 malloc 메모리 할당 실패 검사를 깜빡하는 순간 곧바로 세그멘테이션 오류(segfault)로 이어진다며 아쉬움을 드러냈습니다.
Sponsored · 광고