IBM®
메인 컨텐츠로 가기
    Korea [국가변경]    이용약관
 
 
   
        제품    서비스 & 솔루션    고객지원 & 다운로드    회원 서비스    
한국 developerWorks   >  dW Column  > developerworks
개발자 책꽂이

신년 특집: 고전 탐험 1탄, C 프로그래밍 서적 2선



박재호박재호 jrogue@gmail.com

블로그 '컴퓨터 vs. 책'과 '프로젝트 관리'를 운영하고 있으며, "조엘 온 소프트웨어"를 비롯한 IT 전문서적 번역가로 활동 중이다.



2008년 2월 4일

온라인 서점에서 “C 프로그래밍 언어”라고 질의를 던지면 80권에 이르는 결과 목록이 쏟아져 나온다. “프로그래밍 언어”라는 이름 이외에 C 프로그래밍 언어를 다루는 다른 책이 있음을 고려할 때 C 관련 컴퓨터 서적이 얼마나 많은지 어림짐작할 수 있다. 그렇다면 C 프로그래밍 서적에서 가장 멋진 서적 두 권만 골라야 한다면 무엇을 뽑아야 할까? 최신 서적이 1년에 몇 권씩 새롭게 등장하는 이 시점에서 고개를 갸우뚱할지 모르겠지만 ‘구관이 명관’이라는 격언을 떠올리며 고전을 두 권 선택해보았다.


C 프로그래밍 언어 – 제2판

C 프로그래밍 언어 K&R 지음, 김석환 옮김, 대영서 2004년 출간

