기타 Lobsters · 2026-10-14

“C언어 문자열 왜 이따위냐” 분통 터져 직접 라이브러리 만들어버린 개발자

핵심 요약
  • 현대 언어와 달리 별도의 문자열 타입 없이 널 종료(NUL-terminated) 방식을 고수하는 C언어의 구조적 한계와 불편함이 지적되었습니다.
  • C언어 문자열은 길이를 알기 위해 O(n) 탐색이 필요하고 부분 문자열 추출 시 메모리 복사가 강제되며 누락 시 프로세스 강제 종료 위험이 있습니다.
  • 작성자는 데이터 포인터와 길이를 묶은 '스트링 뷰' 구조체를 정의해 단 하나의 C 파일로 문자열 작업을 개선하는 경량 라이브러리를 선보였습니다.
요약 현대 프로그래밍 언어들과 달리 C언어에는 온전한 문자열(String) 타입이 존재하지 않는다. C언어 특유의 단순함을 아끼는 개발자라 할지라도 이 점만큼은 오랜 불만거리로 꼽히곤 한다. 한 해외 개발자는 이러한 불편함을 해소하고자 단 하나의 C 파일로 구성된 경량 라이브러리를 직접 개발하고 그 설계 배경을 공개했다. 개발자가 지적한 C언어의 가장 큰 한계는 문자열이 단순한 '널 종료 문자 배열(NUL-terminated character array)'로 다뤄진다는 점이다. C언어가 처음 개발되던 시기에는 메모리를 아끼고 언어를 단순하게 유지하기 위해 문자열 끝에 1바이트 크기의 널 문자('\0')를 붙여 끝을 표시하는 방식을 택했다. 하지만 이러한 구조는 현대 컴퓨팅 환경에서 여러 심각한 비효율과 문제를 낳는다. 첫 번째 문제는 문자열 길이를 측정하는 연산이다. 길이를 별도로 저장하지 않기 때문에 길이를 파악하려면 배열의 시작부터 널 문자가 나올 때까지 일일이 세어야 하며, 이로 인해 시간 복잡도가 O(n)으로 치솟는다. 백만 자가 넘는 텍스트라면 길이를 확인하는 것만으로도 상당한 CPU 연산이 낭비된다. 두 번째 문제는 부분 문자열(substring)을 다룰 때 발생하는 메모리 할당 및 복사 오버헤드다. 예를 들어 "Hello World"라는 문자열에서 앞부분의 "Hello"만 읽어 다른 함수로 넘기려 할 경우, 기존 방식에서는 원본 중간에 널 문자를 삽입해 원본을 훼손하거나, 결국 힙 메모리를 할당(malloc)하고 내용을 복사(memcpy)한 뒤 널 문자를 붙여야만 한다. 마지막 문제는 안전성이다. 만약 널 종료 문자가 빠진 포인터가 문자열 함수로 전달되면, 우연히 널 문자를 발견할 때까지 혹은 메모리 무단 접근으로 운영체제가 프로세스를 강제 종료할 때까지 계속 메모리를 읽어 들이는 치명적인 오류가 발생할 수 있다. 작성자는 이러한 문제를 해결하기 위해 불변 데이터 포인터와 문자열 길이를 하나의 구조체로 묶은 '스트링 뷰(str_view)' 방식을 도입했다. 이를 통해 불필요한 메모리 복사 없이도 부분 문자열을 안전하고 빠르게 다룰 수 있게 구성했다고 설명했다.
Sponsored · 광고