C 프로그래밍 언어의 아버지인 K&R(Kernighan & Ritchie)이 직접 쓴 이 책은 전 세계 30여 개 언어로 번역되어 있으며(http://cm.bell-labs.com/cm/cs/cbook/index.html), 1988년 초판이 나온 이래로 아마존에서 평균 별점 넷 반(245명이나 리뷰를 했다)을 기록하며 21세기로 접어든 요즘에도 스테디 셀러 자리를 놓치지 않고 있다(http://cm.bell-labs.com/cm/cs/cbook/sales.gif). 이 책이 때와 장소를 가리지 않고 프로그램 개발자에게 사랑 받는 이유가 궁금하지 않은가?

이 책은 얇은 분량(272쪽)임에도 불구하고 넘치지도 부족하지도 않은 중용의 도를 추구하는 특성이 있다. 구질구질하고 중언부언하는 설명 없이 필요한 내용만 간결하고 명확하게 설명하기 때문에 어떻게 보면 유닉스 매뉴얼 페이지를 닮았다는 오해도 많이 받으며 그 결과 초보자 용이 아닌 중급자 용이라고 비평이 쏟아지기도 한다.

이런 비평을 받았지만 C 프로그래밍 언어를 제대로 한번 파보겠다는 개발자 도전 정신이 꺾인 것 같지는 않다. 『C 프로그래밍 언어 – 제2판』이야 말로 C 프로그래밍 언어로 C 프로그래밍 언어와 C 프로그래밍 언어를 둘러싼 주변 환경을 재귀적으로 멋지게 설명하는 데 성공한 유일한 책이기 때문이다.

프로그래머 관점에서 이 책이 충격적으로 다가오는 이유는 예제 하나하나가 유닉스, 알고리즘, 컴파일러 제작에 필요한 기초적인 파서와 심볼 테이블, C 프로그래밍 내부 라이브러리와 같이 핵심 프로그래밍 기법을 속 시원하게 다루기 때문이다. 기존 프로그래밍 언어 서적이 모두 초보자를 위한답시고 현실과 아예 동떨어지고 자주 사용하지 않는 예제만 반복하는 반면에, 이 책은 알아두면 삶에 도움이 되는 주옥 같은 예제를 곳곳에 심어 두었다. 책 초반과 중반에 간략하게 문자열 비교(strcpy, strcmp) 라이브러리를 배열과 포인터를 동원해 간략하게 구현하는 방법, C 라이브러리에 들어있는 정렬(qsort)을 재귀 호출로 간략하게 구현하는 방법, 유닉스 계열에서 사용하는 명령어(cat이나 find)를 간략하게 구현하는 방법을 다룸으로써 C 라이브러리 자체와 유닉스 운영체제에 대한 이해를 높이고 있다. 이 책의 백미라고 볼 수 있는 마지막 장에는 C 언어가 유닉스와 인터페이스하는 통로가 되는 굵직굵직한 표준 I/O 라이브러리(fopen, getc) 구현 예제와 디렉터리 탐색(opendir/readdir), 메모리 할당(malloc/free) 예제까지 설명과 곁들여 나오므로 C 프로그래밍 언어 구문뿐만 아니라 C 프로그래밍 언어를 둘러싼 라이브러리 설계 사상을 엿보는 중요한 계기를 제공한다.

이렇게 C 프로그래밍 언어 자체를 벗어나 주변 환경까지 다루기 때문에 설명이 무겁고 딱딱하고 재미없다고 생각하면 오산이다. 예를 들어, C 프로그래머가 어려워하는 포인터를 설명하기 위해 그림이나 예제에 의존하는 대신, 포인터를 읽는 방법을 통해 차이점을 알려주는 부분에서 포인터 구문을 넣으면 영어로 읽는 방법을 알려주는 저자들의 재치가 돋보이는 예제가 나온다. 포인터를 정확하게 읽는 방법을 설명함으로써 포인터 의미를 확실하게 깨닫게 해주는 동시에 포인터를 읽는 방법을 구현하는 구체적인 예를 제시함으로써 lex를 사용하지 않고서도 C 프로그래밍 언어만으로 간단한 파서를 작성하는 방법까지 알려주므로 꿩도 잡고 알도 먹는 일석이조를 노리고 있다는 생각이다. 이렇듯 이론적인 내용과 실용적인 내용을 적절히 분배하는 집필 방법이 예사롭지 않다.

혹시 C 프로그래밍 언어로 프로그램을 만들면서 아직 이 책을 보지 않았다면 C 프로그래밍 언어를 뒷받침하는 사상을 이해하기 위해 반드시 읽어보기 바란다.



위로



C 함정과 실수: C Traps and Pitfalls

C 함정과 실수: C Traps and Pitfalls Andrew Koenig 지음, 윤지은 옮김, 피어슨애듀케이션 코리아 2004년 출간

요즘 C99와 C0X라는 최신 표준안까지 나온 상황에서 고전 C(pre ANSI C)와 ANSI C를 동시에 다루는 케케묵은 이 책을 뽑은 이유가 무척 궁금할 것이다. 실제로 본문을 읽다 보면 (C99와 C0X를 100% 지키는 C 컴파일러를 찾으러 다니는 요즘 상황과 유사하긴 하지만) “ANSI C 컴파일러가 아직 완벽하지 않아서”라는 이야기도 나오고, (여전히 윈도우와 유닉스를 번갈아 가면서 프로그램을 만드는 개발자에게는 당연한 현상이겠지만) C 컴파일러 구현과 구식 하드웨어 제약으로 인한 황당한 현상을 설명하는 내용도 나오므로 읽어야 할 고전이 아니라 버려야 하는 고전이 아닐까 하는 걱정도 들기 시작할 테다.

일단 이 책을 펴서 읽는 순간 이런 걱정은 기우임이 드러난다. C 프로그래밍 언어를 정교하고 정확하게 사용하는 방법이 아니라 아둔하고 어리석게 사용하지 않는 방법을 다루기 때문에 때와 장소를 초월하는 생명력을 얻었다는 생각이다. C 프로그래밍 언어가 완전히 바뀌지 않는 이상 예전에 저질렀던 실수를 요즘도 저지르기 마련이므로, 결국은 누가 실수를 적게 하느냐가 프로그램 완성도를 높이는 지름길이다. 이 책에는 이런 지름길로 가는 열쇠가 숨겨져 있다.

『C 프로그래밍 언어 – 제2판』과 마찬가지로 『C 함정과 실수』 역시 147쪽 분량으로 아주 얇으므로 마음 먹기에 따라 출퇴근 시간을 투자해 일주일이면 독파가 가능하다. 물론 직접 예제를 풀어보고 저자와 함께 고민을 해본다면 좀더 느긋하게 시간을 잡고 읽어야 하겠지만 말이다. 책 자체를 그냥 재미로 읽고 넘어가도 되지만 제 맛을 느끼려면 반드시 각 장 끝에 나오는 예제를 직접 풀어보기 바란다. 책 마지막 장(8장)에 모든 문제에 대한 모범 답안이 빠짐없이 나오므로 직접 푼 답과 비교하면 여러 가지 흥미로운 사실을 스스로 깨달을 수 있을 것이다.

이 책의 가장 큰 미덕은 바로 C 프로그래밍 과정에서 일어나는 실수와 경험담을 구체적으로 서술하는 데 있다. 일상 생활에서 흔히 저지르기 쉬운 실수를 예제를 위한 예제에서 벗어나 과거 날고 기던 개발자가 실제로 저지른 예제로 설명하고 있기 때문에 현장감이 그대로 느껴진다. 물론 요즘 최신 컴파일러를 사용할 경우 이 책에서 나오는 여러 가지 오류를 컴파일 시점에서 한방에 찾아내주기 때문에 이 책에서 소개하는 실수를 저지를 확률이 많이 줄어들었지만, 정상적으로 보이는 코드에 우리 생각과 달리 컴파일러가 오류가 있다고 알려주는 이유가 궁금했던 개발자라면 이 책에서 한 수 배우는 재미가 쏠쏠할 것이다. 특히 포인터나 off-by-one 오류를 다루는 내용은 현존하는 어느 책보다 더 정확하게 핵심을 찌르기에 초급에서 중급으로 한 단계 상승하려는 목표로 이 책을 고른 개발자라면 시간을 충분히 투자해 이 부분을 반드시 짚고 넘어가기 바란다.

   소셜 북마크

   mar.gar.in mar.gar.in
    digg Digg
    del.icio.us del.icio.us
    Slashdot Slashdot

이 책을 제대로 읽으려면 『C 프로그래밍 언어 – 제2판』에서 소개하는 C 프로그래밍 언어 특성은 물론이고, 컴퓨터 아키텍처와 C 프로그래밍 언어 표준화 작업에 대해 어느 정도 감을 잡고 있어야 한다. C 프로그래밍 언어를 처음 배우는 개발자가 섣불리 이 책을 읽을 경우 어디서 웃어야 할지 어디서 울어야 할지 모르는 따분한 희비극을 보는 기분이 들지도 모른다. 예를 들어, 책 초반에 “(*(void(*)())0)();”이 의미하는 바를 체계적으로 조목조목 설명하는 내용이 나오는데, 포인터에 대해 충분히 이해하고 있지 못하면 아무리 좋은 설명도 무용지물이 되어버릴 가능성이 높다.

개발자에 따라 코드가 맞지 않을 가능성이 높은 책이기에 구입하기 앞서 맛보기를 위해 http://www.literateprogramming.com/ctraps.pdf를 읽어보기 바란다.




위로


[지난 developerWorks Column 보기]


사이트 여행

dW 커뮤니티
포럼 | 블로그 | Spaces
dW Student Community

로컬 컨텐츠

행사 및 세미나

기획 기사

개발자 입문

튜토리얼 및 교육

TOP 10 인기자료

SW 다운로드

RSS 피드

뉴스레터
  
자바스크립트가 작동이 중지되었습니다. 이 기능을 수행하시려면 브라우저에서 자바스크립스트를 작동시켜 주시거나 이곳을 클릭해주세요.
Special offers
IBM SOA Sandbox 시험판
dW Student Community
로보코드
코드 트레이닝


    IBM 소개 개인정보 보호정책 문의